猛跑小豬
2022-12-22 15:56:29
我是 Vue 的新手,希望得到一些關(guān)于最佳實(shí)踐的說明。我正在構(gòu)建一個(gè)使用數(shù)組來保留子組件列表的應(yīng)用程序,我希望能夠通過向父組件發(fā)送來更新和刪除組件。為了實(shí)現(xiàn)這一點(diǎn),我目前讓孩子檢查父數(shù)組以使用“等于”方法找到它的索引,以便它可以將該索引傳遞給父數(shù)組。這適用于簡單的事情,但如果我的子組件變得更復(fù)雜,我將不得不檢查越來越多的數(shù)據(jù)點(diǎn)以確保我正在更改正確的數(shù)據(jù)點(diǎn)。我能想到的另一種方法是在創(chuàng)建子組件時(shí)為子組件提供一個(gè) ID 道具,然后傳遞它,但隨后我必須處理以確保所有 ID 都不同。我是在正確的軌道上還是有更好的更廣泛接受的方法來做到這一點(diǎn)?我也嘗試過使用 indexOf(this._props) 來獲取索引,但這似乎不起作用。也許我只是做錯(cuò)了什么?這是我正在做的事情的簡化版本:// fake localStorage for snippet sandboxconst localStorage = {}Vue.component('child', { template: '#template', data() { return { newName: this.name } }, props: { name: String }, mounted() { this.newName = this.name }, methods: { update() { this.$emit( "update-child", this.$parent.children.findIndex(this.equals), this.newName ) }, equals(a) { return a.name == this.name } }})var app = new Vue({ el: '#app', data: { children: [] }, methods: { addNewChild() { this.children.push({ name: 'New Child', }) }, updateChild(index, newName) { this.children[index].name = newName } }, mounted() { if (localStorage.children) { this.children = JSON.parse(localStorage.children) } }, watch: { children(newChildren) { localStorage.children = JSON.stringify(newChildren) } }})<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.min.js"></script><div id="app"> <button v-on:click="addNewChild">+ New Child</button> <hr /> <child v-for="child in children" :key="children.indexOf(child)" :name="child.name" @update-child="updateChild"> </child></div><script type="text/x-template" id="template"> <div> <p><b>Name: {{name}}</b></p> <input placeholder="Name" type="text" v-model="newName" /> <button @click="update">Update</button> <hr /> </div></script>
1 回答

守候你守候我
TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超10個(gè)贊
最棒的v-for是它創(chuàng)建了自己的范圍??紤]到這一點(diǎn),您可以安全地child在事件處理程序中引用。例如
<child
v-for="(child, index) in children"
:key="index"
:name="child.name"
@update-child="updateChild(child, $event)"
/>
updateChild(child, newName) {
child.name = newName
}
您需要從子組件發(fā)出的只是新名稱,它將作為事件有效負(fù)載呈現(xiàn)$event
update() {
this.$emit("update-child", this.newName)
}
關(guān)于:key...的快速注釋肯定會(huì)更好地鍵入child對(duì)象的某些獨(dú)特屬性(如id您所建議的那樣)。
如果您的數(shù)組僅改變大小,則可以鍵入數(shù)組索引,但如果您決定拼接或排序它,Vue 將無法正確響應(yīng)該更改,因?yàn)樗饕肋h(yuǎn)不會(huì)改變。
添加回答
舉報(bào)
0/150
提交
取消