1. 程式人生 > >Vue元件中值的傳遞

Vue元件中值的傳遞

 Vue元件中值是如何傳遞的?

一、父子元件傳值

1. 在Vue的官方文件中通過prop向子元件傳遞資料有講解

下面圖片是我對Vue元件傳值的理解

(1)Vue例項中的資料data——>posts陣列儲存資料,可以通過元件標籤<my-componetn>中的v-for迴圈得到posts陣列的每個物件,然後通過v-bind將物件資料繫結在元件標籤<my-component>自定義的屬性名上(title、content)

(2)元件標籤<my-component>從Vue例項中獲取的資料,可以傳給元件例項的props陣列中,並且用相同的屬性名去接收資料

(3)元件模板中的標籤可以使用props中的屬性

2. 當要傳的值很多的時候,props中接收的就不僅僅是“title”、“content”,還可能有name、age、等等自定義的屬性,那樣豈不是更麻煩?所以將整個物件傳遞給元件

    <div id="component-demo">
        <my-component v-for="post in posts" v-bind:post="post"></my-component>
    </div>
    <script src="./vue.js"></script>
    <script>
        Vue.component('my-component',{
            props: ['post'],
            template: `
                <div>
                    <h3 class=".title">{{post.name}}</h3>
                    <div class=".content">{{post.age}}</div>
                </div>               
            `,
        })
        new Vue({
            el: "#component-demo",
            data:{
                posts: [
                    {name:'zhu',age:22}
                ]
            },
        })
    </script>

注意:傳遞的步驟是不變的,只是處理的屬性名有所改變。

3. 向元件標籤傳遞資訊或者指令,從而使元件觸發一些事件

    <div id="component-demo">
        <my-component v-for="post in posts" v-bind:post="post" :count="count" v-on:add-count="count++"></my-component>
        
    </div>
    
    <script>
        Vue.component('my-component',{
            props: ['post','count'],
            template: `
                <div>
                    <h3 class=".title">{{post.name}}</h3>
                    <div class=".content">{{post.age}}</div>  
                    <button v-on:click="$emit('add-count')">you click {{count}} times</button> 
                </div>               
            `,
        })
        new Vue({
            el: "#component-demo",
            data:{
                count: 0,
                posts: [
                    {name:'zhu',age:22}
                ]
            },
        })
    </script>

 元件結構中的button標籤可以通過$emit將點選事件和自定義事件“add-count”關聯起來,“add-count”事件在元件標籤<my-component>中監聽,這就是:通過元件結構內的標籤向元件標籤傳遞資訊或者指令(不是傳遞資料)

需要注意的是:

(1)html標籤不區分大小寫,而

內部是區分大小寫的,所以不能大小駝峰命名:addCount

(2)props接收了data下posts中的每個物件post,同時也可以接收data下的count值,注意值在元件中的傳遞

(3)Vue例項中所用的所有資料變數名,都要在data物件中申明

3.1 除了傳遞指令或者訊息,還可以傳遞值

具體的在元件基礎——Vue.js有講解

二、非父子元件傳值

1. bus匯流排

原理:

例項:在vue原型上建立一個bus屬性,bus屬性==new Vue()物件。例項中的在bus屬性上,$emit 傳值 和 $on繫結事件接收值;通過counted鉤子函式給元件繫結同樣的事件,當change事件需要觸發時,兩個元件都會觸發。

注意:觸發change事件,傳入的值。

    <div id="app">
       <child content="Dell"></child> 
       <child content="Lee"></child> 
    </div>
    <script>
        Vue.prototype.bus = new Vue() //在Vue原型上定義一個Vue例項,原型擁有了Vue例項的方法和屬性

        var child = {
            props: {
                content: String
            },
            data: function(){
                return {
                    name: this.content
                }
            },
            template: `<div @click="byValue">{{name}}</div>`,
            methods: {
                byValue(){
                    this.bus.$emit('change', this.name)
                }
            },
            mounted: function(){  //生命週期鉤子,也可以繫結在元件上,即元件掛在頁面的時候觸發,
            // 當觸發mounted的時候,元件上有個bus屬性,上有$on方法,可以繫結事件
                var _this = this;
                this.bus.$on('change', function(msg){
                    _this.name = msg                 
                })
            }
        }
        var vm = new Vue({
            el: '#app',
            components: {
                child 
            },
        })
    </script>

兩個元件上都綁定了change事件,當觸發其中一個元件的點選事件時,會通過$emit 傳遞資訊,綁定了change事件的元件都觸發了change事件。並且傳入的值 都是this.name(其中一個元件的name值)