<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script src="https://cdn.bootcss.com/vue/2.4.2/vue.js"></script> </head> <body> <div class="home"> <div>{{title}}</div> <mytest :title="title" :massgae="massgae" :xixi='xixi'></mytest> </div> <script> var vm = new Vue({ el: '.home', data: { title:'title1111', massgae:'message111' }, computed: { xixi: function () { return 'xixi' } }, components:{ 'mytest':{ template:`<div>這是個h1標題{{title}}</div>`, props:['title'], data(){ return{ mag:'111' } }, created:function(){ console.log('>>>>>>>>>>>', this.$attrs)//注意這里 } } } }) </script> </body> </html>
打印出來
>>>>>>>>>>> {massgae: "message111", xixi: "xixi"}
繼承父組件沒有使用的屬性,就算當前組件沒有通過props傳遞進來,當前組件依然可以通過$atrrs取到message的值。
但是必須要屬性傳遞
組件內未被注冊的屬性將作為普通html元素屬性被渲染
在Vue2.4.0,可以在組件定義中添加inheritAttrs:false,組件將不會把未被注冊的props呈現為普通的HTML屬性。但是在組件里我們可以通過其$attrs可以獲取到沒有使用的注冊屬性,如果需要,我們在這也可以往下繼續傳遞。
重點 穿透屬性傳遞
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script src="https://cdn.bootcss.com/vue/2.4.2/vue.js"></script> </head> <body> <div class="home"> <div>{{title}}</div> <Component-b :massgae='massgae'></Component-b> <mytest :title='title' :massgae='massgae'></mytest> </div> <script> var vm = new Vue({ el: '.home', data: { title:'title1111', massgae:'message111' }, computed: { xixi: function () { return 'xixi' } }, components: { 'ComponentB': { template: `<div>B<component-c v-bind="$attrs"></component-c></div>`, // inheritAttrs: false, components: { 'ComponentC': { props: ['massgae'], template: '<div>C{{massgae}}</div>', created:function(){ console.log('>>>>>>>>>>>', this.massgae)//注意這里 } } } } } // components:{ // 'mytest':{ // template:`<div>這是個h1標題{{title}}</div>`, // props:['title'], // inheritAttrs: false, // data(){ // return{ // mag:'111' // } // }, // created:function(){ // console.log('>>>>>>>>>>>', this.$attrs)//注意這里 // } // } // } }) </script> </body> </html>
只需要中間組件 調用孫子組件的時候傳遞一個 v-bind=‘$attrs’ 孫子組件就可以直接 props[] 接受 也可以 this.$attrs[屬性名字] //1.父元素必須傳遞元素 //中間元素props過的屬性 就不會傳遞下去
關於繼承屬性開關 還是很有用的
// inheritAttrs: false, //父作用域調用子組件 子組件內部有模板 那么父組件傳遞的屬性 會覆蓋子組件標簽上的屬性 這就是繼承
$listeners
這個用法和$attrs正好相反 是像外觸發事件的中間層綁定一個 v-on='listeners'就可以了
<template> <div> <childcom :name="name" :age="age" :sex="sex" @testChangeName="changeName"></childcom> </div> </template> <script> export default { 'name':'test', props:[], data(){ return { 'name':'張三', 'age':'30', 'sex':'男' } }, components:{ 'childcom':{ props:['name'], template:`<div> <div>我是子組件 {{name}}</div> <grandcom v-bind="$attrs" v-on="$listeners"></grandcom> </div>`, components: { 'grandcom':{ template:`<div>我是孫子組件-------<button @click="grandChangeName">改變名字</button></div>`, methods:{ grandChangeName(){ this.$emit('testChangeName','kkkkkk') } } } } } }, methods:{ changeName(val){ this.name = val } } } </script>
’