Vue 3中引用類型包括Array和Object。在Vue中,數(shù)據(jù)響應(yīng)式原理是通過Object.defineProperty()來實(shí)現(xiàn)的,因此當(dāng)數(shù)據(jù)發(fā)生變化時(shí),會立即觸發(fā)視圖的更新。但是如果直接修改Object和Array類型的值,則無法觸發(fā)響應(yīng)式更新。為了解決這個(gè)問題,Vue 3提供了一系列的API來實(shí)現(xiàn)對于引用類型的響應(yīng)式更新。
const state = reactive({ foo: 0, arr: [] }); state.foo = 1; // 視圖立即更新 state.arr.push(1); // 視圖不會立即更新,因?yàn)锳rray類型的方法沒有被代理
在上面的代碼中,我們定義了一個(gè)響應(yīng)式的state對象,當(dāng)我們修改foo的值時(shí),視圖會立刻響應(yīng)變化。但是當(dāng)我們使用push方法向arr數(shù)組里添加一個(gè)元素時(shí),視圖并不會立即更新。這時(shí)候我們可以使用Vue 3提供的toRefs和ref等API來實(shí)現(xiàn)這個(gè)功能。
const state = reactive({ foo: 0, arr: ref([]) }); state.foo = 1; // 視圖立即更新 state.arr.value.push(1); // 視圖會立即更新,因?yàn)槲覀兪褂昧藃ef將數(shù)組轉(zhuǎn)化成響應(yīng)式的值
在上面的代碼中,我們將arr數(shù)組通過ref進(jìn)行了包裝,這樣我們就可以通過訪問state.arr.value來直接修改數(shù)組的值,并且視圖會立即響應(yīng)更新。
除此之外,Vue 3還提供了一些其他的API來對于引用類型進(jìn)行響應(yīng)式處理,比如toRaw、markRaw等。這些API的使用可以根據(jù)實(shí)際業(yè)務(wù)場景進(jìn)行選擇。