解決vue watch數(shù)據(jù)的方法被調(diào)用了兩次的問題
背景:
路由結(jié)構(gòu)/video/1.mp4,即/video是父路由,/1.mp4是/video的動(dòng)態(tài)子路由,在/video父路由中會(huì)通過url的params獲取視頻信息,即通過/1.mp4獲取對(duì)應(yīng)的視頻完整信息,然后通過props傳到動(dòng)態(tài)子路由中,然后子路由通過接受到的視頻對(duì)象,進(jìn)行展示
問題:
當(dāng)路由切換時(shí),即當(dāng)我點(diǎn)擊其他視頻時(shí),導(dǎo)致動(dòng)態(tài)子路由變化時(shí),我監(jiān)聽了/video父路由的變化并重新根據(jù)url的params獲取視頻對(duì)象,并自動(dòng)通過props傳入子路由中,我在子路由中通過watch 視頻對(duì)象來進(jìn)行一些操作,結(jié)果
watch: { video () { console.log('test') }}
test被打印了兩次,通過一番查找,才發(fā)現(xiàn),當(dāng)子路由切換時(shí),父路由/video中的data數(shù)據(jù)都會(huì)被初始化為默認(rèn)值,所以導(dǎo)致video對(duì)象變化了兩次,一次是因?yàn)槌跏蓟恢刂脼槟J(rèn)值空對(duì)象,一次是請(qǐng)求后的正確數(shù)據(jù)
結(jié)局:
將video對(duì)象存到vuex中,然后父路由將vuex中的video對(duì)象傳給子路由就行了
補(bǔ)充知識(shí):vue watch一個(gè)對(duì)象或數(shù)組時(shí),newvalue和oldvalue一樣
在官方的代碼改寫了一下,當(dāng)深度watch一個(gè)對(duì)象時(shí),newval和oldval的值為什么是相等的呢?
var vm = new Vue({ data: { a: 1, c:{ c1:1, c2:2 } }, watch: { ’a’: function (val, oldVal) { console.log(val, oldVal,(val== oldVal)) }, // 方法名 ’b’: ’someMethod’, // 深度 watcher ’c’: { handler: function (val, oldVal) { console.log(val, oldVal,(val== oldVal)) }, deep: true } }}) vm.a = 2 vm.c.c1 = 2
和深度無關(guān),而是在修改(不是替換)對(duì)象或數(shù)組時(shí),舊值將與新值相同,因?yàn)樗鼈兯饕粋€(gè)對(duì)象/數(shù)組。Vue 不會(huì)保留修改之前值的副本。
以上這篇解決vue watch數(shù)據(jù)的方法被調(diào)用了兩次的問題就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. ASP基礎(chǔ)入門第四篇(腳本變量、函數(shù)、過程和條件語句)2. ASP將數(shù)字轉(zhuǎn)中文數(shù)字(大寫金額)的函數(shù)3. jscript與vbscript 操作XML元素屬性的代碼4. jsp 實(shí)現(xiàn)的簡(jiǎn)易mvc模式示例5. JSP開發(fā)之hibernate之單向多對(duì)一關(guān)聯(lián)的實(shí)例6. HTML5實(shí)戰(zhàn)與剖析之觸摸事件(touchstart、touchmove和touchend)7. 基于PHP做個(gè)圖片防盜鏈8. Jsp servlet驗(yàn)證碼工具類分享9. XML在語音合成中的應(yīng)用10. php使用正則驗(yàn)證密碼字段的復(fù)雜強(qiáng)度原理詳細(xì)講解 原創(chuàng)
