vue3的依赖注入

一、provide函数(在父组件中调用)

为后组件提供数据,但是需要确保是在setup生命周期中调用的

provide函数具有两个参数,第一个参数是注入名,第二个参数是注入值

二、inject函数(在想用数据的组件中使用inject函数接收调用)

inject中的参数就是我们在provide中的注入名

三、注意

1.值得注意的是我们通过provide+inject可以很方便的使用祖先组建的数据,但是调用的时候必须是定义provide函数数据的组件的后代组件可以用inject函数调用其中的数据

2.provide中数据的值的类型如果是ref,那么在inject中的类型仍然为ref为响应式的,如果数据一开始就不是响应式的,那么在调用的时候也不会是响应式的

### 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、付费专栏及课程。

余额充值