Vue的provide/inject,mixins混入,slot插槽用法学习

博客介绍了Vue相关知识。provide和inject配合使用,可让祖先组件向子孙后代注入依赖;mixins选项接受混入对象数组,混入生命周期函数时会先调用混入的;slot插槽用于组件模板内容分发,有不带name和带name两种情况,v-slot命令使用有特定限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.provide / inject

(1)provide和inject需要一起使用,以允许其祖先组件向其所有子孙后代注入一个依赖,不论层次有多深

(2)provide 选项应该是一个对象或返回一个对象的函数。该对象包含可注入其子孙的属性;

element的form里面代码如下:

element的formItem的代码如下:


(3)inject 选项应该是 一个字符串数组 或者一个对象,

在element的input中的代码如下:在input中,使用this.elForm即可得到当前form的this,使用this.elFormItem可获取到当前formItem的this。

2.mixins(混入)

mixins 选项接受一个混入对象的数组;例如element中的formItem中的emitter;


emitter对应的值为:

这样在formItem中,可以通过this.dispatch()调用dispatch方法,可以通过this.broadcast()调用broadcast方法;相当于formItem组件的methods中增加了dispatch和broadcast方法;

tip: 如果混入的是生命周期函数,则会先调用混入的生命周期函数,在调用组件自身的生命周

期函数。

3.slot插槽的用法

(1)<slot> 元素作为组件模板之中的内容分发插槽。<slot> 元素自身将被替换。一个不带 name 的 <slot> 出口会带有隐含的名字“default”。

(2)没有name的slot:

如果组件a为:


则使用a组件的时候,a组件包裹的内容将替换<slot></slot>;如下图:<button>测试按钮</button>将替换slot;


(3)有name的slot:

如果组件a为:

则使用a组件的时候,只有使用v-slot:testSlot时,a组件包裹的内容将替换<slot name="testSlot"></slot>;如下图:<button>测试按钮</button>将替换slot;


tip: v-slot命令只能用于component或者template;


### Vue.js 中 `provide` 和 `inject` 的用法Vue.js 中,`provide` 和 `inject` 是一种用于跨组件传递数据的方式。这种方式特别适合于父子组件之间多层嵌套的情况下,避免逐级通过 props 或事件来传递数据。 #### 基本概念 - **Provide**: 父组件可以提供变量给后代组件。 - **Inject**: 后代组件可以从祖先组件注入被提供的变量。 这种机制类似于依赖注入,在大型应用中非常有用,因为它减少了显式的 prop 和 event 链接的需求[^1]。 #### 使用示例 下面是一个简单的例子展示如何使用 `provide` 和 `inject`: ```javascript // 父组件 (ParentComponent.vue) export default { data() { return { message: 'Hello from parent!' }; }, provide() { return { sharedMessage: this.message }; } }; // 子孙组件 (ChildComponent.vue) export default { inject: ['sharedMessage'], mounted() { console.log(this.sharedMessage); // 输出: Hello from parent! } }; ``` 在这个例子中,父组件通过 `provide` 提供了一个名为 `sharedMessage` 的属性,而子孙组件则通过 `inject` 注入了这个属性并可以在其生命周期钩子函数中访问它。 #### 动态更新 Provide 数据 如果希望 `provide` 出的数据能够动态响应变化,则需要借助 Vue 的响应式特性。可以通过返回一个对象或者绑定到 `this` 来实现这一点。 ```javascript // 父组件 (DynamicParentComponent.vue) import { reactive } from 'vue'; export default { setup() { const state = reactive({ count: 0 }); function increment() { state.count++; } return { state, increment }; }, provide() { return { counterState: this.state, incrementCounter: this.increment }; } }; // 子孙组件 (DynamicChildComponent.vue) export default { inject: ['counterState', 'incrementCounter'], mounted() { console.log(this.counterState.count); // 初始值为 0 this.incrementCounter(); console.log(this.counterState.count); // 更新后的值为 1 } }; ``` 在此案例中,不仅提供了状态还提供了修改该状态的方法,使得子孙组件可以直接调用方法改变共享的状态。 #### 注意事项 当使用 `provide` 和 `inject` 时需要注意以下几点: - 被提供的属性不会自动成为响应式的,除非像上面那样手动处理。 - 它们适用于跨越多个层次结构的情况;对于简单的一对一关系,推荐继续使用 Props 和 Events[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值