關於物件新增的屬性需要 set原因

2021-10-25 22:05:42 字數 872 閱讀 9812

其實在 vue3.x 還沒有發布 bate 的時候, 很火的乙個話題就是vue3.x 將使用 proxy 取代 vue2.x 版本的 object.defineproperty。

沒有無緣無故的愛,也沒有無緣無故的恨。為何要將object.defineproperty換掉呢,咋們可以簡單聊一下。

我剛上手 vue2.x 的時候就經常遇到乙個問題,資料更新了啊,為何頁面不更新呢?什麼時候用set

更新,什

麼時候用

set更新,什麼時候用

set更新,

什麼時候

用forceupdate強制更新,你是否也一度陷入困境。後來的學習過程中開始接觸原始碼,才知道一切的根源都是 object.defineproperty。

對這塊想要深入了解的小夥伴可以看這篇文章 為什麼 vue3.0 不再使用 defineproperty 實現資料監聽?要詳細解釋又是一篇文章,這裡就簡單對比一下object.defineproperty 與 proxy

object.defineproperty只能劫持物件的屬性, 而 proxy 是直接**物件

由於object.defineproperty只能劫持物件屬性,需要遍歷物件的每乙個屬性,如果屬性值也是物件,就需要遞迴進行深度遍歷。但是 proxy 直接**物件, 不需要遍歷操作

object.defineproperty對新增屬性需要手動進行observe

因為object.defineproperty劫持的是物件的屬性,所以新增屬性時,需要重新遍歷物件, 對其新增屬性再次使用object.defineproperty進行劫持。也就是 vue2.x 中給陣列和物件新增屬性時,需要使用$set才能保證新增的屬性也是響應式的, $set內部也是通過呼叫object.defineproperty去處理的。

關於python例項化物件直接新增屬性

現在有乙個fastapi request類的例項request,動態新增了乙個屬性current user,在另外一處 中引用這個屬性,但是pycharm提示該屬性沒有定義,但是執行沒有問題。問題來了,什麼情況下可以動態新增屬性,什麼情況下不能那?segmentfault上有一篇寫的很好 要點 py...

新增和獲取物件的屬性

class hero object 定義了乙個英雄類,可以移動和攻擊 defmove self 例項方法 print 正在前往事發地點.defattack self 例項方法 print 發出了一招強力的普通攻擊.例項化了乙個英雄物件 泰達公尺爾 taidamier hero 給物件新增屬性,以及對...

jquery 關於checked屬性的新增與移除

radio removeattr checked radio attr checked true 實際問題 在使用removeattr 移除了radio的checked屬性後,使用attr 重新增加不起作用 解決 radio removeattr checked input radio prop c...