手撕Vue-数据驱动界面改变上

经过上一篇的介绍,已经实现了监听数据的变化,接下来就是要实现数据变化后,界面也跟着变化,这就是数据驱动界面改变。

想要实现数据变化之后更新UI界面,我们可以使用发布订阅模式来实现,先定义一个观察者类, 再定义一个发布订阅类, 然后再通过发布订阅的类来管理观察者类。

接下来我们就来实现这个代码。

定义一个观察者类,观察属性的变化,当属性变化时,触发回调函数。

javascript 复制代码
class Watcher {
    constructor(vm, attr, cb) {
        this.vm = vm;
        this.attr = attr;
        this.cb = cb;

        // 在创建观察者对象的时候就去获取当前的旧值
        this.oldValue = this.getOldValue();
    }

    getOldValue() {
        return CompilerUtil.getValue(this.vm, this.attr);
    }

    /**
     * 更新的方法, 用于判断新值和旧值是否相同
     * 如果不相同, 那么就调用回调函数
     */
    update() {
        let newValue = CompilerUtil.getValue(this.vm, this.attr);

        if (newValue !== this.oldValue) {
            this.cb(newValue, this.oldValue);
        }
    }
}

上方的类中主要有三个属性,分别是vm, attr, cb,vm是Vue的实例,attr是属性名,cb是回调函数。

定义了一个getOldValue方法,用于获取旧值,这个方法在创建观察者对象的时候就会调用,用于获取旧值。

定义了一个update方法,用于更新数据,当数据发生变化时,就会调用这个方法,用于判断新值和旧值是否相同,如果不相同,就调用回调函数。

接下来我们就来定义一个发布订阅类,用于管理观察者对象。

javascript 复制代码
class Dep {
    constructor() {
        // 这个数组就是专门用于管理某个属性所有的观察者对象的
        this.subs = [];
    }

    /**
     * 订阅观察的方法
     * @param watcher 观察者对象
     */
    addSub(watcher) {
        this.subs.push(watcher);
    }

    /**
     * 发布订阅的方法
     */
    notify() {
        this.subs.forEach(watcher => watcher.update());
    }
}

上方的类中主要有两个方法,分别是addSub和notify:

  • addSub方法用于订阅观察的方法,将观察者对象添加到数组中。
  • notify方法用于发布订阅的方法,遍历数组中的观察者对象,调用观察者对象的update方法。

构造器中定义了一个数组,用于管理某个属性所有的观察者对象。

好了,现在我们已经定义了观察者类和发布订阅类,先到此为止,下一篇文章再继续。

相关推荐
m0_敲代码的彭于晏1684 小时前
Vercel 前端部署平台深度评测
前端
2301_32241428044 小时前
基于SpringBoot+Vue的休闲零食超市管理系统的设计与实现59004-计算机毕设 原创(免费领源码+部署教程+开发环境)
java·vue.js·spring boot·redis·mysql·决策树·推荐算法
怕浪猫6 小时前
外包和大厂的前端代码,差在凌晨三点
前端·面试·github
m0_敲代码的彭于晏1686 小时前
Vercel 前端部署与全栈开发实战指南
前端·状态模式
徐小夕6 小时前
花了3个月,我们做了一款 AI 版的“飞书文档”
前端·算法·github
贾伟康6 小时前
【化学实验室|17】HarmonyOS ArkTS 亮暗色与视觉令牌实战:集中颜色、间距和交互状态避免页面割裂
前端·移动开发·harmonyos·arkts·arkui
Csvn7 小时前
SSR/SSG/ISR(上):峡谷与渲染策略的时间预算
前端
Csvn7 小时前
SSR/SSG/ISR(下):可交互性、新鲜度与回源账
前端
酷炫码神8 小时前
Day 10|Pinia 状态管理:把散落在各组件的数据,收进一个全局仓库
android·开发语言·javascript
Elcker10 小时前
YnuoAgent(依诺):一个 npm 包,跑起属于自己的 AI 研发平台
前端·人工智能·npm