<!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元素属性被渲染
<!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, //父作用域调用子组件 子组件内部有模板 那么父组件传递的属性 会覆盖子组件标签上的属性 这就是继承
这个用法和$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>
’
原文:https://www.cnblogs.com/-constructor/p/12856354.html