手写一个Vue的数据绑定

Vue的数据绑定原理

具体废话我也不多啰嗦了,大家既然要看原理,网上一搜就是一大堆,无非就是利用了Object.defineProperty数据劫持这么个东西去设置和获取对象,那么大道理我就不废话,直接上干货

首先要写HTML

<div id="app">
       <input type="text" "In(event)" id="cur">
       <p id="text"></p>
</div>

Script

	class MyVue{
            constructor(options){
                // 接收参数
                this.$data = options;
                // 调用观察者
                this.Observer(this.$data)
            }

            Observer(val){
                // 在观察者中判断是否存在并且是否是个对象,因为Object.defineProperty是针对于对象来设置的
                if(!val || typeof val !== 'object'){
                    return
                }
                //利用Object.keys()来循环出下标
                Object.keys(val).forEach( keys => {
                    this.defineProperty(val, keys, val[keys])
                })
            }

            defineProperty(obj, key, value){
                //递归一遍观察者避免有嵌套关系
                this.Observer(value)
                Object.defineProperty(obj, key, {
                    get(){
                        return document.querySelector('#text').innerHTML
                    },
                    set(newValue){
                        // 如果相等直接返回
                        if(value == newValue){
                            return
                        }
                        document.querySelector('#text').innerHTML = newValue
                        // 这里需要注意一定要将新的值赋给旧的值,否则只会修改标签里面的值,不会修改对象中的值,最后导致数据清空不干净
                        value = newValue
                    }
                })
            }

        }
        
        var obj = {name:''}
        
        var my = new MyVue(obj)
        
        obj.name = 'Xiaoli'


        function In(e){
            obj.name = e.target.value
            console.log(obj)
        }
附图:

Vue工作机制
在这里插入图片描述
好了,以上就是完整的代码了,重点是在MyVue这个类中,接收完传递的参数,就去调用这个方法就可以了,有什么问题,各位兄弟联系我~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值