Vue2.X的数据双向绑定原理以及Vue3.X的数据双向绑定原理

本文深入探讨了Vue.js中数据双向绑定的实现原理,对比了Vue2.X使用Object.defineProperty与Vue3.0采用Proxy的不同之处,详细解释了两种方法的工作流程及各自的优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.Vue2.X的数据双向绑定原理:采用的是Object.defineProperty()方法

<!-- 1.Vue2.x采用的数据双向绑定原理 -->
    <input type="text" v-model>
    <p v-bind></p>
    <script>
        // 1.获取行内属性[v-model]
        let txt = document.querySelector('[v-model]');
        // 2.input框实现输入值
        txt.oninput = function(){
            // 3.将获取到的值赋给obj.name
            obj.name = txt.value;
        }

        let obj = {};
        // 4.IE8以及以下浏览器不识别该用法,自带了get和set方法
        // get的得到值变化,set是设置值的变化
        Object.defineProperty(obj,'name', {
            get(){
                console.log('get被调用了');
            },
            // set自带一个参数
            set(value){
                console.log('set被调用了');
                // 获取到p的属性
                let p = document.querySelectorAll('[v-bind]')[0];
                // 赋值
                p.innerHTML = value;
            }
        });

        // obj.name = 'summer';  // 触发了set
        // console.log(obj.name); // 触发了get
    </script>

 

2.Vue3.0实现数据的双向绑定原理:采用的是Proxy方法,proxy是个对象

<input type="text" v-model>
    <p v-bind></p>
    <script>
        let txt = document.querySelector('[v-model]');
        txt.oninput = function(){
           p.obj = txt.value;
        }


        let obj = {};
        let p = new Proxy(obj,{
            // 1.目标对象
            // 2.被获取的属性值
            // 3.Proxy或继承Proxy
            get(data, property, receiver){
                // console.log('get被调用了');
            },
            // 1.目标对象
            // 2.被获取的属性值
            // 3.被获取的value值
            // 4.最初被调用的对象Proxy
            set(data, property, value, receiver){
                // console.log('set被调用了');
                let p = document.querySelectorAll('[v-bind]')[0];
                p.innerHTML = value;       
            }
        });

        // p.name = 'summer';  // set被调用了
        // console.log(p.name); // get被调用了
        
    </script>

3.proxy比Object.defineProperty好在哪里?

proxy优势:

A.可以直接监听对象而非属性

B.可以直接监听数组的变化

C.Proxy有多达13种拦截方式,不限于apply、ownKeys、deleteProperty、has等等是Object.defineProperty不具备的

D.Proxy返回的是一个新对象,可以只操作新的对象达到目的,而Object.defineProperty只能遍历对象属性直接修改

Object.defineProperty的优势:

A.兼容性好,支持IE9,而Proxy的存在浏览器兼容性问题,而且无法用polyfill磨平。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值