Vue双向绑定原理理解

现在的三大框架都是由双向绑定的,所谓双向绑定就是:数据变更,界面视图变更,视图变更,数据变更的实时更新

Vue的话 是用的 Object.defineProperty()方法来实现属性的监听的。直接看例子吧:

html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div id="a">test111</div>
<input placeholder="bind" id="ipt">
<div id="result">test222</div>
</body>
<script src="index.js"></script>
<script>
    
    let d={
        val:2,
        name:'test'
    };
    //t 是个观察者 观察d
    let t = new TwoWayBind(d);

    setTimeout(function () {
        t.name = 'success';
        console.log('this',d);
    },2000);
    document.getElementById('ipt').addEventListener('keyup', function (e) {
        t.val = e.target.value;

        document.getElementById('result').innerText = d.val;
    });

    // })


</script>
</html>

index.js

class TwoWayBind {
    constructor(data) {
        this.data = data;
        this.tem = Object.assign({}, this.data);
        this.addWatch();
    }

    addWatch() {
        let self = this;
        console.log('this.data', this.data);
        // console.log('11',self.data['obj']);
        Object.keys(this.data).forEach((key) => {
            Object.defineProperty(self, key, {
                set(newVal) {
                    console.log('newVal', newVal);
                    self.data[key] = newVal;
                },
                get() {
                    console.log('data', self.data);
                    return self.data[key];
                }
            });
        });
        // self.data['obj'] == 3;
        console.log('this', self.data);
    }
}


Object.defineProperty()第三个参数是一个函数回调,里面会由set和get方法 ,每次修改和获取对象属性的时候都会执行这里,

这里在中间会有一个观察者   如果数据发生改变,观察者就会通知他进行改变

可以 自己拷贝代码试试~~

猜你喜欢

转载自blog.csdn.net/wangshang1320/article/details/89517214