跟我一起学Vue3——计算属性和侦听器

152 阅读3分钟

前言

⭐️ 本专栏主要内容为「 Vue3官方文档 」的学习过程 ✍🏼

⭐️ 本专栏适合人群:Vue小白、学完一遍Vue的掘友 👨🏼‍💻

⭐️ 本专栏的阅读顺序和官方文档顺序相同 📖

⭐️ 英雄不问出处,这个专栏一定让你收获满满 🥳!

⭐️ 静心,思考,实操,坚持,巩固,满载而归 🥰!

⭐️ 欢迎各位掘友在评论区交流 🤡

本节内容

  • computed
  • watch

第六章 计算属性和侦听器

第一节 计算属性 computed

computed解决了模板内表达式逻辑过多导致模板过重难以维护的状况。

<div class="computed">
  <span>has fruits: {{ getFruits }}</span>
</div>
<script>
  const inter = {
    data() {
      return {
        fruits: ['apple','banana','orange']
      };
    },
    computed: {
      getFruits() {
        return this.fruits.length > 0 ? 'yes' : 'no'
      }
    }
  };
  Vue.createApp(inter).mount(".computed");
</script>

效果:has fruits: yes

声明的计算属性getFruitsfruits联动,当fruits更新,getFruits也会更新。

计算属性缓存 vs 方法

在方法中定义一个和计算属性相同的函数,从最终结果来说,这两种实现方式完全相同,并且效果也完全一样。

不同的是计算属性将基于他们的响应依赖关系缓存,计算属性只会在相关响应式依赖发生改变时重新求值。这意味着computed关联的数据没有发生变化,多次访问 对应的computed时会立即返回之前的计算结果,而不必再次执行函数。在方法声明则不同,每次触发重新渲染时,都会导致方法重新执行。

在写计算属性时,return中最好包含组件实例中的响应式数据,否则计算属性将永远不会更新

为什么需要缓存?假设我们有一个性能开销比较大的计算属性 list,它需要遍历一个巨大的数组并做大量的计算。然后我们可能有其他的计算属性依赖于 list。如果没有缓存,我们将不可避免的多次执行 list 的 getter!如果你不希望有缓存,请用 method 来替代。

计算属性的setter

计算属性默认只有getter

computed: {
  fullName: {
    // getter
    get() {
      return this.firstName + ' ' + this.lastName
    },
    // setter
    set(newValue) {
      const names = newValue.split(' ')
      this.firstName = names[0]
      this.lastName = names[names.length - 1]
    }
  }
}

现在再运行 vm.fullName = 'John Doe' 时,setter 会被调用,vm.firstNamevm.lastName 也会相应地被更新。

第二节 侦听器

当需要在数据变化时执行异步或开销较大的操作时,这个方式是最有用的。

使用 watch 选项允许我们执行异步操作 (访问一个 API),并设置一个执行该操作的条件。这些都是计算属性无法做到的。

除了 watch 选项之外,你还可以使用命令式的 vm.$watch API

什么时候用watch? 什么时候用computed?

当你要做的操作存在异步的时候用watch

当某个属性和多个响应式属性关联求对应值时,用computed

结语

专栏同步代码:Github

掘金社区:跟我一起学Vue3

作者简介:

一个满脑子奇怪知识的小商同学,在校ing,懂点设计,懂点排版,为成为一名优秀的前端工程师而努力。