vue使用數(shù)組splice方法失效,且總刪除最后一項的問題及解決
使用數(shù)組splice方法失效,總刪除最后一項的問題
今天在寫項目的時候,遇到一個很簡單的需求,下圖,點擊添加標簽,左邊出現(xiàn)一個可以輸入的標簽,點擊刪除按鈕, 就能刪除當前標簽,很簡單的需求,我卻搞了一個多小時(哎…新手愚笨啊)
一看到這個我的思路就是點擊添加標簽,把新增的節(jié)點push到自己定義的數(shù)組里,然后渲染出來,點擊刪除按鈕,用splice方法從數(shù)組中刪除掉當前的節(jié)點(很簡單,很明確的思路嘛,但是卻事與愿違)
<div class="addtag" v-for="(i,index) in tags" :key="i.index" > <div v-html="i.tag" class="tags">{{i.tag}}</div> <span @click='deleteTag(index)' class='fa fa-close'></span> </div> <span v-show='tags.length > 4 ? false : true' @click="addTag" class="fa fa-plus-square-o">添加標簽</span> // 點擊添加標簽 addTag(){ this.tags.push({"tag":"<input type='text' />"}) }, //刪除標簽 deleteTag(index){ this.tags.splice(index, 1) },
當我點擊刪除的時候,總是刪除的是最后一個添加的節(jié)點,也就是新添加的那一個,我試了好多次,還是不行,回頭又看了好多次我的方法,以為下標傳錯了什么之類的,但是我反復看了四五遍,沒有發(fā)現(xiàn)錯誤。
然后又對splice方法進行了復習,又查閱了此方法還是不行。
于是我去網(wǎng)上搜(新手嘛,遇到了問題,你懂得…),網(wǎng)上也沒有相關(guān)問題,只有一個說到了,說是vue的渲染問題,當你去刪除標簽時,他重復執(zhí)行了方法,需要添加一個事件去重的方法,也沒太看懂,就去翻閱了官網(wǎng),查看了vue的v-for渲染和唯一的key值。
我的問題之所以會產(chǎn)生,是因為在于key的綁定問題,我只是用下標來綁定每一個標簽的key,而沒有與數(shù)組中元素掛鉤,因此當刪除數(shù)組元素時,vue會采用一種叫做’就地復用‘的原則,將旁邊的元素直接拿過來使用,而vue官方有這樣一句話(官方文檔的重要性啊…):
我的解決辦法是
push的時候為每一條元素添加一個id值,key值取它的id,與它的元素相關(guān)聯(lián)
// 點擊添加標簽 addTag(){ ++this.tagNum; this.tags.push({"tag":"<input type='text' />", 'id':this.tagNum}) }, <div class="addtag" v-for="(i,index) in tags" :key="i.id" > <div v-html="i.tag" class="tags">{{i.tag}} </div> <span @click='deleteTag(index)' class='fa fa-close'></span> </div> <span v-show='tags.length > 4 ? false : true' @click="addTag" class="fa fa-plus-square-o">添加標簽</span>
這樣我的問題就解決了,今天遇到的這個問題認為有必要記錄一下。
vue中splice()方法的使用
splice(index,len,item)是vue中數(shù)組變異的方法之一,可以用來刪除,更新,和增加數(shù)組內(nèi)容
參數(shù)
index
: 數(shù)組下標len
: 為1或0item
: 更新或增加的內(nèi)容
使用方法
1,刪除,當參數(shù)形式為splice(index,1)時表示刪除下標為index的內(nèi)容
2,更新,當參數(shù)形式為splice(index,1,item)時表示用新的值item更新替換掉下標為index的值
3,增加,當參數(shù)形式為splice(index,0,item)時表示在下標為index的位置增加一項值為item
案例
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> <title></title> </head> <body> <div id="demo"> <ul> <li v-for="(m,index) in person" :key="index"> <span>{{index}}--</span><span>{{m.name}}--</span><span>{{m.age}}---</span> <button @click="deletep(index)">刪除---</button> <button @click="updatep(index,{name:'shanghai',age:304})">更新---</button> <button @click="addp(index,{name:'shanghai',age:132})">增加</button> </li> </ul> </div> </body> <script type="text/javascript"> var vm = new Vue({ el: "#demo", data: { person: [{ name: "zhangsan",age: "112"}, { name: "zhangsan",age: "112"}, { name: "zhangsan",age: "112"}, { name: "zhangsan",age: "112"}] }, methods:{ deletep(index){ this.person.splice(index,1); }, updatep(index,newp){ this.person.splice(index,1,newp) }, addp(index,newp){ this.person.splice(index,0,newp) } } }) </script> </html>
運行效果如上,當點擊刪除下標為0的項時得到的效果如下
當點擊更新按鈕時得到的效果如下
當點擊增加按鈕時得到的效果如下
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
vue中使用Echarts?map圖實現(xiàn)下鉆至縣級的思路詳解
這篇文章主要介紹了vue中使用Echarts?map圖實現(xiàn)下鉆至縣級,需要注意的是,因為我是直接從?vue-cli2?直接跳到?vue-cli4?,還奇怪怎么讀取不到JSON,查找后才知道?vue-cli3?往后的項目基礎(chǔ)架構(gòu)對比舊版本有些區(qū)別,感興趣的朋友跟隨小編一起看看吧2022-01-01vue translate peoject實現(xiàn)在線翻譯功能【新手必看】
這篇文章主要介紹了vue translate peoject實現(xiàn)在線翻譯功能,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2018-06-06vue開發(fā)移動端使用better-scroll時click事件失效的解決方案
這篇文章主要介紹了vue開發(fā)移動端使用better-scroll時click事件失效的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07Vue2實現(xiàn)圖片的拖拽,縮放和旋轉(zhuǎn)效果的示例代碼
這篇文章主要為大家介紹了如何基于vue2?實現(xiàn)圖片的拖拽、旋轉(zhuǎn)、鼠標滾動放大縮小等功能。文中的示例代碼講解詳細,感興趣的小伙伴可以嘗試一下2022-11-11elementui?el-upload一次請求上傳多個文件的實現(xiàn)
使用ElementUI?Upload的時候發(fā)現(xiàn)如果是默認方案,上傳多張圖片并不是真正的一次上傳多張,本文就來介紹一下elementui?el-upload一次請求上傳多個文件的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下2023-10-10關(guān)于keep-alive路由多級嵌套不生效的解決方案
本文主要介紹了關(guān)于keep-alive路由多級嵌套不生效的解決方案,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03