vue中v-for循環(huán)數(shù)組,在方法中splice刪除數(shù)組元素踩坑記錄
vue v-for循環(huán)數(shù)組,在方法中splice刪除數(shù)組元素
之前博客記錄過普通for循環(huán)中,針對對應(yīng)符合條件的元素,使用splice刪除導(dǎo)致出現(xiàn)的問題
附上博客地址:js數(shù)組splice刪除某個元素爬坑
這里填一下在vue中v-for中使用splice刪除元素的坑。
眾所周知,我們使用v-for循環(huán)dom/組件,它有兩個屬性,item:當(dāng)前循環(huán)的每一個元素,index:當(dāng)前循環(huán)元素所對應(yīng)的下標(biāo)
個人習(xí)慣,平時綁定key值的時候,都習(xí)慣采用如下寫法,直接綁定下標(biāo)
<div v-else class="checkCavans" v-for="(item,index) in cavansArr" :key="index">
<rd-video
:cameraName="item.name"
:id="item.id"
:url="item.rtmp"
:isFull="isFull"
:isShowFullBtn="true"
:isAutoPlay="false"
:isOpenFlash="isOpenFlash"
ref="rdVideo"
@playerStateChange="playerStateChange"
></rd-video>
<img
src="../../../static/images/videoSurveillanceClose.png"
alt=""
@click="closeVideo(item)"
/>
</div>在圖片(關(guān)閉圖標(biāo))綁定的事件中,我們關(guān)閉當(dāng)前的視頻(銷毀:數(shù)據(jù)驅(qū)動,直接改變數(shù)組即可)
closeVideo(currData) {
console.log('rd: closeVideo -> item', currData);
const index = this.cavansArr.findIndex(item => item.id === currData.id);
this.cavansArr.splice(index, 1);
},這里采取的是把當(dāng)前數(shù)據(jù)當(dāng)做參數(shù)傳入事件中,然后通過findIndex找到數(shù)組中和當(dāng)前數(shù)據(jù)id匹配的元素的下標(biāo),然后在數(shù)組中刪除這條數(shù)據(jù)即可。
但是因?yàn)槲覀兘壎╧ey值采取的是index,我們這邊刪除元素會導(dǎo)致順序錯亂問題,并不會以我們期望的那樣,點(diǎn)擊第一條就會刪除第一條。
查看vue官網(wǎng)對于key的介紹,最終找到了問題。
這里通俗的解釋下:
下標(biāo)在這是個臨時身份,它的默認(rèn)位置不會變化,如果你里面的item項(xiàng)移動了,那么移動的數(shù)據(jù)對應(yīng)到index上,所以你的index對應(yīng)的那個項(xiàng)就不是你想要的那個項(xiàng)了
所以本質(zhì)上 :key=index 它們是同一個inedx 在不變化的前提下,一旦發(fā)生變化了,就不再是我們期望的那樣了
所以這也是官方不推薦使用:key="index"的原因,如果業(yè)務(wù)發(fā)生變化,你的代碼就出問題了
我們改造下代碼,其他地方都可以不變,只需修改對于的key值即可
<div v-else class="checkCavans" v-for="item in cavansArr" :key="item.id">
<rd-video
:cameraName="item.name"
:id="item.id"
:url="item.rtmp"
:isFull="isFull"
:isShowFullBtn="true"
:isAutoPlay="false"
:isOpenFlash="isOpenFlash"
ref="rdVideo"
@playerStateChange="playerStateChange"
></rd-video>
<img
src="../../../static/images/videoSurveillanceClose.png"
alt=""
@click="closeVideo(item)"
/>
</div>這里我們綁定循環(huán)的每一項(xiàng)item中的一個唯一屬性id(其他屬性有可能出現(xiàn)從重復(fù)的情況,不一定綁定id屬性,綁定任何屬性都可,但是不管什么屬性,保證其唯一性)
這樣我們再使用splice時就不會出現(xiàn)這種錯亂的問題了。


以上就是針對vue中使用v-for循環(huán)數(shù)組,在事件中操作數(shù)組元素(刪除等)導(dǎo)致出現(xiàn)的問題。
js vue v-for循環(huán)刪除數(shù)組項(xiàng)(刪不干凈的問題)
重點(diǎn)在與a -= 1,要讓a隨著被截取后數(shù)組長度的變化而變化,截取一個,a少一次。
let val = this.childData.chackNumber
? ? ? for (let a = 0; a < val.length; a++) {?
? ? ? ? if (val[a].chack == false) {
? ? ? ? ? val.splice(a,1)
? ? ? ? ? a -= 1 ? //每刪除一個項(xiàng)就讓a減少一個 保持a和長度同步
? ? ? ? }
? ? ? }數(shù)據(jù)結(jié)構(gòu)如下:
chackNumber: [
? ? ? ? ? {?
? ? ? ? ? ? floorID:true,
? ? ? ? ? ? chack: true,
? ? ? ? ? ? name: "[01]"
? ? ? ? ? },
? ? ? ? ? {
? ? ? ? ? ? floorID:false,
? ? ? ? ? ? chack: false,
? ? ? ? ? ? name: "[02]"
? ? ? ? ? },
? ? ? ? ? {?
? ? ? ? ? ? floorID:false,
? ? ? ? ? ? chack: false,
? ? ? ? ? ? name: "[03]"
? ? ? ? ? },
? ? ? ? ? {?
? ? ? ? ? ? floorID:false,
? ? ? ? ? ? chack: false,
? ? ? ? ? ? name: "[04]"
? ? ? ? ? },
? ? ? ? ? {?
? ? ? ? ? ? floorID:true,
? ? ? ? ? ? chack: true,
? ? ? ? ? ? name: "[05]"
? ? ? ? ? },
? ? ? ? ? {?
? ? ? ? ? ? floorID:false,
? ? ? ? ? ? chack: false,
? ? ? ? ? ? name: "[06]"
? ? ? ? ? },
? ? ? ? ? {?
? ? ? ? ? ? floorID:true,
? ? ? ? ? ? chack: true,
? ? ? ? ? ? name: "[07]"
? ? ? ? ? },
? ? ? ? ? {?
? ? ? ? ? ? floorID:false,
? ? ? ? ? ? chack: false,
? ? ? ? ? ? name: "[08]"
? ? ? ? ? },
? ? ? ? ? {?
? ? ? ? ? ? floorID:true,
? ? ? ? ? ? chack: true,
? ? ? ? ? ? name: "[09]"
? ? ? ? ? },
? ? ? ? ? {?
? ? ? ? ? ? floorID:true,
? ? ? ? ? ? chack: true,
? ? ? ? ? ? name: "[10]"
? ? ? ? ? },
? ? ? ? ? {?
? ? ? ? ? ? floorID:false,
? ? ? ? ? ? chack: false,
? ? ? ? ? ? name: "[11]"
? ? ? ? ? }
? ? ? ? ]總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Vue3利用自定義指令進(jìn)行內(nèi)容控制的實(shí)現(xiàn)方法
Vue3作為一個漸進(jìn)式JavaScript框架,提供了強(qiáng)大的自定義指令功能,使得權(quán)限控制變得既簡單又高效,本文將詳細(xì)介紹如何在Vue3中使用自定義指令來判斷內(nèi)容是否顯示,以滿足不同用戶權(quán)限下的界面展示需求,需要的朋友可以參考下2024-04-04
如何修改element-ui中tree組件的icon圖標(biāo)(小白都會的前端技能)
這篇文章主要給大家介紹了關(guān)于如何修改element-ui中tree組件的icon圖標(biāo)的相關(guān)資料,本文介紹的是小白都會的前端技能,文中通過代碼以及圖文介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01
解決Ant Design Modal內(nèi)嵌Form表單initialValue值不動態(tài)更新問題
這篇文章主要介紹了解決Ant Design Modal內(nèi)嵌Form表單initialValue值不動態(tài)更新問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-10-10
在nuxt使用vueX代替storage的實(shí)現(xiàn)方案
這篇文章主要介紹了在nuxt使用vueX代替storage的實(shí)現(xiàn)方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-10-10
Vite打包優(yōu)化之縮小打包體積實(shí)現(xiàn)詳解
這篇文章主要為大家介紹了使用Vite縮小打包體積如何實(shí)現(xiàn)的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01

