@[TOC]前端
前端開發過程當中,須要動態添加操做面板,而操做面板能夠封裝成獨立的組件,被父組件引用。好比這個添加收貨信息的場景,父組件中能夠添加多個收貨地址: bash
顯然,父組件應該使用 v-for
來建立多個子組件,這裏父子組件須要進行雙向通訊,表現爲:服務器
因此呢,要用兩種組件通訊方式 props
和 $refs
。父組件傳遞給子組件的 props
數據,雖然只能由父組件修改,可是它也是子組件的數據,子組件能夠讀取、但不能修改;同時,子組件又須要維護本身的數據,便於子組件編輯。網絡
爲了達到雙向通訊的目的,能夠採起的操做以下:編輯器
props
完成的;v-for
建立子組件時,爲每一個組件設置 ref
屬性,經過 $refs
獲取每一個子組件的數據。這裏有個知識點,值得關注,父組件的 v-for
語句中怎麼動態設置子組件的 ref
屬性呢?post
找到的解決方案是使用字符串的佔位符號拼接上 index
來設置,例如,建立 N 個 el-button
子組件,且爲每一個組件設置各自的 ref 名稱,代碼以下:學習
<el-button
:key="index"
:ref="`btn${index}`"
v-for="(btn,index) in btns">
{{ btn.name}}
</el-button>
複製代碼
v-for
循環建立子組件常見的一個警告是Component lists rendered with v-for should have explicit keys.
,因此須要綁定這個屬性 :key="index"
。測試
封裝原型圖中的 Child
標記的組件,命名爲 AddressPanel
,組件參數有:ui
參數 | 說明 |
---|---|
address | 屬性:地址 |
postCode | 屬性:郵編 |
telephone | 屬性:電話 |
panelIndex | 屬性:當前面板的編號,remove 事件時須要 |
@addPanel | 事件:添加一個面板,父組件的 panels 添加一個新記錄 |
@removePanel | 事件:刪除一個面板,移除父組件的 panels[panelIndex] 處的記錄 |
AddressPanel
組件定義的僞代碼:spa
props: ['address', 'postCode', 'telephone', 'panelIndex'],
data(){
return {
data:{ //保證能修改數據,使用 props 屬性來初始化數據
address:address,
postCode:postCode,
telephone:telephone
}
}
}
複製代碼
父組件引用的僞代碼:
<div v-for="(panel, index) in panels">
<address-panel
:address="panel.address"
:postCode="panel.postCode"
:telephone="panel.telephone"
:panelIndex="index"
:ref="`panel${index}`"
</address-panel>
</div>
複製代碼
本文探討的是父子組件雙向通訊的方式,以及 v-for
循環建立子組件時怎麼動態設置 ref
屬性,都是 Vue
基本的知識點,由於封裝一個能夠重複動態添加的組件而遇到的問題。
測試動態 ref
時,用了 ElementUI
的在線運行編輯器,多是國外的服務器,也多是家裏網絡太慢,響應時間非常磨人的。這是今天 Vue 學習的內容,又離入門近了一點!