Vue3依赖注入

Vue3使用provide和inject实现父组件向子组件的数据传递,可以在全局或组件层级进行注入。子组件通过inject接收并使用父组件提供的数据,当有全局和局部注入冲突时,优先使用最近父组件的数据。

Vue3依赖注入

vue3中数据的依赖注入是通过provide和inject实现的,provide负责在父级组件中提供一个要传递给子组件的值,inject负责在子组件中接收父组件提供的值。

父子组件传参

父组件通过provide提供值

<script>
import { provide, reactive } from 'vue'
import Child from './components/Child.vue'
export default {
  components: { Child },
  setup() {
    const obj = reactive({ name:'高启强' })

    // 将obj提供给所有子组件使用
    provide('name', obj.name)
  }
}
</script>

子组件通过inject接收值

<script>
import { inject } from 'vue'
export default {
  setup() {
    const name = inject('name')

    console.log(name);  // 高启强
  }
}
</script>

全局公共注册

如果想要注册全局任何组件都可以用的数据,可以通过app.provide进行全局注入。如果父组件和全局中有名称一样的数据注入时,会使用和当前组件最近的父组件中的数据。

在全局中通过app.provide注入数据

mian.js

import { createApp } from 'vue'
import App from './App.vue'

const app = createApp(App)
// 通过app.provide注入
app.provide('appVersion', '1.0.0')
app.provide('appName', '京海市监狱管理系统')

app.mount('#app')

在父组件中通过provide注入数据

App.vue

<script>
import { provide } from 'vue'
import Child from './components/Child.vue'
export default {
  components: { Child },
  setup() {
    // 将obj提供给所有子组件使用
    provide('appVersion', '2.0.0')
  }
}
</script>

在子组件中通过inject获取数据

src/components/Child.vue

<script>
import { inject } from 'vue'
export default {
  setup() {
    const appVersion = inject('appVersion')
    const appName = inject('appName')
		
    console.log(appName);     // 京海市监狱管理系统
    // 如果父组件和全局中有名称一样的数据注入时,会使用和当前组件最近的父组件中的数据
    console.log(appVersion);  // 2.0.0 
  }
}
</script>
### Vue3 依赖注入的使用方法与示例 #### 提供依赖 (Provide) 在 Vue3 中,`provide()` 方法用于向上层组件提供数据或功能。这些提供的内容可以通过 `inject()` 在下级组件中获取。 以下是通过 `provide()` 向整个应用程序提供全局变量的例子: ```javascript // main.js import { createApp } from &#39;vue&#39;; import App from &#39;./App.vue&#39;; const app = createApp(App); // 提供一个名为 &#39;appMessage&#39; 的全局变量 app.provide(&#39;appMessage&#39;, &#39;Hello from Vue App!&#39;); app.mount(&#39;#app&#39;); ``` 在这个例子中,`app.provide(&#39;appMessage&#39;, &#39;Hello from Vue App!&#39;)` 将字符串 `&#39;Hello from Vue App!&#39;` 注入到整个应用上下文中[^2]。 如果需要更复杂的对象作为依赖项,则可以在供给方组件中定义并传递该对象: ```javascript // ParentComponent.vue <script> import { provide, reactive } from &#39;vue&#39;; export default { setup() { const state = reactive({ count: 0, increment() { state.count++; }, }); // 提供状态给子组件 provide(&#39;state&#39;, state); return {}; } }; </script> ``` 在此代码片段中,我们创建了一个响应式的 `state` 对象,并将其通过 `provide()` 方法共享给后代组件[^1]。 #### 获取依赖 (Inject) 相对应地,在任何后代组件中都可以利用 `inject()` 来访问由父辈组件所提供的资源。下面展示如何接收上述提到的状态信息: ```html <!-- ChildComponent.vue --> <template> <div> Count is: {{ state.count }} <button @click="increment">Increment</button> </div> </template> <script> import { inject } from &#39;vue&#39;; export default { setup() { const state = inject(&#39;state&#39;); function increment() { state.increment(); } return { state, increment }; } }; </script> ``` 这里展示了如何从上级组件引入已有的 `state` 并调用其内部的方法来改变数值[^4]。 另外需要注意的是,当使用 TypeScript 开发时,为了获得更好的类型支持和错误提示,推荐为键名指定特定类型的常量而不是简单的字符串字面量。例如: ```typescript // keys.ts import { InjectionKey } from &#39;vue&#39;; export const MyStateSymbol: InjectionKey<MyType> = Symbol(); function useProvider() { provide(MyStateSymbol, someValue as MyType); } function useInjector() { const value = inject(MyStateSymbol)!; } ``` 这种方式不仅提高了可维护性和安全性,还使得重构变得更加容易[^3]。 #### 注意事项 - **单向数据流动**:虽然能够向下传播属性,但是不应该尝试去更改来自上层的数据副本——这违背了 Vue 的设计理念之一即保持清晰的一致性模型。 - **性能考量**:过度频繁或者复杂度高的依赖关系可能会影响渲染效率;因此建议仅限于必要场合才采用此技术手段。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值