關於vue3中ref和reactive直接賦值無法響應的思考


因為新開了一個項目使用vue3,不太熟悉,其中使用了ref和reactive關鍵字,簡單翻看文檔和一些講解之后,知道ref的實現是reactive。但使用中reactive()修飾的變量,不能直接對數組進行賦值操作,ref()卻可以,這個問題感到很奇怪。

記錄一下現在自己的想法

因為vue3是用proxy對整個對象的劫持,使用的是reflect去操作整個對象

Reflect.set(target, prop, value[, receiver])

問題應該就是出在這個方法上。假設target是一個數組,如果反射的方法直接使用,只傳遞一個target參數的情況下,確實可以賦值成功,變成一個[ undefined: undefined ]

 

但是VUE中是直接使用了解構方法

 1 function reactive(obj) {  2   const handler = {  3  get(target, prop, receiver) {  4       return value  5  },  6  set(target, key, value, receiver) {  7       return Reflect.set(...arguments)  8  }  9  } 10 
11   return new Proxy(obj, handler) 12 }

如第7行所示,這樣一來在proxy = []這個賦值操作時,是不成功的,所以賦值reactive無效。但ref在外部重新包了一層value屬性,所以直接對.value操作可以成功。

主要是多了一個對象。

這個想法不對!

 

測試時,確實Proxy可以直接將值綁定到對象上,打印出來。但沒有考慮到界面的雙向綁定。因為DOM上綁定了相應的變量,但是直接進行賦值,DOM上變量的地址已經發生了改變,所以界面無法更新。

但是ref()下使用.value和reactive的添加屬性,都是在同一個對象下進行操作,所以可以成功

 

參考:

http://www.imxmx.com/Item/1/83507.html

https://www.bilibili.com/video/BV1ab4y1t74X?spm_id_from=333.999.0.0

https://www.bilibili.com/video/BV1kq4y1f7Sw?p=5


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM