vue 组件传值provide和inject
应用场景
当组件嵌套的层级过多时,通过prop将父组件的属性层层传递给后代组件,明显是繁琐而又低效的,vue提供了provide和inject,能够将父组件中的属性直接让所有后代组件访问到
与$parent相比用什么好处
1.不用暴露整个parent组件实例对象
2.可以渗透到多个层级的组件,只要是后代组件都可以获取,而$parent只能是直系后代获取,多个层级后代组件就只能$parent.$parent...
一些问题
在子组件中vue仍然像props一样不允许子组件直接修改inject中的项的值
代码示例
父级中的provide定义语法
2 //第一种,直接以对象的方式定义 3 //优点:方便 4 //缺点:无法访问当前的this 5 //适用场景:传递静态数据 6 provide: { 7 test: "测试 定义方式1 以对象的形式定义", 8 }, 9 //第二种,使用工厂函数定义 10 //优点:能够直接访问当前this可以传递动态数据 11 //适用场景: 适用与绝大多数场景,除非你传递的数据全部都是静态数据 12 provide() { 13 return { 14 test: this.test, 15 }; 16 }, 17 data() { 18 return { 19 test: "test", 20 }; 21 },
子组件使用inject接收
<template> <div class="index"> <!-- 像使用data中的熟悉一样使用inject属性 --> <div class="">我是children==={{ test }}</div> <subw></subw> </div> </template> <script> import subw from "./sub.vue"; export default { components: { subw }, //第一种方式:直接使用数组形式接收 //缺点:不能定义默认值,inject中定义的字段,父组件provide中就必须要定义,否则就会报错 inject: ["test"], //第二种:使用对象的方式 //优点:能够定义默认属性,定义默认属性之后,即便父组件中没有在provide定义对应的属性,vue也会认为它是合法的,在使用时会自动使用默认属性 inject: { test: { //你可以直接这样定义一个基本类型的值作为默认值 default: "parent prov", //如果你想使用引用类型的值作为默认值的话,那么你就要定义一个工厂函数来返回他 default: () => { //一个数组作为默认值 return new Array(); //一个object作为默认值 return new Object(); //一个方法作为默认值 return function () {}; }, //如果父组件的provide定义的属性字段为test,而子组件中data存在一个test字段, //此时子组件再将inject的接收字段定义为test的话。调用this.test就会出现冲突,所以子组件inject中可以定义与provide中不同的字段来接收,只需要将from接收来源指定为provide中的目标字段即可 from: "test2", }, }, created() { // 像使用data中的熟悉一样使用inject属性 console.log(this.test); }, }; </script>