最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當(dāng)前位置: 首頁 - 科技 - 知識(shí)百科 - 正文

vue使用Proxy實(shí)現(xiàn)雙向綁定的方法示例

來源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 21:59:45
文檔

vue使用Proxy實(shí)現(xiàn)雙向綁定的方法示例

vue使用Proxy實(shí)現(xiàn)雙向綁定的方法示例:前言:vue3.0要用Proxy來實(shí)現(xiàn)雙向綁定,因此先來嘗試一下實(shí)現(xiàn)方法。 1 Object.defineProperty 實(shí)現(xiàn) 原來vue2的實(shí)現(xiàn)使用Object.defineProperty,監(jiān)聽set,但對(duì)于數(shù)組直接下標(biāo)給數(shù)組設(shè)置值監(jiān)聽不了。 function observe(data) { i
推薦度:
導(dǎo)讀vue使用Proxy實(shí)現(xiàn)雙向綁定的方法示例:前言:vue3.0要用Proxy來實(shí)現(xiàn)雙向綁定,因此先來嘗試一下實(shí)現(xiàn)方法。 1 Object.defineProperty 實(shí)現(xiàn) 原來vue2的實(shí)現(xiàn)使用Object.defineProperty,監(jiān)聽set,但對(duì)于數(shù)組直接下標(biāo)給數(shù)組設(shè)置值監(jiān)聽不了。 function observe(data) { i

前言:vue3.0要用Proxy來實(shí)現(xiàn)雙向綁定,因此先來嘗試一下實(shí)現(xiàn)方法。

1 Object.defineProperty 實(shí)現(xiàn)

原來vue2的實(shí)現(xiàn)使用Object.defineProperty,監(jiān)聽set,但對(duì)于數(shù)組直接下標(biāo)給數(shù)組設(shè)置值監(jiān)聽不了。

function observe(data) {
 if (!data || typeof data !== 'object') {
 return;
 }
 // 取出所有屬性遍歷
 Object.keys(data).forEach(function(key) {
 defineReactive(data, key, data[key]);
 });
};

function defineReactive(data, key, val) {
 observe(val); // 監(jiān)聽子屬性
 Object.defineProperty(data, key, {
 enumerable: true, // 可枚舉
 configurable: false, // 不能再重寫defineProperty
 get: function() {
 return val;
 },
 set: function(newVal) {
 console.log('-------通知訂閱者--------')
 val = newVal;
 }
 });
}

2 使用Proxy實(shí)現(xiàn)

使用Proxy實(shí)現(xiàn)原理主要是new一個(gè)Proxy對(duì)象,代理你的data值,需要注意的一點(diǎn)是,對(duì)于數(shù)組的方法操作來說,會(huì)產(chǎn)生兩次賦值操作,一次是添加值,一次是改變他的length值,而對(duì)于Object.defineProperty監(jiān)聽不到的數(shù)組下標(biāo)給數(shù)組設(shè)置值,Proxy是可以監(jiān)聽到的。

function observe(data) {
 if (!data || typeof data !== 'object') {
 return;
 }
 // 取出所有屬性遍歷
 Object.keys(data).forEach(function(_k) {
 // Proxy不允許綁定在非對(duì)象上
 if (data[_k] && typeof data[_k] === 'object') {
 data[_k] = defineReactive(data[_k]);
 }
 });
}

function defineReactive(data) {
 return new Proxy(data, {
 set(target, key, value, proxy) {
 // 進(jìn)行數(shù)組操作時(shí),會(huì)進(jìn)行兩次set 一次數(shù)據(jù)改變,一次length改變,兩次改變data的值是不變,因此不應(yīng)該多分發(fā)一次消息
 if (
 Object.prototype.toString.call(data) === "[object Array]" &&
 key === "length"
 ) {
 Reflect.set(target, key, value, proxy);
 return true;
 }
 observe(data);
 Reflect.set(target, key, value, proxy);
 console.log('-------通知訂閱者--------')
 return true;
 }
 });

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

vue使用Proxy實(shí)現(xiàn)雙向綁定的方法示例

vue使用Proxy實(shí)現(xiàn)雙向綁定的方法示例:前言:vue3.0要用Proxy來實(shí)現(xiàn)雙向綁定,因此先來嘗試一下實(shí)現(xiàn)方法。 1 Object.defineProperty 實(shí)現(xiàn) 原來vue2的實(shí)現(xiàn)使用Object.defineProperty,監(jiān)聽set,但對(duì)于數(shù)組直接下標(biāo)給數(shù)組設(shè)置值監(jiān)聽不了。 function observe(data) { i
推薦度:
標(biāo)簽: VUE 的方式 的方
  • 熱門焦點(diǎn)

最新推薦

猜你喜歡

熱門推薦

專題
Top