还有另一种将数据更改从子节点传递到父节点的方法,它使用provide-inject 方法。父组件为子组件“提供”数据或方法,然后将该数据或方法“注入”到子组件中 - 但它也可用于触发父组件中的方法并传递参数。
当有一个恰好嵌入到多个其他组件中的子组件时,这种方法特别有用。此外,在大型项目中必须注意不要丢失provide 和inject 用法的概述。
父(顶级)组件示例App.vue 使用provide 来访问它的方法updateParentValue(如果提供了方法而不是数据,provide 的形式为一种方法):
<template>
<h2>App.vue, parentValue is: <em>{{ parentValue }}</em></h2>
<ChildComponent1 />
</template>
<script>
import ChildComponent1 from "./components/ChildComponent1.vue";
export default {
data() {
return {
parentValue: "",
};
},
components: {
ChildComponent1,
},
provide() {
return {
updateParent: this.updateParentValue,
};
},
methods: {
updateParentValue($value) {
this.parentValue = $value;
},
},
};
</script>
本例中组件Component4.vue在“底部”,即App.vue包含Component1,Component1包含Component2...直到Component4实际利用inject获取访问权限然后调用父方法并传递参数$value(这里只是一个随机数):
<template>
<div>
<h2>ChildComponent4.vue</h2>
<button @click="updateParent(Math.random())">
Update parent value in App.vue
</button>
</div>
</template>
<script>
export default {
inject: ["updateParent"],
};
</script>
整个示例可用here。
Vue.js documentation