class 3: vue.js 3 计算属性

  • 计算属性是一种Options API,Options API是一种通过对象定义属性、方法等框架API的方式
  • 我们知道,在模板中可以直接通过插值语法显示一些data属性中的数据。但是在某些情况下,可能需要对数据进行一些转化操作之后再显示,或者需要将多个数据结合起来进行显示
  • 如果我们需要对多个data数据进行运算或由三元运算符来决定结果,或者对数据进行某种转化,然后显示结果。在模板中直接使用表达式,可以很方便的实现这些功能。但如果在模板中放入太多的逻辑,会让模板过重和难以维护;如果多个地方都使用相同逻辑,会有大量重复代码,不利于代码的复用,因此,应该尽可能将模板中的逻辑抽离出去。这样有两种解决办法,第一种是将逻辑抽取到方法中,放到methods的选项中,但是这样的话,所有data中数据的使用过程都变成了一个方法的调用,所以比较好的解决方法就是使用计算属性(computed)

下面是一个多种方案实现同一个需求的具体案例,可以比较一下

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <div id="app"></div>
    <template id="my-app">
<!--        模板语法-->
        <h3>模板语法</h3>
        <h4>{{ firstName + " " + lastName }}</h4>
        <h4>{{ score >= 60 ? '及格' : '不及格' }}</h4>
        <h4>{{ message.split(" ").reverse().join(" ") }}</h4>
        -------------
        <!--        methods-->
        <h3>methods</h3>
        <h4>{{ getFullName() }}</h4>
        <h4>{{ getResult() }}</h4>
        <h4>{{ getReverseMessage() }}</h4>
        -------------
<!--        计算属性-->
        <h3>计算属性</h3>
        <h4>{{ fullName }}</h4>
        <h4>{{ result }}</h4>
        <h4>{{ reverseMessage }}</h4>
    </template>
    <script src="./js/vue.js"></script>
    <script>
        const App = {
            template: '#my-app',
            data() {
                return {
                    firstName: "clarence",
                    lastName: "Liu",
                    score: 90,
                    message: "Hello World"
                }
            },
            methods: {
                getFullName() {
                    return this.firstName + this.lastName
                },
                getResult() {
                    return this.score >= 60 ? '及格' : '不及格'
                },
                getReverseMessage() {
                    return this.message.split(" ").reverse().join(" ")
                }
            },
            computed: {
                fullName() {
                    return this.firstName + this.lastName
                },
                result() {
                    return this.score >= 60 ? '及格' : '不及格'
                },
                reverseMessage() {
                    return this.message.split(" ").reverse().join(" ")
                }
            }
        }
        Vue.createApp(App).mount('#app')
    </script>
</body>
</html>
  • 计算属性会基于它的依赖关系对计算结果进行缓存;当计算属性依赖的数据不变化时,就无须重新计算,但是一旦发生变化,计算属性依然会重新进行计算,下面是一个methods和computed针对这一点进行对比的例子
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <div id="app"></div>
    <template id="my-app">
        <h3>methods</h3>
        <h4>{{ getFullName() }}</h4>
        <h4>{{ getFullName() }}</h4>
        <h4>{{ getFullName() }}</h4>
        -------------
<!--        计算属性-->
        <h3>计算属性</h3>
        <h4>{{ fullName }}</h4>
        <h4>{{ fullName }}</h4>
        <h4>{{ fullName }}</h4>
    </template>
    <script src="./js/vue.js"></script>
    <script>
        const App = {
            template: '#my-app',
            data() {
                return {
                    firstName: "clarence",
                    lastName: "Liu",
                }
            },
            methods: {
                getFullName() {
                    newName = this.firstName + this.lastName
                    console.log('methods:' + newName)
                    return newName
                }
            },
            computed: {
                fullName() {
                    newName = this.firstName + this.lastName
                    console.log('computed:' + newName)
                    return newName
                }
            }
        }
        Vue.createApp(App).mount('#app')
    </script>
</body>
</html>

在这里插入图片描述

  • 可以看到控制台中methods运行了三次,而computed的函数只运行了一次,这说明了计算属性会对计算结果进行缓存这一性质
  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Clarence Liu

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

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

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

打赏作者

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

抵扣说明:

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

余额充值