[Vue 牛刀小試]:第十章 - 組件間的數據通信


 一、前言

  在上一章的學習中,我們繼續學習了 Vue 中組件的相關知識,了解了在 Vue 中如何使用組件的 data、prop 選項。在之前的學習中有提到過,組件是 Vue 中的一個非常重要的概念,我們通過將頁面拆分成一個個獨立的組件,從而更好地實現代碼復用,使我們的代碼更加簡潔,容易維護。既然在 Vue 中我們會大量的使用到組件,必定會涉及到組件之間的通信,那么本章我們就來學習,如何實現組件間的數據交互。

  學習系列目錄地址:https://www.cnblogs.com/danvic712/p/9549100.html

  倉儲地址:https://github.com/Lanesra712/VueTrial/blob/master/chapter02-bronze/component/communication.html

 二、干貨合集

  1、父組件 => 子組件

  在上一章的時候,我們有提到過,我們可以使用 prop 選項在組件中定義一些自定義特性,當有值傳遞給 prop 特性時,那個 prop 特性就變成了那個組件實例的一個屬性,此時我們就可以從組件上獲取到接收的值。因此,這里我們就可以在使用子組件時通過 v-bind 指令動態的綁定一個 prop 特性,從而接收到父組件傳遞的值。

  可以看到,在下面的示例代碼中,我們在子組件中通過 v-bind 指令綁定了一個 prop 特性 parenttitle,用來接收父組件 data 選項中的 title 屬性,之后通過 watch 監聽屬性監聽綁定的 parenttitle 屬性,從而同步更新子組件 data 選項中的 content 屬性值。

<body>
    <div id="app">
        <h4>
            請輸入需要傳遞給子組件的值:<input type="text" v-model="title" />
        </h4>

        <hr />

        <child-node v-bind:parenttitle="title"></child-node>
    </div>
</body>

<template id="child">
    <div>
        <h4>
            Vue 實例中的屬性值為:{{content}}
        </h4>
    </div>
</template>

<script>
    var vm = new Vue({
        el: '#app',
        data: {
            title: ''
        },
        components: {
            'childNode': {
                template: '#child',
                props: ['parenttitle'],
                data() {
                    return {
                        content: this.parenttitle
                    }
                },
                watch: {
                    parenttitle() {
                        this.content = this.parenttitle
                    }
                },
            }
        }
    })
</script>

  2、子組件 => 父組件

  在 Vue 中存在着一個單向的下行綁定,父級組件的數據變更可以影響到子集組件,反過來則不行。在實際開發中可能會遇到當子組件的數據更新后,需要同步更新父組件的情況,那么這時我們應該怎么做呢?

  既然沒辦法直接通過修改 prop 選項中的屬性進行更新父組件,不如讓我們換一個思路思考。我們想要實現的效果,無非是當子組件數據變更時能夠同步引起父組件的變更,那么,我們是不是可以在子組件數據發生變化后,觸發一個事件方法,告訴父組件我數據更新了,父組件只需要監聽這個事件,當捕獲到這個事件運行后,再對父組件的數據進行同步變更不就可以了,整個的示意流程如下。

  那么,如何才能實現事件監聽呢?

  嗯,Vue 已經幫我們實現好了解決方案。我們可以使用 v-on 事件監聽器監聽事件,通過 $emit 去觸發當前實例上的事件。當然,這里的事件可以是 Javascript 中的原生 DOM 事件,也可以是我們自定義的事件。

  例如,在下面的代碼中,當我點擊傳遞數據按鈕后,觸發了子組件的 func 方法,在 func 方法中觸發了子組件實例上的 show 事件,並把 input 框中的值作為參數進行傳遞。這時,我們在使用到子組件的地方就可以通過 v-on(@) 指令監聽這個 show 事件,從而獲取到傳遞的參數,並觸發父組件的監聽事件。

<body>
    <div id="app">
        <h4>
            子組件中的屬性值為:{{msg}}
        </h4>

        <hr />

        <child-node @show="showMsg"></child-node>
    </div>
</body>

<template id="child">
    <div>
        <h4>
            請輸入需要傳遞給父組件的值:<input v-model="childMsg" type="text" />
            <button @click="func">傳遞數據</button>
        </h4>
    </div>
</template>

<script>
    var vm = new Vue({
        el: '#app',
        data: {
            title: '',
            msg: '',
        },
        methods: {
            showMsg(data) {
                this.msg = data
            }
        },
        components: {
            'childNode': {
                template: '#child',
                data() {
                    return {
                        childMsg: ''
                    }
                }
                methods: {
                    func() {
                        this.$emit('show', this.childMsg)
                    }
                },
            }
        }
    })
</script>

 三、總結

  這一章主要介紹了組件之間進行數據通信的兩種最常用的方式,對於子組件獲取父組件數據,一般是采用組件的 prop 選項向子組件傳遞數據;而父組件獲取子組件數據,則是采用事件監聽的方式。在實際使用中,組件的通信方式還有 .sync、$attrs、$listeners、slot-scope 等等,這里就先不介紹了,嗯,其實就是我還不會,哈哈,先學習掌握這兩種最常見的方式,其它的方式就先放到后面再學習吧。

 四、參考

  1、Vue的事件解讀

  2、Vue事件解讀之$emit

  3、Vue.js 父子組件通信的1212種方式


免責聲明!

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



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