Vue組件傳值(三)之 深層嵌套組件傳值 - $attrs 和 $listeners


$attrs

    包含了父作用域中不作為 prop 被識別 (且獲取) 的特性綁定 (class 和 style 除外)。當一個組件沒有聲明任何 prop 時,這里會包含所有父作用域的綁定 (class和 style 除外),並且可以通過 v-bind="$attrs" 傳入內部組件——在創建高級別的組件時非常有用。

$listener

    包含了父作用域中的 (不含 .native 修飾器的) v-on 事件監聽器。它可以通過 v-on="$listeners" 傳入內部組件——在創建更高層次的組件時非常有用。

 

    以上內容參考官網:https://cn.vuejs.org/v2/api/#vm-attrs

直接看使用代碼:

 1 在父組件當中,最外層組件
 2 
 3 <template>
 4     <div>
 5         <Child1 :child1Info="child1" :child2Info="child2" v-on:test1="onTest1" v-on:test2="onTest2">
 6         </Child1>
 7     </div>
 8 </template>
 9 <script>
10 import Child1 from './child1';
11 export default {
12     data() {
13         return {
14             child1:"hahha",
15             child2:"asdsdasd"
16         };
17     },
18     components: { Child1 },
19     methods: {
20         onTest1(msg) {
21             console.log('test1 running...',msg);
22         },
23         onTest2(msg) {
24             console.log('test2 running',msg);
25         }
26     }
27 };
28 </script>
 1 //在子組件中
 2 
 3 <template>
 4     <div class="child-1">
 5         <p>在子組件當中:</p>
 6         <p>props-child1Info: {{child1Info}}</p>
 7         <p>$attrs: {{$attrs}}</p>
 8         <hr>
 9         <!-- Child2組件中能直接觸發test的原因在於 B組件調用C組件時 使用 v-on 綁定了$listeners 屬性 -->
10         <!-- 通過v-bind 綁定$attrs屬性,Child2組件可以直接獲取到A組件中傳遞下來的props(除了child1組件中props聲明的) -->
11         <Child2 v-bind="$attrs" v-on="$listeners"></Child2>
12     </div>
13 </template>
14 <script>
15 import Child2 from './child2';
16 export default {
17     props: ['child1Info'],
18     data() {
19         return {};
20     },
21     components: { Child2 },
22     mounted() {
23         this.$emit('test1','嘻嘻');
24     }
25 };
26 </script>
 1 //在孫子組件當中:
 2 
 3 
 4 <template>
 5     <div class="child-2">
 6         <p>在最里層組件當中child2:</p>
 7         <p>props-child2Info: {{child2Info}}</p>
 8         <p> $attrs 的值: {{$attrs}}</p>
 9         <hr>
10     </div>
11 </template>
12 <script>
13 export default {
14     props: ['child2Info'],
15     data() {
16         return {};
17     },
18     mounted() {
19         this.$emit('test2','哈哈');
20     }
21 };
22 </script>

 


免責聲明!

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



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