vue 組件傳值provide與inject


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>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM