三、組件與實(shí)例的關(guān)系,組件間怎么發(fā)生通信(父組件向子組件傳值)

每一個Vue的組件都是一個Vue的實(shí)例,像實(shí)例一樣,組件里也可以有template實(shí)例,也可以有methods等等。我們以后就統(tǒng)說成實(shí)例或者是組件。

組件與組件間怎么發(fā)生通信呢?
依然沿用上面的例子,做一個需求:當(dāng)點(diǎn)擊li標(biāo)簽的時候,彈出一個“clicked”的彈框,用全局組件編寫這個需求。

body>
    <div id="root">
        <div>
            <input v-model="inputValue" />
            <button @click="handleSubmit">提交</button>
        </div>
        <ul>
            <todo-item
            v-for="(item, index) of list"
            :key="index"
            :content="item"
            >
            </todo-item>
        </ul>
    </div>
    
    <script>
        Vue.component('todo-item',{
            props:['content'],
            template:'<li @click="handleClick">{{content}}</li>',
            methods: {
                handleClick: function(){
                    alert('clicked')
                }
            }
        })
        new Vue({
            el:"#root",
            data:{
                inputValue:'hello',
                list:[]
            },
            methods:{
                handleSubmit:function(){
                    this.list.push(this.inputValue)
                    this.inputValue =''
                }
            }
        })
    </script>
</body>

瀏覽器中,點(diǎn)擊提交,點(diǎn)擊li標(biāo)簽的內(nèi)容后,會出來一個“clicked”的彈框:


image.png

這個代碼里面有一個Vue實(shí)例和一個Vue全局組件。
Vue實(shí)例創(chuàng)建了輸入框內(nèi)的hello和空的list項(xiàng),還創(chuàng)建了一個handleSubmit方法,該方法在點(diǎn)擊提交后,把在輸入框中的內(nèi)容導(dǎo)進(jìn)了list項(xiàng)中,然后抹掉了輸入框中的數(shù)據(jù)。
Vue組件創(chuàng)建了一個名叫todo-item全局組件,該組件創(chuàng)建了一個li標(biāo)簽和一個handleClick方法,該方法是在點(diǎn)擊li標(biāo)簽內(nèi)容的時候,彈出一個clicked的彈窗。

這樣就出現(xiàn)了一個問題,在Vue實(shí)例中創(chuàng)建的list數(shù)組中的項(xiàng),這些項(xiàng)會在Vue組件中的li標(biāo)簽中顯示出來,但這個項(xiàng)怎么傳達(dá)到Vue組件當(dāng)中?
可以認(rèn)為Vue實(shí)例是一個父組件,component是一個子組件,在ul標(biāo)簽內(nèi),item將數(shù)據(jù)傳給了content屬性,在子組件中,通過props接收了content屬性的內(nèi)容,然后在子組件中的模板中顯示出來。
所以在ul標(biāo)簽中todo-item實(shí)現(xiàn)了從父組件中的值傳給某一個屬性,然后這個屬性傳給了子組件,這樣形成了父組件向子組件的數(shù)據(jù)傳遞。
有一點(diǎn)需要注意:子組件接收從父組件傳遞過來的內(nèi)容,但是不可以修改從父組件傳遞過來的內(nèi)容(修改會報(bào)錯)
但如果我一定有修改那個子組件的需求,怎么辦?
可以在data內(nèi)創(chuàng)建一個數(shù)據(jù),將從父組件傳過來的值復(fù)制到這個data內(nèi),利用上面的例子,大致操作如下:

 props:['content'],
data:function() {
    return {
        number:this.count
    }
}

然后子組件后面操作就可以用number來操作,而不是操作父組件傳來的count。
既然有了從父組件向子組件傳遞數(shù)據(jù),那么也有從子組件向父組件傳遞數(shù)據(jù),這個得看下一節(jié)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前言 您將在本文當(dāng)中了解到,往網(wǎng)頁中添加數(shù)據(jù),從傳統(tǒng)的dom操作過渡到數(shù)據(jù)層操作,實(shí)現(xiàn)同一個目標(biāo),兩種不同的方式....
    itclanCoder閱讀 26,238評論 1 12
  • 主要還是自己看的,所有內(nèi)容來自官方文檔。 介紹 Vue.js 是什么 Vue (讀音 /vju?/,類似于 vie...
    Leonzai閱讀 3,537評論 0 25
  • vue概述 在官方文檔中,有一句話對Vue的定位說的很明確:Vue.js 的核心是一個允許采用簡潔的模板語法來聲明...
    li4065閱讀 7,598評論 0 25
  • 組件(Component)是Vue.js最核心的功能,也是整個架構(gòu)設(shè)計(jì)最精彩的地方,當(dāng)然也是最難掌握的。...
    六個周閱讀 5,760評論 0 32
  • 從去年上半年開始,一直到現(xiàn)在,各類垂直行業(yè)、平臺類的o2o火的一塌糊涂,賣飯的、搞水果的、按摩的、修指甲的,都在往...
    樂水三千閱讀 380評論 0 5

友情鏈接更多精彩內(nèi)容