Vue2.0、3.0双向数据绑定

引言

大家都知道Vue双向数据绑定就是指v-model指令,而v-model的本质就是input、value的语法糖,语法糖就是方便我们代码编写,那么它底层又是怎样实现的呢?本篇将会以不同的vue版本为切入点,进行模拟实现。

vue2.0-Object.definedProperty()

 	<input type="text" id='inp'>
    <div id='view'></div>
    <script>
        const input = document.getElementById('inp');
        const view = document.getElementById('view');

        let data = {
            // name: 'view'
            valueObj:{
                name:'view'
            }
        }

        function update() { //更新视图
            view.innerText = data.valueObj.name;
        }

        input.oninput = function () { //更新数据 
            data.valueObj.name = this.value
        }

        function observerData(obj) {
            if (!obj || typeof obj != 'object') return obj; //容错 + 递归出口

            Object.keys(obj).forEach(key => {
                definedRective(obj, key, obj[key]);
            })
        }

        observerData(data);

        function definedRective(obj, key, val) {

            observerData(val); //深层数据递归处理

            Object.defineProperty(obj, key, {
                get() {
                    return val;
                },
                set(newVal) {
                    if (val === newVal) return; //优化性能
                    val = newVal;
                    update();
                }
            })
        }
    </script>

缺点

  1. 不能直接监控数组,而是间接重写Array.prototype上的数组方法(就是vue中常常听见的数组变异方法)比如push、unshfit…属性,监听数组原型上的这些方法,进而实现更新

  2. 如果被监听对象在执行监听之后又重新添加了属性,这些属性值则无法监听到

vue3.0-Proxy&Reflect

        let oProxy = new Proxy(data, {
            get(target, key, receiver) {
                console.log(1)
                return Reflect.get(target, key);
            },
            set(target, key, newValue, receiver) {
                console.log(1)
                return Reflect.set(target, key, newValue)
            }
        });

说明
ES6的Proxy&Reflect完美解决了ES5Object.definedProperty()缺点,上面已经指出,但是浏览器不能直接兼容,只能间接通过babel语言降级,因此这里只给出关键代码大家了解一下即可。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值