Vue3.0底层原理详解
Posted web-gmy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Vue3.0底层原理详解相关的知识,希望对你有一定的参考价值。
// 一)、proxy和defineProperty的区别
1. proxy能代理数组
2. 兼容性 proxy ie11以上 defineProperty 兼容 ie8以上
3. proxy是代理,defineProperty是劫持
4. 配合Reflect,Reflect有13种方法,处理数据更灵活
// 二)、基本用法
let obj = name: 'lilei' ;
let proxy = new Proxy(obj,
// target目标对象,key 目标对象的key
get(target, key)
return target[key];
,
//val 需要设置的值
set(target, key, val)
target[key] = val;
);
proxy.name = 1;
// 三)、代理数据 实现更新
let obj =
name: "lilei",
hobit:
one: "football",
two: "eat"
,
ary: [1, 2, 3, 4]
;
function update()
console.log("更新");
handle =
// target 目标对象,key 目标对象的key
get(target, key)
// 判断target[key]是不是对象,如果是再返回劫持的对象(继续代理)
if (typeof target[key] == "object" && typeof target[key] != null)
return new Proxy(target[key], handle);
return Reflect.get(target, key);
// return target[key];
,
// val 需要设置的值
set(target, key, val)
// 因为数组的长度改变也会触发更新
if (key == "length") return true;
update();
return Reflect.set(target, key, val);
// target[key] = val;
;
let proxy = new Proxy(obj, handle);
console.log(proxy);
proxy.name = "lala";
proxy.hobit.one = "run";
proxy.ary.push(5);
console.log(proxy);
// 数组的更新会触发2次
// 数组触发更新触发两次是为什么
// 检测到length的改变
// 四)、参数使用
let obj = name: 1 ;
let handle =
// receiver 它总是指向原始的读操作所在的那个对象,一般情况下就是 Proxy 实例
get(target, key, receiver)
return receiver;
,
set(target, key, val, receiver)
return Reflect.set(target, key, val, receiver);
;
let proxy = new Proxy(obj, handle);
let res = proxy.getReceiver === proxy;
console.log(res); // true
// proxy和defineproper区别
// proxy可以代理数组,defineproperty只能代理对象
// pproxy性能好,没有的属性也可以进行双向绑定
// defineproperty兼容ie11,没有的属性不可以进行双向数据绑定
// proxy代理
let obj = name: 1, age: age: 1 ;
let arr = [1, 2, 3];
let handle =
get(target, key)
// 如果对象有多层,继续代理
if (typeof target[key] == "object" && typeof target[key] != null)
return new Proxy(target[key], handle);
return Reflect.get(target, key);
// return target[key];
,
// 数组的更新会触发2次
set(target, key, value)
if (key == "length") return true;
console.log("触发更新");
return Reflect.set(target, key, value);
// return (target[key] = value);
;
let proxy = new Proxy(arr, handle);
// 数组触发更新触发两次是为什么
// 检测到length的改变
proxy.push(1);
// proxy.name = 123;
console.log(proxy);
// console.log(obj);
以上是关于Vue3.0底层原理详解的主要内容,如果未能解决你的问题,请参考以下文章