VUE2.X双向绑定是通过数据劫持结合发布-订阅者模式实现的,核心是通过 Object.defineProperty() 劫持各个属性值的 getter 和 setter,在数据变动时发布消息给订阅者,从而触发相应的监听回调,而VUE3.X则是通过ES6的 Proxy 对象实现的。
-
什么是
ProxyProxy意为代理,它是 js 的内置对象,用于拦截和更改对象相关的不同操作行为,不支持 IE 和 Safari <10 的版本。let obj = {name: 'zs', age: 18}; // Proxy 接收两个参数,target 和 handler // target: 需要代理的目标对象 // handler: 行为对象,属性是当执行一个操作时定义代理的行为函数 let state = new Proxy(obj, { get(obj, key) { ... }, set(obj, key, newVal) { ... } }) -
Proxy与getter/setter的区别-
语法不同
相比
getter/setter,Proxy的语法会更为冗长。 -
与原始对象的交互方式不同
Proxy会创建一个新对象供用户与之交互,而不是直接修改原对象,在使用Proxy的情况下,原始对象与代理对象为引用关系,即对原始对象做的修改都会影响到代理对象,但是不会触发handler里的行为函数。(更多行为函数可查阅:Proxy行为函数)
getter/setter会直接修改原对象。
-
-
Proxy实现数据响应-
get有两个参数,分别是原始对象target和获取的对象属性名key,例:let obj = {name: 'zs', age: 18}; let state = new Proxy(obj, { get(obj, key) { console.log(obj, key); // {name: 'zs', age: 18} 'name' return obj[key]; } }) console.log(state.name); //'zs' -
set有三个参数,分别是原始对象target、设置的对象属性名key和设置的新值value,值得注意的是,set函数最后需要返回值,用来告知Proxy本次操作是否成功 ,例:let arr = [1, 3, 5]; let state = new Proxy(arr, { get(arr, index) { return arr[index]; }, set(arr, index, value) { // [1, 3, 5] '3' 7 // [1, 3, 5] 'length' 4 console.log(arr, index, value); arr[index] = value; return true; } }) state.push(7); console.log(state); // Proxy {0: 1, 1: 3, 2: 5, 3: 7} console.log(obj); // [1, 3, 5, 7]
目录:VUE3.X笔记——目录
上一篇:VUE3.X——递归监听与非递归监听
下一篇:VUE3.X——获取dom元素 -
Vue2.x采用数据劫持和发布-订阅者模式实现双向绑定,通过Object.defineProperty()监听属性变化。Vue3.x则引入了ES6的Proxy对象,创建代理对象来拦截和修改对象操作。Proxy提供了更灵活的拦截行为,但语法相对复杂,且不支持部分旧版浏览器。在数据响应方面,get和set方法分别用于获取和设置属性值,同时可以进行额外的操作,如日志记录或验证。
782

被折叠的 条评论
为什么被折叠?



