基础介绍

在 Vue.js 中,provide 和 inject 是一对用于跨层级组件通信的 API。它们主要用于父组件向深层嵌套的子组件传递数据,避免了通过 props 逐层传递的繁琐。

选项是API

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 父组件
export default {
provide: {
message: 'Hello from parent component'
}
}

// 子组件
export default {
inject: ['message'],
created() {
console.log(this.message); // 输出: Hello from parent component
}
}

组合式API

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// 父组件
import { provide, ref } from 'vue';

export default {
setup() {
const message = ref('Hello from parent component');
provide('message', message);

return {
message
};
}
}

// 子组件
import { inject } from 'vue';

export default {
setup() {
const message = inject('message');
console.log(message.value); // 输出: Hello from parent component

return {
message
};
}
}

provide 和 inject 的特点

  1. 跨层级传递:provideinject 允许父组件向任意深度的子组件传递数据,而不需要通过中间的每一层组件。
  2. 响应式数据:如果 provide 提供的是响应式数据(如 ref 或 reactive),那么子组件通过 inject 接收的数据也会是响应式的。
  3. 非响应式数据:如果 provide 提供的是普通的数据(如字符串、数字等),那么子组件接收的数据将是非响应式的。
  4. provide 和 inject 主要用于高阶插件或组件库的开发,普通应用开发中应尽量避免过度使用,以免导致组件之间的耦合度过高。
  5. inject 的值是只读的,子组件不应该直接修改 inject 的值。如果需要修改,可以通过 provide 提供一个方法来实现。