• vue.js 计算属性与$watch的区别?


    作者:日知
    链接:https://www.zhihu.com/question/55846720/answer/331760496
    来源:知乎
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    设计模式不同

    Computed 是一种声明式的解决方案,我们只需要告诉 vue 某个属性的构成方法,就可以一劳永逸的放手不管了。

    computed: {
      fullName: function () {
        return this.firstName + ' ' + this.lastName
      }
    }

    Watch 是一种命令式的解决方案,我们需要自己处理 vue 某个属性依赖要素的变化,根据变化重置这个属性。

    watch: {
      firstName: function (val) {
        this.fullName = val + ' ' + this.lastName
      },
      lastName: function (val) {
        this.fullName = this.firstName + ' ' + val
      }
    }

    因此,个人十分享受 Computed ,甚至不惜使用 vue-async-computed 来实现异步下的 Computed。

    asyncComputed: {
      async someCalculation () {
        const x = await someAsycFunction()
        const y = await anotherAsyncFunction()
        return x + y
      }
    }

    响应行为不同

    Computed 的响应是 deep 的响应,即在计算过程中用到的对象的属性发生变化,是可以被监听到的。

    computed: {
      fullName: function () {
        // this.name 的属性 firstName/lastName 变化时 fullName 会响应。
        return this.name.firstName + ' ' + this.name.lastName
      }
    }

    然而,一旦 Computed 没有在模板中使用,vue 是不会为我们计算 Computed 内容的。

    Watch 的响应默认为非 deep 的响应,即观测的是某个对象的字面量。当然,我们可以为 Watch 设置 deep 响应类型或是监听其属性

    watch: {
      name: function () {
        // this.name 的属性 firstName/lastName 变化时不会触发。
        // TODO
      }
    }

    总之

    两者的使用应当是互补的:

    在获得较为简单的属性,且用于展示时,用 computed 可以简化书写。

    在进行比较复杂的异步操作,或有比较明显的副作用时,用 watch 逻辑更清晰。

    注:个人觉得依赖较多的仍应该用 computed 或 async-computed。

    另外,需要注意的是,watch 的计算早于同依赖的 computed。

  • 相关阅读:
    基于TFTP协议的远程升级设计
    BZOJ 刷题记录 PART 6
    解决org.hibernate.LazyInitializationException: could not initialize proxy
    在不同版本号hdfs集群之间转移数据
    从零開始制作H5应用(4)——V4.0,增加文字并给文字加特效
    不再安全的 OSSpinLock
    @synchronized 再考察
    ReactiveCocoa
    怎样界定问题
    问题是什么
  • 原文地址:https://www.cnblogs.com/chinasoft/p/15915259.html
Copyright © 2020-2023  润新知