简单实现Vue2.0(Object.defineProperty)和Vue3.0(Proxy)的数据双向绑定

vue2中通过Object.defineProperty实现数据双向绑定
<body>

    <input type="text" id="ipt" >
    <h1 id="h1"></h1>

    <script>
        
        let obj = { val:"" }
        
        //每次修改obj对象中的val会造成死循环,所以我们需要定义一个新对象作为中间人
        let newobj = JSON.parse(JSON.stringify(obj))

        //三个参数第一个是我们要监听的对象、第二个是我们要监听的属性、第三个就是我们的get和set方法
        Object.defineProperty( obj, 'val', {
            
            get: function () {
                return newobj.val
            },
            set: function (val) {
                newobj.val = val
                objserve()
            }
        } )

        function objserve () {
            ipt.value  = obj.val
            h1.innerHTML = obj.val
        }

        ipt.oninput = function () {
            obj.val = this.value
        }

    </script>
</body>
vue3中通过Proxy实现数据双向绑定
<body>

    <!-- input标签 -->
    <input type="text" id="ipt">
    <!-- 展示内容 -->
    <h1 id="h1"></h1>

    <script>
        
        //双向绑定的属性
        let obj = { val : '' }

        //两个参数、proxy不需要指定属性、它可以监听对象里面的所有属性
        obj = new Proxy( obj, {
            
            //获取属性值
            //target就是我们绑定的对象、prop是我们要获取的属性、第三个proxy参数是可选的(我们监听的对象实例)
            get: function ( target, prop, proxy ) {
                return target[prop]
            },

            //修改属性值
            //set有四个参数、target就是我们绑定的对象、prop是我们要获取的属性、第三个是我们要修改的属性值、第四个proxy参数是可选的(我们监听的对象实例)
            //相对于get方法多了一个属性值
            set: function ( target, prop, val ) {
            	//将我们要修改的属性进行赋值
                target[prop] = val
                //将obj.val绑定给input框的value
                //并把内容展示到了页面
                objserve()
            }

        } )

        //修改属性值后调用的方法
        function objserve () {
            ipt.value = obj.val
            h1.innerHTML = obj.val
        }

        //给输入框绑定输入事件
        ipt.oninput = function () {
            obj.val = this.value
        }

    </script>
</body>

简单的实现了数据双向绑定,写的不好请笑纳

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值