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


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

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

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

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

    1. class Watcher {
    2. constructor(vm, attr, cb) {
    3. this.vm = vm;
    4. this.attr = attr;
    5. this.cb = cb;
    6. // 在创建观察者对象的时候就去获取当前的旧值
    7. this.oldValue = this.getOldValue();
    8. }
    9. getOldValue() {
    10. return CompilerUtil.getValue(this.vm, this.attr);
    11. }
    12. /**
    13. * 更新的方法, 用于判断新值和旧值是否相同
    14. * 如果不相同, 那么就调用回调函数
    15. */
    16. update() {
    17. let newValue = CompilerUtil.getValue(this.vm, this.attr);
    18. if (newValue !== this.oldValue) {
    19. this.cb(newValue, this.oldValue);
    20. }
    21. }
    22. }

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

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

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

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

    1. class Dep {
    2. constructor() {
    3. // 这个数组就是专门用于管理某个属性所有的观察者对象的
    4. this.subs = [];
    5. }
    6. /**
    7. * 订阅观察的方法
    8. * @param watcher 观察者对象
    9. */
    10. addSub(watcher) {
    11. this.subs.push(watcher);
    12. }
    13. /**
    14. * 发布订阅的方法
    15. */
    16. notify() {
    17. this.subs.forEach(watcher => watcher.update());
    18. }
    19. }

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

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

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

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

  • 相关阅读:
    家政预约小程序06服务展示
    【Ubuntu】安装gRPC
    java中如何将Object转Map及Map转Object呢?
    python数据处理作业4:使用numpy数组对象,随机创建4*4的矩阵,并提取其对角元素
    Met no ‘TRANSLATIONS’ entry in project
    火星探测器背后的人工智能:从原理到实战的强化学习
    Java CompletableFuture 并发编程
    Sql 异常 + Error
    Codeforces Round #815 (Div. 2) D. Xor-Subsequence(字典树优化DP)
    HTML网页设计制作大作业(div+css)---浩瀚天文 (13页有二级菜单)
  • 原文地址:https://blog.csdn.net/XiaohuihuiHuiYi/article/details/133858684