注意此處說(shuō)明:對(duì)該表單項(xiàng)進(jìn)行重置煎谍,將其值重置為初始值并移除校驗(yàn)結(jié)果
在頁(yè)面第一次加載時(shí)點(diǎn)擊新增,進(jìn)行關(guān)閉時(shí),resetFiles 可以觸發(fā)沒(méi)有問(wèn)題锋玲,包括后續(xù)編輯關(guān)閉也可以對(duì)表單重置成功灭返。
但是在頁(yè)面第一次加載時(shí)點(diǎn)擊編輯盗迟,在進(jìn)行關(guān)閉操作時(shí),出現(xiàn)問(wèn)題熙含,表單沒(méi)有被清空罚缕。
是因?yàn)榇朔椒ú皇乔蹇毡韱危⒁馍线叺恼f(shuō)明怎静,此方法會(huì)將其值重置為初始值并移除校驗(yàn)結(jié)果
要解決很簡(jiǎn)單邮弹,在編輯方法中,為賦值操作加上 $nextTick 邊可以解決了蚓聘。
edit(row) {
this.editVisibile = true
this.$nextTick(() => {
this.form = { ... row }
})
}
如果要究其原因的話腌乡,可以接著往下看看
當(dāng)頁(yè)面第一次加載時(shí),表單為空夜牡,如果第一次點(diǎn)擊的是新增导饲,那么form表單會(huì)與數(shù)據(jù)進(jìn)行雙向綁定,并且深拷貝一份初始數(shù)據(jù)存起來(lái)氯材,當(dāng)使用 resetFiles 時(shí)渣锦,再將一開(kāi)始深拷貝的數(shù)據(jù)拿來(lái)進(jìn)行賦值。
那么編輯時(shí)為什么會(huì)出現(xiàn) resetFiles 失效的問(wèn)題呢氢哮? 其實(shí)并沒(méi)有失效袋毙,只是此時(shí)的初始值已經(jīng)是第一次編輯的那條數(shù)據(jù)。包括后續(xù)點(diǎn)擊其他數(shù)據(jù)進(jìn)行編輯冗尤,關(guān)閉之后听盖,表單都會(huì)重置為第一次點(diǎn)擊的那條數(shù)據(jù)。
原因就是DOM渲染時(shí)異步任務(wù)裂七,賦值為同步代碼皆看,所以賦值在DOM渲染之前,所以form表單與數(shù)據(jù)進(jìn)行雙向綁定的時(shí)候背零,深拷貝的其實(shí)是點(diǎn)擊編輯時(shí)候賦值的那一條數(shù)據(jù)腰吟,那么再之后的所有關(guān)閉操作中,都會(huì)得到第一次點(diǎn)擊編輯時(shí)的那條數(shù)據(jù)被初始化到表單中。
使用 nextTick 的定義為:在最近一次DOM渲染完成之后執(zhí)行嫉称。所以將賦值操作放在 $nextTick 中 ,賦值操作就會(huì)在DOM渲染之后執(zhí)行灵疮,form就會(huì)拿到一開(kāi)始未賦值的數(shù)據(jù)作為重置內(nèi)容進(jìn)行深拷貝保存织阅,為之后重置使用。