因為新開了一個項目使用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