原来 Vue3 的 computed 属性还能这么用啊🔥
Hello,又见面了,我是渔戈!
我们之前已经跟 Vue3 来了一场美丽的邂逅了,也介绍了 Vue3 的一些基本指令,今天我们就来讲讲 Vue3 的 Options-API
相关文章:邂逅Vue3
1.复杂 data 的处理方式
我们知道,在模板中可以直接通过插值语法显示一些 data 中的数据。但是在某些情况,我们可能需要对数据进行一些转化后再显示,或者需要将多个数据结合起来进行显示.比如我们需要对多个 data 数据进行运算、三元运算符来决定结果、数据进行某种转化后显示.
在模板中使用表达式,可以非常方便的实现,但是设计它们的初衷是用于简单的运算,模板中放入太多的逻辑会让模板过重和难以维护,且如果多个地方都使用到,那么会有大量重复的代码.那么还有其他的解决方法吗?
有 那就是计算属性 computed
2.认识计算属性 computed
2.1 什么是计算属性呢?
- 官方并没有给出直接的概念解释 
- 而是说:对于任何包含响应式数据的复杂逻辑,你都应该使用计算属性 
- 计算属性将被混入到组件实例中。所有 getter 和 setter 的 this 上下文自动地绑定为组件实例; 
2.2 计算属性的用法:
- 选项:computed 
- 类型:{ [key: string]: Function | { get: Function, set: Function } } 
2.3 计算属性的基础示例
模板中的表达式虽然方便,但也只能用来做简单的操作。如果在模板中写太多逻辑,会让模板变得臃肿,难以维护。比如说,我们有这样一个包含嵌套数组的对象:
我们想根据 author 是否已有一些书籍来展示不同的信息:
这里的模板看起来有些复杂。我们必须认真看好一会儿才能明白它的计算依赖于 author.books。更重要的是,如果在模板中需要不止一次这样的计算,我们可不想将这样的代码在模板里重复好多遍。
那有什么方法可以将逻辑抽离出去呢?
可以,其中一种方式就是将逻辑抽取到一个 method 中,放到 methods 的 options 中;
但是,这种做法有一个直观的弊端,就是所有的 data 使用过程都会变成了一个方法的调用(我们这里暂且不谈论这个方法)
另外一种方式就是使用计算属性 computed;
因此我们推荐使用计算属性来描述依赖响应式状态的复杂逻辑。这是重构后的示例:
我们在这里定义了一个计算属性 publishedBooksMessage。
更改此应用的 data 中 books 数组的值后,可以看到 publishedBooksMessage 也会随之改变。
在模板中使用计算属性的方式和一般的属性并无二致。Vue 会检测到 this.publishedBooksMessage 依赖于 this.author.books,所以当 this.author.books 改变时,任何依赖于 this.publishedBooksMessage 的绑定都将同时更新。
2.4 案例讲解
案例一:我们有两个变量:firstName 和 lastName,希望它们拼接之后在界面上显示;
案例二:我们有一个分数:score
- 当 score 大于 60 的时候,在界面上显示及格; 
- 当 score 小于 60 的时候,在界面上显示不及格; 
案例三:我们有一个变量 message,记录一段文字:比如 Hello World
- 某些情况下我们是直接显示这段文字; 
- 某些情况下我们需要对这段文字进行反转; 
2.4.1 实现思路
- 思路一:在模板语法中直接使用表达式; 
- 思路二:使用 method 对逻辑进行抽取; 
- 思路三:使用计算属性 computed; 
2.4.2 思路一:模板语法
- 缺点一:模板中存在大量的复杂逻辑,不便于维护(模板中表达式的初衷是用于简单的计算); 
- 缺点二:当有多次一样的逻辑时,存在重复的代码; 
- 缺点三:多次使用的时候,很多运算也需要多次执行,没有缓存; 
2.4.3 思路二:method 实现
- 缺点一:我们事实上先显示的是一个结果,但是都变成了一种方法的调用; 
- 缺点二:多次使用方法的时候,没有缓存,也需要多次计算 
2.4.3 思路三:computed 实现
好了,关于计算属性 computed 的讲解就到这里了,有什么问题的同学,可以在评论区进行讨论,创作不易,请留下你到达的痕迹!
版权声明: 本文为 InfoQ 作者【渔戈】的原创文章。
原文链接:【http://xie.infoq.cn/article/7980bca56c5d987b1384518d0】。文章转载请联系作者。











 
    
评论