Vue3.0的遞迴監聽和非遞迴監聽
監聽的意思就是資料雙向繫結,檢視根據資料變化
遞迴監聽
預設情況下,無論是使用ref和reactive都是遞迴監聽,但是如果資料量非常大的話,就特別消耗效能
不信的話,我舉個例子
import {reactive } from "vue";
setup() {
let state = reactive({
a: "a",
gf: {
b: "b",
f: {
c: "c",
s: {
d: "d",
},
},
},
});
console.log(state)
console.log(state.gf)
console.log(state.gf.f)
console.log(state.gf.f.s)
}
對吧,內部每個都做了遞迴,尤大佬給我們提供了一個方法,避免這樣
非遞迴監聽
shallowReactive:第一層資料如果不該變的話,檢視不會更新
程式碼
import { shallowReactive } from "vue"
setup() {
let state = reactive({
a: "a",
gf: {
b: "b",
f: {
c: "c",
s: {
d: "d",
},
},
},
});
state.a = '1';
state.gf.b = '2';
state.gf.f.c = '3';
state.gf.f.s.d = '4'
console.log(state)
console.log(state.gf)
console.log(state.gf.f)
console.log(state.gf.f.s)
}
只有第一層發生了遞迴監聽,當我們第一層資料沒改變的時候,下面層的資料改變了是不會更新我們的UI檢視的
shallowRef:shallowRef建立的資料,vue監聽的是.value的變化,並不是第一層的變化
import { shallowRef} from "vue";
setup() {
let state = shallowReactive({
a: "a",
gf: {
b: "b",
f: {
c: "c",
s: {
d: "d",
},
},
},
});
//必須這樣修改
state.value = {
a: "1",
gf: {
b: "2",
f: {
c: "3",
s: {
d: "4",
},
},
},
};
}
但是我們就想修改某一層的值怎麼辦?這樣即可
import { triggerRef} from "vue";
state.value.gf.f.s.d = '4';
triggerRef(state)
注意:vue3只提供了triggerRef,所以如果是reactive型別的資料,是無法主動觸發頁面更新的
再說明下ref和reactive
ref
1.ref也是響應式資料方法,ref可以實現對簡單值的監聽,字串,數字等
2.ref底層的本質其實還是reactive,系統會自動根據我們給ref傳入的值將
它轉換成ref(xx) ->reactive({value:xx})
3.在vue中使用ref的值不用通過value獲取,在js中使用ref的值必須通過value獲取
reactive
1.reactive是vue3中提供的實現響應式資料的方法
2.vue2響應式資料是通過defineProperty,vue3是通過es6的proxy實現
3.reactive引數必須是物件或者陣列
這倆區別
1.如果在template裡使用的是ref型別的資料,那麼Vue會自動幫我們新增.value
2.如果在template裡使用的是reactive型別的資料,那麼Vue不會自動幫我們新增.value
3.vue內部根據一個v_isRef屬性來判斷的,ref的v_isRef屬性為true,reactive就沒有這個屬性
相關文章
- 快速排序【遞迴】【非遞迴】排序遞迴
- 遞迴和尾遞迴遞迴
- 遞迴和非遞迴分別實現求n的階乘遞迴
- 遍歷二叉樹-------遞迴&非遞迴二叉樹遞迴
- Android遍歷所有控制元件的遞迴和非遞迴實現Android控制元件遞迴
- 二分法的簡單實現——-遞迴和非遞迴遞迴
- python-動態規劃的遞迴、非遞迴實現Python動態規劃遞迴
- 揹包問題的遞迴與非遞迴演算法遞迴演算法
- 什麼是遞迴?遞迴和迴圈的異同遞迴
- 【C++】翻轉二叉樹(遞迴、非遞迴)C++二叉樹遞迴
- 快速排序(遞迴及非遞迴演算法原始碼)排序遞迴演算法原始碼
- 二叉樹的前中後序遍歷(遞迴和非遞迴版本)二叉樹遞迴
- 二叉樹的四種遍歷(遞迴與非遞迴)二叉樹遞迴
- 遞迴和遞推總結遞迴
- 監聽 watch props物件屬性監聽 或深度監聽物件
- Oracle 建立非1521埠監聽Oracle
- 遍歷二叉樹的遞迴與非遞迴程式碼實現二叉樹遞迴
- 最新情報:所有的遞迴都可以改寫成非遞迴?遞迴
- 二叉樹——後序遍歷的遞迴與非遞迴演算法二叉樹遞迴演算法
- js深度繼承的非遞迴方法JS繼承遞迴
- 歸併排序的非遞迴實現排序遞迴
- 遞迴遞迴
- 遞迴轉非遞迴 棧模擬 Recursive to Non-recursive stack simulated 總結遞迴
- Python 八皇后解法(非遞迴版本)Python遞迴
- 屬性和監聽
- ?30 秒瞭解尾遞迴和尾遞迴優化遞迴優化
- Oracle和Mysql遞迴OracleMySql遞迴
- 二十一、氣泡排序演算法——JAVA實現(遞迴與非遞迴)排序演算法Java遞迴
- python實現二叉樹及其七種遍歷方式(遞迴+非遞迴)Python二叉樹遞迴
- 資料結構-樹以及深度、廣度優先遍歷(遞迴和非遞迴,python實現)資料結構遞迴Python
- JavaScript和ABAP的尾遞迴JavaScript遞迴
- watch監聽
- go 遞迴Go遞迴
- JavaScript遞迴JavaScript遞迴
- 分而治之-遞迴遞迴
- 理解遞迴遞迴
- Spring Boot 事件和監聽Spring Boot事件
- 事件和事件監聽器事件