vue3--provide和inject

顶层组件向任意的底层组件传递数据和方法,实现跨层组件通信
一.跨层传递普通数据
1. 顶层组件通过provide函数提供数据
2. 底层组件通过inject函数获取数据
二.跨层传递响应式数据
在调用provide函数时,第二个参数设置为ref对象
三.跨层传递方法
顶层组件可以向底层组件传递方法,底层组件调用方法修改顶层组件中的数据
顶层组件代码
<script setup>
import {inject} from 'vue'


// 1.跨层传递普通数据
const themeColor = inject('theme-color')

// 2.跨层响应式数据
const count = inject('count')

// 3.跨层级传递函数=>给子孙后代传递可以修改数据的方法
const changeCount = inject('changeCount')
const clickFn =()=>{
    // count=1000不可以直接修改
changeCount(1000)
}
</script>
<template>
<div>
  <h3>我是底层组件 ---{{ themeColor }}-----{{count}}</h3>
  <button @click="clickFn">更新count</button>
</div>
</template>

中层组件代码

<script setup>
import BottomCom from './bottom-com.vue'
</script>
<template>
<div>
  <h2>我是中间组件</h2>
  <BottomCom></BottomCom>
</div>
</template>

底层组件代码

<script setup>
import {inject} from 'vue'


// 1.跨层传递普通数据
const themeColor = inject('theme-color')

// 2.跨层响应式数据
const count = inject('count')

// 3.跨层级传递函数=>给子孙后代传递可以修改数据的方法
const changeCount = inject('changeCount')
const clickFn =()=>{
    // count=1000不可以直接修改
changeCount(1000)
}
</script>
<template>
<div>
  <h3>我是底层组件 ---{{ themeColor }}-----{{count}}</h3>
  <button @click="clickFn">更新count</button>
</div>
</template>

### Vue2 Vue3 中 `provide` `inject` 的用法及区别 #### 一、Vue2 中的 `provide` `inject` 在 Vue2 中,`provide` `inject` 提供了一种跨层级组件通信的方式。父级组件可以通过 `provide` 向下提供数据,而子级组件则可以使用 `inject` 来接收这些数据。 ##### 使用方式 1. **父组件** 父组件通过 `provide` 属性来传递数据。需要注意的是,在 Vue2 中,`provide` 默认是非响应式的,除非显式地将其设置为响应式对象或绑定到响应式状态上。 ```javascript export default { data() { return { info: &#39;哈哈哈&#39;, }; }, provide() { return { info: this.info, // 将 info 数据向下传递 }; }, }; ``` 2. **子组件** 子组件通过 `inject` 属性来接收父组件提供的数据。支持两种形式:数组形式对象形式。 - **数组形式** ```javascript export default { inject: [&#39;info&#39;], mounted() { console.log("接收数据:", this.info); // 输出 "接收数据:哈哈哈" }, }; ``` - **对象形式** 如果需要指定默认值或重命名注入的数据,可以使用对象形式。 ```javascript export default { inject: { info: { from: &#39;info&#39;, // 映射到父组件提供的名称 default: &#39;default value&#39;, // 设置默认值 }, }, }; ``` #### 二、Vue3 中的 `provide` `inject` 在 Vue3 中,`provide` `inject` 被重新设计以更好地适应组合式 API,并且默认具有响应性。 ##### 使用方式 1. **父组件** 在 Vue3 中,`provide` 支持直接返回一个对象或将数据绑定到响应式状态上。如果希望保持响应性,应确保提供的数据是响应式的(例如通过 `ref` 或 `reactive` 创建)。 ```javascript import { ref, provide } from &#39;vue&#39;; export default { setup() { const info = ref(&#39;哈哈哈&#39;); // 响应式数据 provide(&#39;info&#39;, info); // 提供数据给后代组件 return { info }; }, }; ``` 2. **子组件** 子组件通过 `inject` 接收父组件提供的数据。同样支持多种语法糖。 - **基础用法** ```javascript import { inject } from &#39;vue&#39;; export default { setup() { const info = inject(&#39;info&#39;); // 注入数据 return { info }; }, }; ``` - **带默认值的形式** 如果未找到对应的关键字,可以为其设定默认值。 ```javascript import { inject } from &#39;vue&#39;; export default { setup() { const info = inject(&#39;info&#39;, &#39;默认值&#39;); return { info }; }, }; ``` #### 三、Vue2 Vue3 的主要区别 | 特性 | Vue2 | Vue3 | |--------------------------|----------------------------------------|---------------------------------------| | **API 形式** | Options API | Options API Composition API | | **响应性** | 非响应式 | 默认具备响应性 | | **复杂场景的支持** | 较弱 | 更强,适合复杂的逻辑抽取与复用 | | **性能优化** | 无 | 内部实现更高效 | 具体来说: - **响应性增强**[^4]:Vue3 中的 `provide` `inject` 自动支持响应式特性,无需额外操作即可使数据变化实时反映到所有依赖它的组件中。 - **Composition API 支持**[^3]:Vue3 新增了基于函数的组合式 API (`setup`),允许开发者将逻辑提取到独立的文件中以便复用。 - **错误提示改进**[^4]:当调用了不存在的 `inject` 关键词时,Vue3 会抛出清晰的警告信息;而在 Vue2 中可能只是静默失败。 #### 四、注意事项 无论是 Vue2 还是 Vue3,都应注意以下几点: - **滥用可能导致耦合度增加**:过度依赖 `provide`/`inject` 可能会使父子组件之间的关系变得隐晦难懂。 - **调试困难**:由于它是跨越多层组件的机制,定位问题可能会比较棘手。 --- ### 示例代码对比 #### Vue2 示例 ```javascript export default { data() { return { msg: &#39;Hello Vue2!&#39;, }; }, provide() { return { message: this.msg, }; }, }; ``` 子组件: ```javascript export default { inject: [&#39;message&#39;], mounted() { console.log(this.message); // Hello Vue2! }, }; ``` #### Vue3 示例 ```javascript import { defineComponent, reactive, provide } from &#39;vue&#39;; export default defineComponent({ setup() { const state = reactive({ msg: &#39;Hello Vue3!&#39; }); provide(&#39;state&#39;, state); return { ...state }; }, }); ``` 子组件: ```javascript import { defineComponent, inject } from &#39;vue&#39;; export default defineComponent({ setup() { const state = inject(&#39;state&#39;); return { state }; }, }); ``` --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值