vue組件的數據傳遞

    vue的一個重要特徵就是組件化開發。那麼如何實現組件之間的消息傳遞就顯得尤爲重要。vue給出了以下幾種方式:

  • 利用props實現父組件向子組件傳遞信息
  • 子組件內利用$emit方法觸發父組件的一個事件,同時可以傳入參數實現子組件向父組件的數據傳遞。

    下邊以一個具體的例子做詳細說明,這個例子中父組件利用props向子組件傳遞一個字符串,同時子組件設置相應的按鈕,點擊按鈕實現子組件向父組件傳遞一個數據,以此改變父組件的fontSize值。具體代碼如下:

<body>
    <div id="app1" :style="{ fontSize: size + 'px' }">
        <demo-props :message='message' @enlarge-text='enlargeText'></demo-props>       
    </div>
    <script>
        Vue.component('demo-props', {
            props: ['message'],
            template: `
            <div>               
                <button @click="$emit('enlarge-text',2)">2倍放大</button>
                <button @click="$emit('enlarge-text',4)">4倍放大</button>
                <p>{{message}}</p> 
            </div>`
        })
        var app1 = new Vue({
            el: "#app1",
            data: {
                size: 10,
                message: 'Hello world'
            },
            methods: {
                enlargeText: function (scale) {
                    this.size = this.size * scale;
                }
            }
        })
    </script>
</body>

以上代碼有幾點需要具體說明:

  1. 註冊組件時,template後邊不是單引號,而是鍵盤上數字鍵1左邊的那個符號。
  2. 點擊子組件的button,會執行$emit函數,該函數的第一個參數是在父級組件監聽的事件名稱,後邊的參數都是子組件需要向父組件傳遞的數據。
  3. 註冊組件時,props是一個數組,需要從父組件傳遞值的屬性,都應該放在該數組內。當然vue也提供了一種方式讓我們對props中的值做一些簡單驗證。此時props變成一個對象而不是一個存放字符串的數組。舉例如下:
 Vue.component('my-component', {
            props: {
                propA: Number,           //propA的值必須是Number類型的
                propB: [Number, String],  //propB的值必須是Number類型或者String類型
                propC: {                 //propC的值是必須填寫的字符串類型的
                    type: String,
                    required: true
                },
                propD: {                 //propD的值是一個Number的,且默認值是100
                    type: Number,
                    default: 100
                },
                propE: {                  //propE的值是一個有默認值的對象                 
                    type: Object,
                    default: function () {
                        return { message: 'Hello world' }
                    }
                },
                propF: {                  //propF有自自定義的驗證方式,其值必須是'success', 'warning', 'danger'中的一個
                    validator: function (value) {
                        return ['success', 'warning', 'danger'].indexOf(value) !== -1;
                    }
                }
            }
        })


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章