在Vue中,watch是一個(gè)常見的功能,它用于監(jiān)聽一個(gè)指定的變量,當(dāng)該變量發(fā)生變化時(shí),執(zhí)行相應(yīng)的操作。當(dāng)我們需要修改data時(shí),可以利用watch實(shí)現(xiàn)。
watch: { //監(jiān)聽data中的變量name name: function(newValue, oldValue) { //執(zhí)行相應(yīng)的操作 console.log('name變化了', newValue, oldValue) } }
以上代碼中,watch中的子屬性name監(jiān)聽了data中的變量name,當(dāng)name發(fā)生變化時(shí),會(huì)執(zhí)行后續(xù)的操作。此處操作是打印出name變化后的新值newValue和舊值oldValue。
那么,如何改變data中的name值,從而觸發(fā)watch的監(jiān)聽呢?我們可以在Vue實(shí)例中,使用this.$data或this來訪問到data中的變量,然后直接賦值即可。
methods: { changeName: function() { //修改data中的變量name this.$data.name = 'Tom' //或者使用this.name = 'Tom' } }
以上代碼中,我們在Vue的methods中定義了一個(gè)changeName函數(shù),該函數(shù)可以用于修改data中的變量name值。在函數(shù)內(nèi)部,我們通過this.$data或this直接訪問到name變量,并將其賦值為'Tom'。
當(dāng)我們執(zhí)行changeName函數(shù)時(shí),data中的name變量被修改,由于watch已經(jīng)監(jiān)聽了該變量,因此watch會(huì)自動(dòng)執(zhí)行相應(yīng)的操作,即打印出變化后的值。此時(shí),控制臺(tái)會(huì)輸出'name變化了'、'Tom'、以及原先的name值。
需要注意的是,如果我們在watch中修改了data中的變量值,也會(huì)觸發(fā)watch的監(jiān)聽。因此,應(yīng)當(dāng)謹(jǐn)慎地使用watch來修改data的值,以免觸發(fā)死循環(huán)等問題。
watch: { //監(jiān)聽data中的變量name name: function(newValue, oldValue) { //執(zhí)行相應(yīng)的操作 console.log('name變化了', newValue, oldValue) //修改data中的name值,不建議這么做 this.$data.name = 'Jack' } }
需要注意的是,以上代碼中,在watch的回調(diào)函數(shù)中,我們修改data中的name值,以使得name值變?yōu)?Jack'。但這樣做會(huì)觸發(fā)watch的回調(diào)函數(shù),又會(huì)不斷地修改name值,因此會(huì)陷入死循環(huán)。因此,應(yīng)當(dāng)謹(jǐn)慎地選擇watch來修改data的值。如果需要修改值,最好使用methods中的函數(shù)來實(shí)現(xiàn)。