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>