【VUE】一文向您详细介绍~Vue计算属性computed(选项式API)

大家好,我是DX3906

🌈 欢迎莅临我的个人主页 👈这里是我静心耕耘大前端领域、真诚分享知识与智慧的小天地!🎇

前面和大家分享了《如何从零开始创建一个 Vue 应用》

                             《VUE模板语法(超详细讲解)》

                             《一文向您详细介绍~Vue响应式基础(选项式API)》

今天和大家共同学习一下Vue基于组合式API的计算属性

 

基础示例

模板中的表达式虽然方便,但也只能用来做简单的操作。如果在模板中写太多逻辑,会让模板变得臃肿,难以维护。比如说,我们有这样一个包含嵌套数组的对象:

export default {
  data() {
    return {
      author: {
        name: 'John Doe',
        books: [
          'Vue 2 - Advanced Guide',
          'Vue 3 - Basic Guide',
          'Vue 4 - The Mystery'
        ]
      }
    }
  }
}

我们想根据 author 是否已有一些书籍来展示不同的信息:

<p>Has published books:</p>
<span>{{ author.books.length > 0 ? 'Yes' : 'No' }}</span>

这里的模板看起来有些复杂。我们必须认真看好一会儿才能明白它的计算依赖于 author.books。更重要的是,如果在模板中需要不止一次这样的计算,我们可不想将这样的代码在模板里重复好多遍。

因此我们推荐使用计算属性来描述依赖响应式状态的复杂逻辑。这是重构后的示例:

export default {
  data() {
    return {
      author: {
        name: 'John Doe',
        books: [
          'Vue 2 - Advanced Guide',
          'Vue 3 - Basic Guide',
          'Vue 4 - The Mystery'
        ]
      }
    }
  },
  computed: {
    // 一个计算属性的 getter
    publishedBooksMessage() {
      // `this` 指向当前组件实例
      return this.author.books.length > 0 ? 'Yes' : 'No'
    }
  }
}
<p>Has published books:</p>
<span>{{ publishedBooksMessage }}</span>

我们在这里定义了一个计算属性 publishedBooksMessage

更改此应用的 data 中 books 数组的值后,可以看到 publishedBooksMessage 也会随之改变。

在模板中使用计算属性的方式和一般的属性并无二致。Vue 会检测到 this.publishedBooksMessage 依赖于 this.author.books,所以当 this.author.books 改变时,任何依赖于 this.publishedBooksMessage 的绑定都将同时更新。

computed属性的特性:

缓存:computed属性会缓存计算结果,在依赖不变时直接返回缓存值,提高性能。

响应式:当依赖发生变化时,computed属性会自动重新计算并更新。

依赖追踪:Vue会自动追踪computed属性所依赖的数据,并在其发生变化时触发重新计算。

计算属性缓存 vs 方法

你可能注意到我们在表达式中像这样调用一个函数也会获得和计算属性相同的结果:

<p>{{ calculateBooksMessage() }}</p>
// 组件中
methods: {
  calculateBooksMessage() {
    return this.author.books.length > 0 ? 'Yes' : 'No'
  }
}

若我们将同样的函数定义为一个方法而不是计算属性,两种方式在结果上确实是完全相同的,然而,不同之处在于计算属性值会基于其响应式依赖被缓存。一个计算属性仅会在其响应式依赖更新时才重新计算。这意味着只要 author.books 不改变,无论多少次访问 publishedBooksMessage 都会立即返回先前的计算结果,而不用重复执行 getter 函数。

这也解释了为什么下面的计算属性永远不会更新,因为 Date.now() 并不是一个响应式依赖:

computed: {
  now() {
    return Date.now()
  }
}

相比之下,方法调用总是会在重渲染发生时再次执行函数。

综上所述,在处理需要根据依赖动态计算出新值并且需要自动更新的情况下,推荐使用computed属性。而对于需要手动调用或不需要缓存的情况,可以使用methods方法。

计算属性缓存的使用场景

为什么需要缓存呢?想象一下我们有一个非常耗性能的计算属性 list,需要循环一个巨大的数组并做许多计算逻辑,并且可能也有其他计算属性依赖于 list。没有缓存的话,我们会重复执行非常多次 list 的 getter,然而这实际上没有必要!如果你确定不需要缓存,那么也可以使用方法调用。

可写计算属性

计算属性默认是只读的。当你尝试修改一个计算属性时,你会收到一个运行时警告。只在某些特殊场景中你可能才需要用到“可写”的属性,你可以通过同时提供 getter 和 setter 来创建:

export default {
  data() {
    return {
      firstName: 'John',
      lastName: 'Doe'
    }
  },
  computed: {
    fullName: {
      // getter
      get() {
        return this.firstName + ' ' + this.lastName
      },
      // setter
      set(newValue) {
        // 注意:我们这里使用的是解构赋值语法
        [this.firstName, this.lastName] = newValue.split(' ')
      }
    }
  }
}

现在当你再运行 this.fullName = 'John Doe' 时,setter 会被调用而 this.firstName 和 this.lastName 会随之更新。

最佳实践

Getter 不应有副作用

计算属性的 getter 应只做计算而没有任何其他的副作用,这一点非常重要,请务必牢记。举例来说:不要改变其他状态、不要在 getter 中做异步请求或者更改 DOM!一个计算属性的声明中描述的是如何根据其他值派生一个值。因此 getter 的职责应该仅为计算和返回该值。在之后的学习中我们会讨论如何使用根据侦听器其他响应式状态的变更来创建副作用。

结语

🔥如果此文对你有帮助的话,欢迎💗关注、👍点赞、⭐收藏、✍️评论,支持一下博主~ 

要实现一个Vue自定义组件,使其能够处理动态数据字典并在下拉列表中展示,首先需要掌握Vue组件的基础知识,以及如何使用Element UI库中的`el-select`组件。接下来,我们来探讨如何创建一个名为`DataDictionarySelect`的自定义组件,该组件能够通过API接口获取数据,并且实现与业务实体的动态交互。 参考资源链接:[Vue自定义组件封装数据字典:简化下拉列表实现](https://wenku.csdn.net/doc/4rdowxr16w?spm=1055.2569.3001.10343) 在创建`DataDictionarySelect`组件时,我们需要定义组件的属性、数据和方法。组件的属性包括`typeCode`,用于指定数据字典类型;数据部分应包含从API接口获取的字典数据和选中项;方法则涉及获取数据和更新选中项。 具体实现步骤如下: 1. 定义组件的属性`typeCode`,这将用于指定数据字典类型,并作为请求API接口时的参数。 2. 在组件的`data`函数中定义`options`和`selectedValue`,其中`options`用于存储从API接口获取的数据字典,`selectedValue`用于存储当前选中的字典值。 3. 使用`created`或`mounted`生命周期钩子,在组件挂载后通过API接口请求数据字典数据,然后更新`options`数组。 4. 利用计算属性`computed`来处理`selectedValue`,确保组件与外部业务实体的双向绑定。 5. 在组件模板中使用`el-select`和`el-option`,并通过`v-for`指令动态渲染选项列表,根据`options`数组填充`el-option`的`value`和`label`属性。 此外,为了增强组件的功能,可以考虑添加一些额外的方法,例如`refreshData`用于刷新字典数据,`selectValue`用于外部强制更新选中的值。 通过上述步骤,你可以创建一个高效、可重用的`DataDictionarySelect`组件,它将简化前端代码,提高开发效率,并且易于维护。建议在实现过程中参考《Vue自定义组件封装数据字典:简化下拉列表实现》一文,以获得更深入的理解和实用的技巧。 参考资源链接:[Vue自定义组件封装数据字典:简化下拉列表实现](https://wenku.csdn.net/doc/4rdowxr16w?spm=1055.2569.3001.10343)
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

寻找DX3906

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

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

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

打赏作者

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

抵扣说明:

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

余额充值