vue使用Proxy實現(xiàn)雙向綁定的方法示例
前言:vue3.0要用Proxy來實現(xiàn)雙向綁定,因此先來嘗試一下實現(xiàn)方法。
1 Object.defineProperty 實現(xiàn)
原來vue2的實現(xiàn)使用Object.defineProperty,監(jiān)聽set,但對于數(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實現(xiàn)
使用Proxy實現(xiàn)原理主要是new一個Proxy對象,代理你的data值,需要注意的一點是,對于數(shù)組的方法操作來說,會產生兩次賦值操作,一次是添加值,一次是改變他的length值,而對于Object.defineProperty監(jiān)聽不到的數(shù)組下標給數(shù)組設置值,Proxy是可以監(jiān)聽到的。
function observe(data) {
if (!data || typeof data !== 'object') {
return;
}
// 取出所有屬性遍歷
Object.keys(data).forEach(function(_k) {
// Proxy不允許綁定在非對象上
if (data[_k] && typeof data[_k] === 'object') {
data[_k] = defineReactive(data[_k]);
}
});
}
function defineReactive(data) {
return new Proxy(data, {
set(target, key, value, proxy) {
// 進行數(shù)組操作時,會進行兩次set 一次數(shù)據改變,一次length改變,兩次改變data的值是不變,因此不應該多分發(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;
}
});
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
VUE 更好的 ajax 上傳處理 axios.js實現(xiàn)代碼
本篇文章主要介紹了VUE 更好的 ajax 上傳處理 axios.js實現(xiàn)代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-05-05
Vue實現(xiàn)無限輪播效果時動態(tài)綁定style失效的解決方法
最近在開發(fā)中遇到了一個新需求:列表輪播滾動,實現(xiàn)方式也有很多,比如使用第三方插件,但是由于不想依賴第三方插件,想自己實現(xiàn),于是我開始了嘗試,但是在這個過程中遇到了動態(tài)綁定style樣式不生效,所以本文介紹了Vue實現(xiàn)無限輪播效果時動態(tài)綁定style失效的解決方法2024-08-08
iView UI FORM 動態(tài)添加表單項校驗規(guī)則寫法實例
這篇文章主要為大家介紹了iView UI FORM 動態(tài)添加表單項校驗規(guī)則寫法實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-01-01
五步教你用Nginx部署Vue項目及解決動態(tài)路由刷新404問題
nginx 是一個代理的服務器,下面這篇文章主要給大家介紹了關于如何通過五步教你用Nginx部署Vue項目及解決動態(tài)路由刷新404問題的相關資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下2022-12-12
elementui源碼學習之仿寫一個el-divider組件
這篇文章主要為大家介紹了elementui源碼學習之仿寫一個el-divider組件示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-08-08
Element中Upload組件上傳功能實現(xiàn)(圖片和文件的默認上傳及自定義上傳)
這篇文章主要介紹了Element中Upload組件上傳功能實現(xiàn)包括圖片和文件的默認上傳及自定義上傳,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧2024-01-01
Vue+ElementUI?封裝簡易PaginationSelect組件的詳細步驟
這篇文章主要介紹了Vue+ElementUI?封裝簡易PaginationSelect組件,這里簡單介紹封裝的一個Pagination-Select組件幾個步驟,結合示例代碼給大家介紹的非常詳細,需要的朋友可以參考下2022-08-08

