VUE 数据上绑定原理 以及简易实现

1.vue实现数据双向绑定主要是:采用数据劫持结合发布者-订阅者模式的方式。

通过Object.defineProperty()来劫持各个属性的setter,getter,在数据变动时发布消息给订阅者,触发相应监听回调。

当把一个普通 Javascript 对象传给 Vue 实例来作为它的 data 选项时。Vue 将遍历它的属性,用 Object.defineProperty 将它们转为 getter/setter。用户看不到 getter/setter,但是在内部它们让 Vue 追踪依赖,在属性被访问和修改时通知变化。

vue的数据双向绑定 将MVVM作为数据绑定的入口,整合Observer,Compile和Watcher三者。通过Observer来监听自己的model的数据变化,通过Compile来解析编译模板指令(vue中是用来解析 {{}})。最终利用watcher搭起observer和Compile之间的通信桥梁,达到数据变化 —>视图更新;

*数据劫持:当我们访问或设置对象的属性的时候,都会触发相对应的函数,然后在这个函数里返回或设置属性的值。我们可以在触发函数的时候动一些手脚做点我们自己想做的事情,这也就是“劫持”操作

2.简易实现

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <input type="text" class="aa" value="" oninput="newdata(this.value)">
    <h2 class="bb"></h2>

</body>
<script>
    //获取DOM节点
    let data = {}
    let aa = document.querySelector('.aa')
    let bb = document.querySelector('.bb')
    Object.defineProperty(data, 'msg', {

        get: function () {
            return data
        },
        set: function (newvalue) {
            aa.value = newvalue
            bb.innerHTML = newvalue
        }

    })
    // 最初的赋值
    title.innerHTML = data.msg;
    ipt.value = data.msg;

    // 拿到input的数据,修改msg,当msg修改时,会触发set方法
    function newdata(value) {
        console.log(value)
        data.msg = value
    }
</script>

</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值