vue3中ref、reactive、shallowRef、 shallowReactive、toRaw、unref、toRef、toRefs、customRef使用与区别
生活随笔
收集整理的這篇文章主要介紹了
vue3中ref、reactive、shallowRef、 shallowReactive、toRaw、unref、toRef、toRefs、customRef使用与区别
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
ref
| 普通ref對象 | 特殊ref對象 |
| 不會和原始對象掛鉤 | 創建的ref對象,與原始對象掛鉤 |
| 重新渲染 | 不會觸發渲染 |
-普通ref對象
如下面的例子中, ref對象改變,視圖已更新,原始數據json保持不變。
toRef() -特殊ref對象,傳入對象和屬性
4. 創建的ref對象,與原始對象掛鉤
5. 不會觸發渲染
toRefs()-批量處理toRef,傳入一個對象
customRef
創建一個自定義的 ref,并對其依賴項跟蹤和更新觸發進行顯式控制。它需要一個工廠函數,該函數接收 track 和 trigger 函數作為參數,并且應該返回一個帶有 get 和 set 的對象。
shallowReactive的簡單實現
shallowReactive只對第一層監聽變化
function shallowReactive(obj) {if (typeof obj === 'object') {return new Proxy(obj, {get(obj, key) {if (key in obj) {return obj[key];} else {console.warn('no this key:' + key)return undefined;}},set(obj, key, val) {console.log('重新渲染')if (key in obj) {obj[key] = val;} else {console.warn('no this key:' + key)obj[key] = val;}return true;}})} else {console.warn('this is not reactive :' + obj)} } let obj1 = shallowReactive({a: 12,b: [{c: 2}] }) obj1.a++; console.log(obj1)結果:
結果:
reactive簡單實現
深度監聽
function reactive(obj) {if (typeof obj === 'object') {if (obj instanceof Array) {obj.forEach((item, index) => {if (typeof item === 'object') {obj[index] = reactive(item);}})} else {for (let key in obj) {if (typeof obj[key] === 'object') {obj[key] = reactive(obj[key])}}}return new Proxy(obj, {get(obj, key) {if (key in obj) {return obj[key];} else {console.warn('no this key:' + key)return undefined;}},set(obj, key, val) {console.log('重新渲染')if (key in obj) {obj[key] = val;} else {console.warn('no this key:' + key)obj[key] = val;}return true;}})} else {console.warn('this is not reactive :' + obj)} } let obj1 = reactive({a: 12,b: [{c: 2}] }) obj1.b[0].c++; console.log(obj1.b[0])總結
以上是生活随笔為你收集整理的vue3中ref、reactive、shallowRef、 shallowReactive、toRaw、unref、toRef、toRefs、customRef使用与区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vue3与vue2的详细区别
- 下一篇: html5倒计时秒杀怎么做,vue 设