vue進階之vm.$attrs/$listeners


<!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>

 

 

listeners


免責聲明!

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



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