1. 程式人生 > >多級元件巢狀傳遞資料,$attrs和inheritAttrs用法

多級元件巢狀傳遞資料,$attrs和inheritAttrs用法

我們在vue的父子元件傳值的時候,我們先在需要的子元件上用props註冊一些屬性,然後父元件呼叫的時候當屬性來傳值。
如果我們給child傳props沒有註冊的屬性,我們就要用$attrs來取了。

現有父元件A和子元件B:
元件A的內容如下:

<template>
    <div>我是父元件
        <B :w1="hello" :w2="world" :w3="lisa"></B>
    </div>
</template>
<script>
import B from './myB'
export default { components:{B}, data(){ return{ hello:'hello', world:"world", lisa:"myname" } } }
</script>

元件B的內容如下:

<template>
    <div>
        我是子元件{{w1}}
    </div>
</template>
<script>
export
default { props:["w1"], inheritAttrs:false, data(){ return{ } }, mounted(){ console.log(this.$attrs) } }
</script>

元件B只匯出了w1,在元件A中呼叫時,多了幾個屬性w2,w3,在元件B中可以使用console.log(this.$attrs)檢視非prop屬性,結果為一個物件{w2: “world”, w3: “myname”}
但是在控制檯看到B元件的根元素div上出現了這兩個屬性,顯示結果為:
<div w2=“world” w3=“myname”>


如果想要去除這兩個屬性,可以在子元件中新增inheritAttrs:false
格式如下:

export default {
    props:["w1"],
    inheritAttrs:false,
    data(){
			return{}
		}
    }

inheritAttrs

inheritAttrs:false,如果你不希望元件的根元素繼承特性,你可以在元件的選項中設定,這尤其適合配合例項的 $ attrs 屬性使用,該屬性包含了傳遞給一個元件的特性名和特性值。
1.inheritAttrs預設為true,即允許繼承的意思,如果設為false,即禁止繼承。
2.$attrs為元件標籤內沒有在元件內用props宣告的屬性(除了style和class)

小結:
$ attrs
$ attrs儲存非prop特性,$attrs繼承所有的父元件屬性,但是除了prop傳遞的屬性,style和class
inheritAttrs
inheritAttrs控制vue對非prop特性的預設行為。預設為true,繼承所有的父元件屬性(除props的特定繫結)作為普通的HTML特性應用在子元件的根元素上,如果你不希望元件的根元素繼續特性設定inheritAttrs:false,但是class屬性會繼承。

多級元件傳遞資料

現有A,B,C三個元件依次巢狀,示例:
在這裡插入圖片描述

A到B可以通過props的方式向子元件傳遞值,如果A元件與C元件之間通過怎麼辦呢?
A和C之間屬於跨多級的元件巢狀關係,要解決這一問題可以使用 $ attrs解決。

在元件C中,程式碼如下:

<template>
<!-- 有兩個值,c1是去A元件中獲取值,bb是去B元件中獲取值 -->
  <div>我是元件C,我要說"{{c1}}",我給B發訊息{{bb}}</div>
</template>
<script>
export default {
  // 通過props到處變數bb,c1
  props: ["bb", "c1"],
  data() {
    return {};
  }
};
</script>

在元件B中程式碼如下:

<template>
  <div>
    我是B元件,我要說“{{b1}}”
    <!-- 給元件C的bb賦值 -->
    <C :bb="bb"></C>
  </div>
</template>
<script>
// 匯入元件C
import C from "./C";
export default {
  inheritAttrs: false,//禁止繼承父元件的非prop屬性
  props: ["b1"],//匯出變數b1
  components: { C },//註冊元件C
  data() {
    return {
      bb: "你好"
    };
  }
};
</script>

在元件A程式碼中:

<template>
  <div>
    我是元件A的內容
    <!-- 呼叫元件B 使用$attrs繫結非prop屬性,並給屬性賦值-->
    <B :c1="c1" :b1="b1" v-bind="$attrs"></B>
  </div>
</template>
<script>
import B from "./B";//匯入元件B
export default {
  components: { B },//註冊元件B
  data() {
    return {
      c1: "我是c",
      b1: "我是b"
    };
  }
};
</script>