在Vue中,watch選項用于監(jiān)聽數(shù)據(jù)的變化,實現(xiàn)數(shù)據(jù)變化時自動執(zhí)行一些操作。默認(rèn)情況下,watch只會監(jiān)聽數(shù)據(jù)引用的變化,如果數(shù)據(jù)中的某個屬性值發(fā)生變化不會觸發(fā)watch的監(jiān)聽。解決這個問題的方法是使用deep選項,以監(jiān)聽對象或數(shù)組內(nèi)部屬性值的變化。
watch: { obj: { deep: true, handler: function (val, oldVal) { console.log('obj changed'); } } }
在上面的代碼中,我們定義了一個watch監(jiān)聽obj對象的變化,并設(shè)置deep為true。當(dāng)obj內(nèi)部屬性值發(fā)生變化時,會觸發(fā)watch的handler函數(shù)。
除了deep選項之外,還可以使用immediate選項來指定在組件初始化時立即執(zhí)行watch的handler函數(shù)。
watch: { obj: { deep: true, immediate: true, handler: function (val, oldVal) { console.log('obj changed'); } } }
當(dāng)immediate設(shè)置為true時,watch選項在組件初始化時會立即執(zhí)行一次handler函數(shù)。
需要注意的是,deep選項會引起性能問題,因為它監(jiān)聽了對象或數(shù)組內(nèi)部屬性值的變化,所以需要避免同時監(jiān)聽多個深層次的對象或數(shù)組。
另外,如果要監(jiān)聽數(shù)組的變化,可以使用Vue提供的專用方法。例如,可以使用push方法監(jiān)聽數(shù)組的添加元素操作。
watch: { arr: { handler: function (val, oldVal) { console.log('arr changed'); }, deep: true } }, methods: { addElement: function () { this.arr.push('new element'); } }
在上面的代碼中,我們定義了一個watch監(jiān)聽arr數(shù)組的變化,并使用push方法添加元素。由于監(jiān)聽了數(shù)組的變化,當(dāng)使用push方法添加元素時會觸發(fā)watch的handler函數(shù)。
最后需要注意的是,deep選項只能監(jiān)聽對象內(nèi)部屬性的變化,不能監(jiān)聽非引用類型的數(shù)據(jù)類型(如boolean、string、number等)的變化。