vue响应式原理

1.简介
何为响应式?简单来讲,就是在数据发生变化时,界面会重新渲染。
2.基本原理
发布订阅模式+数据劫持。当你把一个普通的 JavaScript 对象传入 Vue 实例作为 data 选项,Vue 将遍历此对象所有的 property,并使用 Object.defineProperty 把这些 property 全部转为 getter/setter。
这些 getter/setter 对用户来说是不可见的,但是在内部它们让 Vue 能够追踪依赖,在 property 被访问和修改时通知变更。这里需要注意的是不同浏览器在控制台打印数据对象时对 getter/setter 的格式化并不同,所以建议安装 vue-devtools 来获取对检查数据更加友好的用户界面。

每个组件实例都对应一个 watcher 实例,它会在组件渲染的过程中把“接触”过的数据 property 记录为依赖。之后当依赖项的 setter 触发时,会通知 watcher,从而使它关联的组件重新渲染。在这里插入图片描述
3.代码实现
首先通过发布订阅模式,先订阅好改变视图的方法;然后通过数据劫持,当数据发生改变时,会触发setter方法,在setter中发布(触发)之前订阅的方法,就会去调用该方法修改视图内容。

<div class="box"></div>
    <script>
        let obj = {};  // 数据对象
        // 订阅器
        let Dep = {
            eventList: {},  // 事件容器
            // 添加订阅
            on: function (key, fn) {
                (this.eventList[key] || (this.eventList[key] = [])).push(fn);
            },
            // 发布
            emit: function () {
                let key = Array.prototype.shift.call(arguments);
                let fns = this.eventList[key];
                if (!fns || fns.length === 0) {
                    return false;
                }
                for (let i = 0, fn; fn = fns[i++];) {
                    fn.apply(this, arguments);
                }
            }
        }

        // 数据劫持
        let dataWatch = function({data, tag, dataKey, selector}) {
            let value = '';
            let el = document.querySelector(selector);
            Object.defineProperty(data, dataKey , {
                get: function () {
                    return value;
                },
                set: function (val) {
                    this.value = val;
                    // 发布
                    Dep.emit(tag, val);
                }
            })
            // 订阅
            Dep.on(tag, function(text) {
                el.innerHTML = text;
            })
        }

        dataWatch({
            data: obj,
            tag: 'view',
            dataKey: 'one',
            selector: '.box',
        })
        // 初始化赋值
        obj.one = '视图';
    </script>

初始状态
在这里插入图片描述
值改变时,界面重新渲染
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大兵的猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值