inject()
是 Vue.js 中用于依赖注入的核心函数,主要用于在组件树中接收由上层组件通过 provide()
提供的数据或方法。它是 Vue 提供的一种种组件间通信方式,尤其适用于深层嵌套组件之间的数据传递,避免了传统“props 层层传递”的繁琐。
基本用法
上层组件通过
provide()
提供数据:
在父组件(或更上层组件)中,使用provide()
定义需要共享的数据或方法:import { provide } from 'vue'; export default { setup() { // 提供一个值 provide('theme', 'dark'); // 提供一个方法 const changeTheme = () => { /* ... */ }; provide('changeTheme', changeTheme); } };
下层组件通过
inject()
接收数据:
在任意深层子组件中,使用inject()
获取上层提供的数据:import { inject } from 'vue'; export default { setup() { // 接收提供的值 const theme = inject('theme'); // 'dark' // 接收提供的方法 const changeTheme = inject('changeTheme'); return { theme, changeTheme }; } };
核心作用
- 跨层级组件通信:解决了多层嵌套组件间的数据传递问题(无需通过中间组件逐层传递 props)。
- 共享全局配置:常用于提供全局状态(如主题、用户信息、权限等),让任意组件都能便捷访问。
高级用法
设置默认值:
当inject()
找不到对应 key 时,可以指定默认值:// 若上层未提供 'theme',则使用 'light' 作为默认值 const theme = inject('theme', 'light');
使用 Symbol 作为 key:
为避免 key 冲突(尤其是在多人协作或使用第三方库时),推荐用 Symbol 作为注入 key:// symbols.js export const themeKey = Symbol('theme'); // 父组件 import { provide } from 'vue'; import { themeKey } from './symbols.js'; provide(themeKey, 'dark'); // 子组件 import { inject } from 'vue'; import { themeKey } from './symbols.js'; const theme = inject(themeKey);
响应式注入:
若需要注入的数据具有响应式(数据变化时触发组件更新),可结合ref
或reactive
使用:// 父组件提供响应式数据 import { provide, ref } from 'vue'; const theme = ref('dark'); provide('theme', theme); // 子组件接收后可直接使用响应式特性 const theme = inject('theme'); console.log(theme.value); // 'dark'(注意 .value 访问)
注意事项
- 注入时机:
inject()
只能在组件的setup()
函数或<script setup>
中使用。 - 单向数据流:与 props 类似,注入的数据默认是“只读”的(子组件不应直接修改,应通过调用上层提供的方法修改)。
- 与 Vuex/Pinia 的区别:
provide/inject
更轻量,适用于简单场景;而状态管理库适用于复杂全局状态的管理(带状态追踪、模块化等功能)。
总结:inject()
是 Vue 中实现依赖注入的关键函数,通过与 provide()
配合,能高效实现跨层级组件通信,简化深层嵌套场景下的数据传递逻辑。