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

您的位置:首頁技術(shù)文章
文章詳情頁

vue proxy 的優(yōu)勢(shì)與使用場景實(shí)現(xiàn)

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

1.前言

隨著 vue3.x 的消息越來越多, proxy 的討論也。相對(duì)于 Object.defineProperty , proxy 有什么區(qū)別,有什么優(yōu)勢(shì),以及可以應(yīng)用在什么地方。該文章就簡單的介紹下

2.Object.defineProperty

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

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

在瀏覽器的 console 執(zhí)行一下,似乎能正常運(yùn)行

vue proxy 的優(yōu)勢(shì)與使用場景實(shí)現(xiàn)

但是實(shí)際上, Object.defineProperty 問題有以下幾個(gè)

問題1.刪除或者增加對(duì)象屬性無法監(jiān)聽到

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

增加屬性的時(shí)候, vue 需要使用 $set 進(jìn)行操作, $set 的內(nèi)部也是使用 Object.defineProperty 進(jìn)行操作

vue proxy 的優(yōu)勢(shì)與使用場景實(shí)現(xiàn)

問題2.數(shù)組的變化無法監(jiān)聽到

vue proxy 的優(yōu)勢(shì)與使用場景實(shí)現(xiàn)

由上圖得知,雖然數(shù)組屬性實(shí)際上是修改成功了,但是不能被監(jiān)聽到

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

3.proxy

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

簡單來說就是,可以在對(duì)目標(biāo)對(duì)象設(shè)置一層攔截。無論對(duì)目標(biāo)對(duì)象進(jìn)行什么操作,都要經(jīng)過這層攔截

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

function observerProxy(obj){ let handler = { get (target, key, receiver) { console.log(’獲取:’+key) // 如果是對(duì)象,就遞歸添加 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+'-數(shù)據(jù)改變了') 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 的優(yōu)勢(shì)與使用場景實(shí)現(xiàn)

而且,能做到 Object.defineProperty 做不到的事情,比如增加一個(gè)屬性 gender ,能夠監(jiān)聽到

vue proxy 的優(yōu)勢(shì)與使用場景實(shí)現(xiàn)

操作數(shù)組,也能監(jiān)聽到

vue proxy 的優(yōu)勢(shì)與使用場景實(shí)現(xiàn)

最后敲一下黑板,簡單總結(jié)一下兩者的區(qū)別

1. Object.defineProperty 攔截的是對(duì)象的屬性,會(huì)改變?cè)瓕?duì)象。 proxy 是攔截整個(gè)對(duì)象,通過 new 生成一個(gè)新對(duì)象,不會(huì)改變?cè)瓕?duì)象。

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

4.proxy 使用場景

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

看到這里,兩者的區(qū)別,和 proxy 的優(yōu)勢(shì)已經(jīng)知道個(gè)大概了。但是在開發(fā)上,有哪些場景可以使用到 proxy 呢,下面列舉個(gè)可能會(huì)遇上的情況

4-1.負(fù)索引數(shù)組

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

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 的優(yōu)勢(shì)與使用場景實(shí)現(xiàn)

4-2.表單校驗(yàn)

在對(duì)表單的值進(jìn)行改動(dòng)的時(shí)候,可以在 set 里面進(jìn)行攔截,判斷值是否合法

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

vue proxy 的優(yōu)勢(shì)與使用場景實(shí)現(xiàn)

4-3.增加附加屬性

比如有一個(gè)需求,保證用戶輸入正確身份證號(hào)碼之后,把出生年月,籍貫,性別都添加進(jìn)用戶信息里面

眾所周知,身份證號(hào)碼第一和第二位代表所在省(自治區(qū),直轄市,特別行政區(qū)),第三和第四位代表所在市(地級(jí)市、自治州、盟及國家直轄市所屬市轄區(qū)和縣的匯總碼)。第七至第十四位是出生年月日。低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 的優(yōu)勢(shì)與使用場景實(shí)現(xiàn)

4-4.數(shù)據(jù)格式化

比如有一個(gè)需求,需要傳時(shí)間戳給到后端,但是前端拿到的是一個(gè)時(shí)間字符串,這個(gè)也可以用 proxy 進(jìn)行攔截,當(dāng)?shù)玫綍r(shí)間字符串之后,可以自動(dòng)加上時(shí)間戳。

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 的優(yōu)勢(shì)與使用場景實(shí)現(xiàn)

參考鏈接

Proxy

面試官: 實(shí)現(xiàn)雙向綁定Proxy比defineproperty優(yōu)劣如何?

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

小結(jié)

proxy 和 Object.defineproperty 的一些區(qū)別,以及 proxy 的優(yōu)勢(shì),使用場景,暫時(shí)就介紹到這里了。這篇文章介紹的不算深入,理解圈起來不難。對(duì)于 proxy ,筆者也打算繼續(xù)深入學(xué)習(xí),如果往后有收獲,也會(huì)第一時(shí)間分享。如果文章有什么錯(cuò)誤,或者有什么建議,歡迎評(píng)論區(qū)留言。

到此這篇關(guān)于vue proxy 的優(yōu)勢(shì)與使用場景實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)vue proxy 使用場景內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Vue
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精品日本一区二区三区在线 | 久久精品国产网站| 国产伦精品一区二区三区在线播放| 欧美一区成人| 欧美激情 亚洲a∨综合| 麻豆精品新av中文字幕| 97精品中文字幕| 亚洲高清激情| 亚洲ww精品| 精品久久视频| 国产一区日韩欧美| 日韩一区欧美二区| 国产精品一国产精品k频道56| 国产精品中文字幕制服诱惑| 日本一区二区高清不卡| 欧美理论视频| 亚洲伊人影院| 国产高清视频一区二区| 香蕉视频亚洲一级| 石原莉奈一区二区三区在线观看 | 在线精品视频一区| 国产极品模特精品一二| 99精品视频在线| 蜜臀91精品一区二区三区| 青青草伊人久久| 伊伊综合在线| 亚洲综合图色| 伊人久久在线| 综合欧美亚洲| 精品国产一区二区三区2021| 精品在线99| 国产精品www.| 99pao成人国产永久免费视频| 国产乱码精品一区二区三区亚洲人| 国产日韩电影| 亚洲欧美网站在线观看| 高清日韩中文字幕| 一区二区亚洲视频| 久久毛片亚洲| 91亚洲精品在看在线观看高清| 少妇久久久久| 美女视频网站久久| 亚洲欧美不卡| 国产资源在线观看入口av| 国产模特精品视频久久久久| 麻豆精品新av中文字幕| 久久xxxx精品视频| 福利精品一区| 91成人在线网站| 国产视频欧美| 日韩成人亚洲| 国产乱子精品一区二区在线观看| 午夜久久一区| 国产精品原创| 国产精品乱战久久久| 丝袜亚洲另类欧美| 久久精品观看| 国产成人精品999在线观看| 亚洲1区在线观看| 日韩av一级| 免费一级欧美片在线观看网站| 日本大胆欧美人术艺术动态| 久久久久国产精品一区三寸| 久久久久九九精品影院| 日本一区福利在线| 夜夜嗨一区二区| 99精品视频在线观看免费播放| 欧美激情麻豆| 亚洲精品美女91| 亚洲综合不卡| 亚洲激情另类| 午夜国产一区二区| 影视先锋久久| 欧美亚洲国产精品久久| 成人污污视频| 国产精品xxx在线观看| 日本不卡中文字幕| 亚洲精品伊人| 深夜福利一区| 亚洲午夜免费| 亚洲精品少妇| 日韩影片在线观看| 亚洲精品伊人| 亚洲v天堂v手机在线| 久久亚洲电影| 午夜一级在线看亚洲| 欧美日韩视频| 在线观看免费一区二区| 欧美~级网站不卡| 青青久久av| 99久久亚洲精品| 欧美在线观看视频一区| 激情综合激情| 在线国产一区| 丝袜美腿亚洲一区二区图片| 蜜桃视频在线观看一区二区| 最新国产精品视频| 日韩精品电影一区亚洲| 国产探花一区在线观看| 国产精品一区二区免费福利视频| 国产精品一在线观看| 国产精品视频3p| 国产精品xxx| 红杏一区二区三区| 国产一区二区三区探花| 91视频一区| 色综合www| 1024精品久久久久久久久| 性欧美长视频| 欧美一区二区三区免费看| 久久精品xxxxx| 国产极品一区| 一本大道色婷婷在线| 视频一区中文| 亚洲精品激情| 国产精品啊v在线| 国产a久久精品一区二区三区| 日韩一区电影| 99精品99| 日本免费一区二区视频| 国产精品嫩模av在线| 91青青国产在线观看精品| 激情国产在线| 夜夜精品视频| 国产精品密蕾丝视频下载| 国产传媒在线观看| 欧美精品一线| 欧美综合精品| 电影天堂国产精品| 爽爽淫人综合网网站| 久久国产尿小便嘘嘘| 亚洲天堂av影院| 在线观看一区| 精品三级av在线导航| 午夜国产精品视频免费体验区| 亚洲一级在线| 麻豆精品视频在线| 五月天久久777| 国产精品午夜一区二区三区| 久久免费黄色| 国产亚洲观看| 欧美精品九九| 久久爱www.| 国产精品日本欧美一区二区三区| 国产欧美日韩在线观看视频| 成人免费网站www网站高清| 热久久国产精品| 美日韩一区二区三区| 制服诱惑一区二区| 粉嫩av一区二区三区四区五区 | 亚洲精品黄色| 色网在线免费观看| 日本成人在线一区| 日韩在线观看不卡| 久久精品 人人爱| 91精品91| 国产精品蜜芽在线观看| 亚洲精品影视| 久久精品国产亚洲夜色av网站| 青青草伊人久久| 久久精品欧美一区| 亚洲精品人人| 国产99精品| 欧美国产不卡| 亚洲九九精品| 激情欧美国产欧美| 麻豆中文一区二区| 亚洲精品人人| 成人免费电影网址| 欧美91在线| 日韩在线网址| 免费日韩精品中文字幕视频在线| 极品av在线| 麻豆国产欧美一区二区三区 | 精品久久91| 天海翼精品一区二区三区| 久久五月天小说| 中文在线а√在线8| 国产精选久久| 日本h片久久| 亚洲精品九九| 六月丁香综合| 91久久在线| 91高清一区| 国产91精品对白在线播放| 国产精品福利在线观看播放| 日韩精品亚洲专区| 美女精品网站| 中日韩男男gay无套| 成人自拍av| 国产精品不卡| 久久精品伊人| 欧美激情视频一区二区三区在线播放| 亚洲免费观看高清完整版在线观| 日韩亚洲国产欧美| 亚洲精品电影| 婷婷激情综合| 99久久精品费精品国产| 久久久久久黄| 欧美成人基地 |