vue3簡易實現(xiàn)proxy代理實例詳解
vue3 簡易實現(xiàn)proxy代理
1.基礎數(shù)據(jù)
const state = reactive({ name: 'cld', age: 26, like: 'paint' });
console.log("獲取更改age前的值", state.age);
state.age = 28;
console.log("獲取更改age后的值", state.age);
核心邏輯 reactive
export function reactive (target) {
// 創(chuàng)建一個響應式對象 對象 set map array object ...
return createReactiveObject(target, {
// proxy + reflect
get (target, key, receiver) {
// 可能無法訪問key target[key]是否成功不會報錯 所以使用reflect
const res = Reflect.get(target, key, receiver); // == target[key];
console.log('用戶取值', target, key);
return res;
},
set (target, key, value, receiver) {
const res = Reflect.set(target, key, value, receiver);
console.log('用戶設置值', target, key);// == target[key]=value;
return res;
}
});
}
const isObject = (obj) => { return typeof obj == 'object' && obj != null; };
function createReactiveObject (target, baseHandler) {
// 如果不是對象 不需要代理
if (!isObject(target)) {
return target;
}
// target目標對象 baseHandler get/set 值處理方法,
const observed = new Proxy(target, baseHandler);
return observed;
}
/** Reflect 作用 * 可能無法訪問key target[key]是否成功不會報錯 * 所以使用reflect * Reflect.get 返回值 Reflect.set 返回值boolean **/ const res = Reflect.get(target, key, receiver); // Reflect.get(target, key, receiver); 等價于 target[key] 并返回值 const res = Reflect.set(target, key, value, receiver); // res 值為true/false 表示是否成功設置值
代理實現(xiàn)效果

vue3取值的時候才走代理操作,不取值的時候,不需要深度遍歷代理,
vue2一開始就深度遞歸
當數(shù)據(jù)里為數(shù)組或對象的情況下,需要遞歸代理
get (target, key, receiver) {// proxy+reflect
const res = Reflect.get(target, key, receiver);// == target[key];
if (isObject(res)) {
return reactive(res);
}
return res;
};
修改值的時候,具體是新增操作還是修改操作 可以定位
set (target, key, value, receiver) {
const hasKey = hasOwn(target, key);
const oldValue = target[key]; // Reflect.set 操作前還是歷史數(shù)據(jù)
const res = Reflect.set(target, key, value, receiver);
if (!hasKey) {
// 新增屬性
console.log('用戶新增值', target, key);
} else if (value !== oldValue) {
//修改操作
console.log('用戶修改值', target, key);
}
return res;
};
push數(shù)據(jù)的時候,會先取arr的push屬性,然后取array的length屬性

設置值的時候 key是index索引,在該索引上增加值

其實在該索引上增加值之后,還會再次觸發(fā)set 應該數(shù)組的長度改變了
為了減少多余的無必要的操作,可以通過判斷不執(zhí)行任何操作
總結
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注腳本之家的更多內容!
相關文章
關于IDEA中的.VUE文件報錯 Export declarations are not supported by cu
這篇文章主要介紹了關于IDEA中的.VUE文件報錯 Export declarations are not supported by current JavaScript version的問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-10-10
利用vue對比兩組數(shù)據(jù)差異的可視化組件詳解
這篇文章主要給大家介紹了關于利用vue對比兩組數(shù)據(jù)差異的可視化組件的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用vue具有一定的參考學習價值,需要的朋友可以參考下2021-09-09
基于ant-design-vue實現(xiàn)表格操作按鈕組件
這篇文章主要為大家介紹了基于ant-design-vue實現(xiàn)表格操作按鈕組件示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-06-06
vue3??mark.js?實現(xiàn)文字標注功能(案例代碼)
這篇文章主要介紹了vue3??mark.js?實現(xiàn)文字標注功能,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-09-09
詳解使用Vue Router導航鉤子與Vuex來實現(xiàn)后退狀態(tài)保存
本篇文章主要介紹了詳解使用Vue Router導航鉤子與Vuex來實現(xiàn)后退狀態(tài)保存,具有一定的參考價值,有興趣的可以了解一下2017-09-09

