在Vue中,我們經(jīng)常需要使用數(shù)組來存儲(chǔ)一些數(shù)據(jù)。但是在某些特定情況下,我們需要對(duì)數(shù)組進(jìn)行修改而又不能破壞Vue的響應(yīng)式系統(tǒng),這時(shí)候就需要使用Vue提供的$set方法。
Vue.$set(array, index, value);
這個(gè)方法接收三個(gè)參數(shù),第一個(gè)參數(shù)是需要修改的數(shù)組,第二個(gè)參數(shù)是需要修改的數(shù)組的下標(biāo),第三個(gè)參數(shù)是需要對(duì)該下標(biāo)所對(duì)應(yīng)的元素修改的值。
使用$set方法之前,我們通常會(huì)使用以下兩種方法對(duì)數(shù)組進(jìn)行修改。
//方法一,通過數(shù)組下標(biāo)直接賦值
array[index] = newValue;
//方法二,使用splice方法
array.splice(index, 1, newValue);
這兩種方法都是直接修改了數(shù)組本身,而并沒有考慮到Vue的響應(yīng)式系統(tǒng)。也就是說,如果我們使用以上兩種方法修改數(shù)組的話,Vue并沒有辦法檢測(cè)到該數(shù)組的變化,也就無法觸發(fā)相應(yīng)的重新渲染。
以方法一為例,如果我們直接通過數(shù)組下標(biāo)進(jìn)行賦值,Vue就無法感知到這個(gè)操作,也就無法去更新DOM。
但如果我們使用$set方法就不同了,Vue會(huì)在$set方法中執(zhí)行一些特殊的操作,使得Vue能夠檢測(cè)到該數(shù)組的變化,并觸發(fā)相應(yīng)的重新渲染。
//使用$set方法
Vue.$set(array, index, newValue);
通過以上代碼,我們可以看到,我們使用了$set方法之后,Vue就能夠正確地感知到該數(shù)組的變化,并重新渲染DOM。
需要注意的是,在Vue的2.5.0版本之前,$set方法只能用于設(shè)置數(shù)組中已存在的元素,而不能用于添加新的元素。但是在Vue的2.5.0版本之后,$set方法已經(jīng)支持添加新的元素了。
//使用$set方法添加新元素
Vue.$set(array, index, newValue);
另外,需要注意的是,在Vue的3.0版本之后,$set方法已經(jīng)被廢棄了,取而代之的是新的響應(yīng)式API。
總的來說,$set方法是Vue提供的一個(gè)非常重要的方法,它能夠使得Vue能夠正確地感知到數(shù)組的變化,從而觸發(fā)相應(yīng)的重新渲染。而今后在使用Vue時(shí),無論是在2.x還是3.x版本中,$set方法都將會(huì)是我們處理數(shù)組變化時(shí)的得力助手。