日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

vue proxy 的優勢與使用場景實現

瀏覽:140日期:2023-01-13 10:03:50

1.前言

隨著 vue3.x 的消息越來越多, proxy 的討論也。相對于 Object.defineProperty , proxy 有什么區別,有什么優勢,以及可以應用在什么地方。該文章就簡單的介紹下

2.Object.defineProperty

講 proxy 之前,先回顧下 Object.defineProperty 。大家都知道, vue2.x 以及之前的版本是使用 Object.defineProperty 實現數據的雙向綁定的,至于是怎樣綁定的呢?下面簡單實現一下

function observer(obj) { if (typeof obj ===’object’) { for (let key in obj) { defineReactive(obj, key, obj[key]) } }}function defineReactive(obj, key, value) { //針對value是對象,遞歸檢測 observer(value) //劫持對象的key Object.defineProperty(obj, key, { get() { console.log(’獲取:’+key) return value }, set(val) { //針對所設置的val是對象 observer(val) console.log(key+'-數據改變了') value = val } })}let obj={ name:’守候’, flag:{ book:{ name:’js’, page:325 }, interest:[’火鍋’,’旅游’], }}observer(obj)

在瀏覽器的 console 執行一下,似乎能正常運行

vue proxy 的優勢與使用場景實現

但是實際上, Object.defineProperty 問題有以下幾個

問題1.刪除或者增加對象屬性無法監聽到

比如增加一個屬性 gender ,由于在執行 observer(obj) 的時候,沒有這個屬性,所以這個無法監聽到。刪除的屬性也是無法監聽到

增加屬性的時候, vue 需要使用 $set 進行操作, $set 的內部也是使用 Object.defineProperty 進行操作

vue proxy 的優勢與使用場景實現

問題2.數組的變化無法監聽到

vue proxy 的優勢與使用場景實現

由上圖得知,雖然數組屬性實際上是修改成功了,但是不能被監聽到

問題3. 由于是使用遞歸遍歷對象,使用 Object.defineProperty 劫持對象的屬性,如果遍歷的對象層級比較深,花的時間比較久,甚至有性能的問題

3.proxy

對于 proxy ,在 mdn 上的描述是: 對象用于定義基本操作的自定義行為(如屬性查找、賦值、枚舉、函數調用等)

簡單來說就是,可以在對目標對象設置一層攔截。無論對目標對象進行什么操作,都要經過這層攔截

聽上去似乎, proxy 比 Object.defineProperty 要好用,并且簡單很多,實際上就是如此。下面用 proxy 對上面的代碼進行改寫試下

function observerProxy(obj){ let handler = { get (target, key, receiver) { console.log(’獲取:’+key) // 如果是對象,就遞歸添加 proxy 攔截 if (typeof target[key] === ’object’ && target[key] !== null) { return new Proxy(target[key], handler) } return Reflect.get(target, key, receiver) }, set (target, key, value, receiver) { console.log(key+'-數據改變了') return Reflect.set(target, key, value, receiver) } } return new Proxy(obj, handler)}let obj={ name:’守候’, flag:{ book:{ name:’js’, page:325 }, interest:[’火鍋’,’旅游’], }}let objTest=observerProxy(obj)

也是一樣的效果

vue proxy 的優勢與使用場景實現

而且,能做到 Object.defineProperty 做不到的事情,比如增加一個屬性 gender ,能夠監聽到

vue proxy 的優勢與使用場景實現

操作數組,也能監聽到

vue proxy 的優勢與使用場景實現

最后敲一下黑板,簡單總結一下兩者的區別

1. Object.defineProperty 攔截的是對象的屬性,會改變原對象。 proxy 是攔截整個對象,通過 new 生成一個新對象,不會改變原對象。

2. proxy 的攔截方式,除了上面的 get 和 set ,還有 11 種。選擇的方式很多 Proxy ,也可以監聽一些 Object.defineProperty 監聽不到的操作,比如監聽數組,監聽對象屬性的新增,刪除等。

4.proxy 使用場景

關于 proxy 的使用場景,受限于篇幅,這里就簡單列舉幾個,更多的可以移步我的 github 筆記或者 mdn 。

看到這里,兩者的區別,和 proxy 的優勢已經知道個大概了。但是在開發上,有哪些場景可以使用到 proxy 呢,下面列舉個可能會遇上的情況

4-1.負索引數組

在使用 splice(-1) , slice(-1) 等 API 的時候,當輸入負數的時候,會定位到數組的最后一項,但是在普通數組上,并不能使用負數。 [1,2,3][-1] 這個代碼并不能輸出 3 。要讓上面的代碼輸出 3 , 也可以使用 proxy 實現。

let ecArrayProxy = { get (target, key, receiver) { let _index=key<0?target.length+Number(key):key return Reflect.get(target, _index, receiver) }}let arr=new Proxy([1,2,3],ecArrayProxy)

vue proxy 的優勢與使用場景實現

4-2.表單校驗

在對表單的值進行改動的時候,可以在 set 里面進行攔截,判斷值是否合法

let ecValidate = { set (target, key, value, receiver) { if (key === ’age’) { //如果值小于0,或者不是正整數 if (value<0||!Number.isInteger(value)) { throw new TypeError(’請輸入正確的年齡’); } } return Reflect.set(target, key, value, receiver) }}let obj=new Proxy({age:18},ecValidate)obj.age=16obj.age=’少年’

vue proxy 的優勢與使用場景實現

4-3.增加附加屬性

比如有一個需求,保證用戶輸入正確身份證號碼之后,把出生年月,籍貫,性別都添加進用戶信息里面

眾所周知,身份證號碼第一和第二位代表所在省(自治區,直轄市,特別行政區),第三和第四位代表所在市(地級市、自治州、盟及國家直轄市所屬市轄區和縣的匯總碼)。第七至第十四位是出生年月日。低17位代表性別,男單女雙。

const PROVINCE_NUMBER={ 44:’廣東省’, 46:’海南省’}const CITY_NUMBER={ 4401:’廣州市’, 4601:’海口市’}let ecCardNumber = { set (target, key, value, receiver) { if(key === ’cardNumber’){ Reflect.set(target, ’hometown’, PROVINCE_NUMBER[value.substr(0,2)]+CITY_NUMBER[value.substr(0,4)], receiver) Reflect.set(target, ’date’, value.substr(6,8), receiver) Reflect.set(target, ’gender’, value.substr(-2,1)%2===1?’男’:’女’, receiver) } return Reflect.set(target, key, value, receiver) }}let obj=new Proxy({cardNumber:’’},ecCardNumber)

vue proxy 的優勢與使用場景實現

4-4.數據格式化

比如有一個需求,需要傳時間戳給到后端,但是前端拿到的是一個時間字符串,這個也可以用 proxy 進行攔截,當得到時間字符串之后,可以自動加上時間戳。

let ecDate = { set (target, key, value, receiver) { if(key === ’date’){ Reflect.set(target, ’timeStamp’, +new Date(value), receiver) } return Reflect.set(target, key, value, receiver) }}let obj=new Proxy({date:’’},ecDate)

vue proxy 的優勢與使用場景實現

參考鏈接

Proxy

面試官: 實現雙向綁定Proxy比defineproperty優劣如何?

簡單通俗的理解Vue3.0中的Proxy

小結

proxy 和 Object.defineproperty 的一些區別,以及 proxy 的優勢,使用場景,暫時就介紹到這里了。這篇文章介紹的不算深入,理解圈起來不難。對于 proxy ,筆者也打算繼續深入學習,如果往后有收獲,也會第一時間分享。如果文章有什么錯誤,或者有什么建議,歡迎評論區留言。

到此這篇關于vue proxy 的優勢與使用場景實現的文章就介紹到這了,更多相關vue proxy 使用場景內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Vue
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美.日韩.国产.一区.二区 | 中文字幕av亚洲精品一部二部| 久久xxx视频| 午夜亚洲福利| 六月丁香综合| 美美哒免费高清在线观看视频一区二区| 成人美女视频| 日韩欧美精品综合| 日韩久久一区二区三区| 国产网站在线| 久久高清免费| 欧美精品自拍| 日韩专区欧美专区| 天堂久久一区| 精品久久亚洲| 激情欧美日韩一区| 亚洲经典在线| 日韩国产精品久久久久久亚洲| 日本少妇精品亚洲第一区| 亚洲精品麻豆| 国产另类在线| 亚洲v在线看| 首页国产欧美久久| 国产精品草草| 欧美午夜精彩| 91麻豆精品| 在线人成日本视频| 鲁大师成人一区二区三区 | 精品美女视频 | 日本精品影院| 日韩精品成人| 不卡一二三区| 日本精品在线播放| 久久香蕉网站| 免费人成在线不卡| 久久精品国产99国产| 在线观看精品| 欧美片第1页综合| 免费在线小视频| 亚洲精品人人| 日韩在线综合| 日本精品国产| 午夜欧美视频| 国产乱码午夜在线视频| 五月激激激综合网色播| 99国产精品一区二区| 国产精品主播在线观看| 老鸭窝毛片一区二区三区| 国产精品原创| 国产精品久久久久久av公交车| 婷婷激情图片久久| 麻豆精品国产91久久久久久| 午夜在线一区| 91精品1区| 天堂√8在线中文| 成人午夜亚洲| 91福利精品在线观看| 亚洲资源av| 亚洲精品一二三区区别| 日韩高清中文字幕一区二区| 国产伊人久久| 美女视频网站久久| 日本欧美一区| 国产欧美一区二区三区国产幕精品| 免费日韩av片| 免费精品视频最新在线| 亚洲黄色在线| 老色鬼久久亚洲一区二区| 国产一在线精品一区在线观看| а√天堂中文在线资源8| 免费一区二区三区在线视频| 69精品国产久热在线观看| 日本免费在线视频不卡一不卡二| 亚洲欧美在线专区| 日韩二区三区在线观看| 日韩精品第一| 精品视频在线观看网站| 久久av国产紧身裤| 国产aⅴ精品一区二区四区| 国产一区二区三区网| 女生影院久久| 久久福利影视| 国产精品18| 日韩中文影院| 蜜桃av一区二区在线观看| 天堂久久一区| 国内精品伊人| 在线精品视频在线观看高清| 影音先锋久久精品| 久久精品五月| 亚洲欧洲一区| 国产乱子精品一区二区在线观看| zzzwww在线看片免费| 日韩视频一区| 久久av日韩| 狠狠爱成人网| 国产福利亚洲| 亚洲欧美高清| 免费观看亚洲| 国产毛片精品| 亚洲一区二区三区四区五区午夜| 日韩高清中文字幕一区| 吉吉日韩欧美| 欧美日韩中出| 欧美精品一区二区久久| 国产九一精品| 蜜桃视频在线观看一区二区| 精品理论电影在线| 日本亚州欧洲精品不卡| 欧美日韩色图| 国产伊人久久| 欧美日韩调教| 亚洲尤物在线| 91精品国产成人观看| 欧美国产三级| 午夜久久av| 红桃视频亚洲| 欧美成人基地 | 狠狠久久婷婷| 欧美色图一区| 亚洲精品.com| 麻豆精品一区二区综合av| 首页欧美精品中文字幕| 欧美日韩国产精品一区二区亚洲| 国产黄大片在线观看| 国产精品白丝一区二区三区| 日韩 欧美一区二区三区| 性欧美精品高清| 丝袜美腿一区二区三区| 久久久久99| 久久久久久久久丰满| 日本不良网站在线观看| 欧美国产免费| 精品中文字幕一区二区三区四区| 青青青国产精品| 国产一卡不卡| 国产精品xxxav免费视频| 国产精品伦一区二区| 国产精品密蕾丝视频下载| 久久av导航| 日韩啪啪电影网| 亚洲性视频h| 亚洲我射av| 国产精品一区二区三区av麻| 欧美高清不卡| 久久精品九色| 日韩免费看片| 九一国产精品| 日日夜夜免费精品视频| 日韩av黄色在线| 欧美男人天堂| 亚洲一区导航| 久久精品国产久精国产| 亚洲1234区| 首页亚洲欧美制服丝腿| 国产精品地址| 美腿丝袜亚洲一区| 国产视频欧美| 在线观看精品| 欧美不卡视频| 每日更新成人在线视频| 亚洲三级毛片| 在线中文字幕播放| 日本不卡不码高清免费观看| 韩国精品主播一区二区在线观看| 久久高清一区| 神马久久午夜| 日本一不卡视频| 三级精品视频| 红杏一区二区三区| 亚洲精品美女91| 免费av一区二区三区四区| 国产精品chinese| 综合在线一区| 久久国产主播| 精品三区视频| 奇米亚洲欧美| 综合激情视频| 99成人在线| 欧美成人基地| 蜜桃av在线播放| 国产精品久久久久久久久久10秀| 国产毛片一区二区三区| 综合视频一区| 婷婷综合成人| 综合干狼人综合首页| 欧美.日韩.国产.一区.二区 | 狠狠爱www人成狠狠爱综合网| 亚洲黄色免费av| 国产精品黑丝在线播放| 麻豆91小视频| 欧美激情久久久久久久久久久| 91精品视频一区二区| 日本不卡不码高清免费观看| 中文字幕日本一区二区| 在线免费观看亚洲| 久久av在线| 亚洲开心激情| 亚洲影院天堂中文av色| 亚洲一区二区日韩|