vue數(shù)據(jù)監(jiān)聽解析Object.defineProperty與Proxy區(qū)別
前言
總能深深感覺到自己能力有限,寫這篇文章的目的純粹是因為發(fā)現(xiàn)在實際工作中,和一些小伙伴交流時發(fā)現(xiàn),雖然有些小伙伴大概知道 vue2
與 vue3
的區(qū)別,但并沒有去進一步思考一些深一點的東西。盡管能力有限,但想著自己在起步時候的艱難,就想著分享一下自己的一些看法,雖然不一定有多深入,但能引起大家的一些思考也是好的。
Object.defineProperty 與 Proxy 的區(qū)別
其實在 api
的命名上就能看出端倪,Object.defineProperty
顧名思義,是與對象和屬性有關的。 vue2
就是利用 defineProperty
的 set
和 get
方法去監(jiān)聽對象屬性變化的。 而 Proxy
是直接去監(jiān)聽一個對象的。
注意:他們在這里的區(qū)別就是 Object.defineProperty
監(jiān)聽的是對象的屬性,而 Proxy
監(jiān)聽的是這個對象本身
在使用上的差異
如上所述,Object.defineProperty
監(jiān)聽的是對象的屬性, 但是監(jiān)聽屬性只能遍歷監(jiān)聽對象已有的屬性,對于可能新增的屬性,vue2
是沒有辦法監(jiān)聽的,頁面自然也就不會更新。 所以為了解決這個問題 vue2
提供了 set
方法,當新增屬性時,可以通過 set
方法為新增的屬性添加監(jiān)聽器。
而 Proxy
帶來的問題就是由于監(jiān)聽的是一個對象,自然能監(jiān)聽對象的所有屬性變化,那么也就不再需要 set
這個方法了。
但是由于監(jiān)聽的是對象,所以沒法處理基礎類型。當我們使用 ref(false)
去創(chuàng)建一個基本類型的響應式變量時,本質相當于 reactive({value: false})
。于是 Vue3
有了一個很奇怪的現(xiàn)象, 明明想用 ref
方法監(jiān)聽一個基礎類型,卻需要通過 .value
才能獲取到具體值。
總結與思考
總的來說,Proxy
雖然解決了 set
的坑,但是又埋下了 ref
的坑,那么 Proxy
值得使用嗎?
我的理解是值得的。原因就是同樣監(jiān)聽一個對象,之前要為每個屬性設置監(jiān)聽器,現(xiàn)在不需要了,性能和屬性管理成本都能直線下降。
以上就是 vue數(shù)據(jù)監(jiān)聽解析Object.defineProperty與Proxy區(qū)別的詳細內容,更多關于 vue數(shù)據(jù)監(jiān)聽的資料請關注腳本之家其它相關文章!
相關文章
vue + vuex todolist的實現(xiàn)示例代碼
這篇文章主要介紹了vue + vuex todolist的實現(xiàn)示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-03-03vue中循環(huán)多個li(表格)并獲取對應的ref的操作代碼
我想要獲取每一個循環(huán)并獲取每一個li(或者其它循環(huán)項)的ref,以便于后續(xù)的操作,接下來通過本文給大家分享vue中循環(huán)多個li(表格)并獲取對應的ref的操作代碼,感興趣的朋友跟隨小編一起看看吧2024-02-02Vue使用視頻作為網(wǎng)頁背景的實現(xiàn)指南
在現(xiàn)代網(wǎng)頁設計中,視頻背景逐漸成為一種流行的設計趨勢,它不僅能夠提升網(wǎng)頁的動態(tài)效果,還可以在視覺上抓住用戶的注意力,本文將詳細講解如何在頁面中使用視頻作為背景,并確保內容可見、頁面元素布局合理,需要的朋友可以參考下2024-10-10