Vue计算属性的使用
发布时间 - 2026-01-11 02:39:12 点击率:次我们都知道在Vue构造函数的参数对象中有一个【data】属性,该属性值是一个对象,该对象是对数据的代理,是一个键值对并且时刻与页面表现是一致的,但是这里面只能是简单的键值对,不能拥有业务逻辑,并且由于【data】中的属性属于同一个生命周期,所以如果我们需要某一个属性是依赖于另外一个属性时,在【data】中是做不到的,于是Vue为我们提供了【计算属性】

一、计算属性
1.1 概述
计算属性归根结底也是属性,它也是跟表现层是时刻同步的,虽然我们可以在插值中对数据进行各种处理,但是插值中的表达式处理毕竟只能用于简单的运算,不能拥有太多的业务逻辑。
<body>
<div id="app">
<h1>{{name.toUpperCase()}}</h1>
<!-- <h1>BLUE</h1> -->
</div>
</body>
<script>
let vm = new Vue({
el: "#app",
data: {
name: 'blue'
}
})
</script>
上面代码是我们熟悉的在插值中使用表达式,但是这里面我们不能写入业务代码。
1.2 计算属性语法
在构造函数的参数对象中有一个【computed】属性,该属性就是用于定义计算属性的,该对象中的【键】也就是我们的计算属性,与【data】不同的是,计算属性的键值是一个【拥有返回值的函数】,该函数中可以访问到【data】中的所有属性。
<body>
<div id="app">
<h1>{{rs}}</h1>
<!-- <h1>BLUE LOVE PINK</h1> -->
</div>
</body>
<script>
let vm = new Vue({
el: "#app",
data: {
hs: 'BLUE',
wf: "PINK"
},
computed: {
rs:function(){
return `${this.hs} LOVE ${this.wf}`
}
}
})
</script>
上面代码属性【rs】是定义的一个计算属性,该属性值是通过【data】中的两个属性值计算得到,返回一个拼接的字符串(这儿使用了ES6的【模板字符串】)并且当【data】中的相关值变化之后,【rs】属性都会进行重新计算。
可能刚开始对计算属性会有些疑惑,比如上面的例子我把代码写成下面这样子也是可以的
<body>
<div id="app">
<h1>{{hs}} LOVE {{wf}}</h1>
<!-- <h1>BLUE LOVE PINK</h1> -->
</div>
</body>
<script>
let vm = new Vue({
el: "#app",
data: {
hs: 'BLUE',
wf: "PINK"
}
})
</script>
上面的代码运行效果和我们使用计算属性的效果是一样的,但是这样的写法只适用于简单的处理,【计算属性可以处理更复杂的业务逻辑】,比如我们根据【data】中的一个属性值进行数据请求用于构建一个属性,我们就必须使用计算属性了。
【注意!!】计算属性虽然是一个方法,但是在Vue内部会被翻译成一个属性,我们可以使用实例【vm.rs】访问到数据的。
1.3 计算属性和过滤器的比较
如果用于对【data】中【单个】属性的【简单】处理,推荐使用过滤器,但是如果一个值使用了【data】中至少2个值或者对一个值进行复杂处理,那么就推荐使用计算属性了。
<body>
<div id="app">
<h1>{{hs | lover}}</h1>
<!-- <h1>BLUE LOVE PINK</h1> -->
</div>
</body>
<script>
let vm = new Vue({
el: "#app",
data: {
hs: 'BLUE',
},
filters: {
lover(value){
return `${value} LOVE PINK`
}
}
})
</script>
上面代码就使用了一个【data】属性值做简单的处理,所以使用过滤器,而且也发现了过滤字符串“LOVE PINK”是不可变的。
1.4 计算属性和Methods的比较
计算属性就是为了定属性的时候处理复杂的业务逻辑,而且在插值中我们可以使用表达式,那么我们是否可以通过使用在插值中调用一个有返回值的函数呢?它和计算属性又有什么区别呢?
<body>
<div id="app">
<h1>{{rs}}</h1>
<!-- <h1>EULB</h1> -->
</div>
</body>
<script>
let vm = new Vue({
el: "#app",
data: {
name: 'BLUE',
},
computed: {
rs: function () {
return [...this.name].reverse().join('');
}
}
})
</script>
上面代码将数据进行反向处理(使用了【ES6数组字符串扩展】 ),当我们改变name的值的时候,计算属性【rs】会跟着改变。下面我们将它改成一个方法结合插值表达式进行处理,看看区别。
<body>
<div id="app">
<h1>{{ rs() }}</h1>
<!-- <h1>EULB</h1> -->
</div>
</body>
<script>
let vm = new Vue({
el: "#app",
data: {
name: 'BLUE',
},
methods: {
rs() {
return [...this.name].reverse().join('');
}
}
})
</script>
上面代码将计算属性改成了一个方法结合插值表达式,发现效果和计算属性没差别,改变name的值的时候页面也刷新了。那是不是这两者就真的没区别呢,答案当然是否定的,如果没有区别干嘛还有计算属性的存在。
【计算属性是基于依赖进行缓存的】,只有计算属性的依赖发生改变时才会重新求值,也就是说如果依赖没有发生改变,那么计算属性会立刻返回之前的计算结果,假如我们有一个性能开销比较大的的计算属性 A ,它需要遍历一个极大的数组和做大量的计算。然后我们可能有其他的计算属性依赖于 A 。如果没有缓存,我们将不可避免的多次执行 A 的 getter!如果你不希望有缓存,请用 method 替代。
1.5 计算属性和Watch的比较
我们发现计算属性会监听依赖,如果依赖发生变化则会从新计算属性,那么【监听器】也有这么一个功能,那么我们应该在什么时候使用【计算属性】,什么时候使用【监听器】呢?
<body>
<div id="app">
<h1>{{fullName}}</h1>
</div>
</body>
<script>
let vm = new Vue({
el: "#app",
data: {
firstName: 'Jack',
lastName: 'Blue',
fullName: 'Jack Blue'
},
watch: {
firstName: function (val) {
this.fullName = val + ' ' + this.lastName
},
lastName: function (val) {
this.fullName = this.firstName + ' ' + val
}
}
})
</script>
上面代码中我们监听firstName和lastName用于构建fullName,效果很好,当firstName和lastName任意一个值改变的时候fullName都会随之改变。下面我们看一下计算属性的写法
<body>
<div id="app">
<h1>{{fullName}}</h1>
<!-- <h1>Jack Blue</h1> -->
</div>
</body>
<script>
let vm = new Vue({
el: "#app",
data: {
firstName: 'Jack',
lastName: 'Blue',
},
computed: {
fullName() {
return this.firstName + ' ' + this.lastName
}
}
})
</script>
上面代码使用计算属性的方式进行了改造,fullName 依赖 firstName和 lastName 两个属性,当这两个属性任意一个发生变化,fullname都会重新进行计算。但是计算属性是不是简洁了很多呢!
【总结!!】当一个属性需要依赖多个【data】中的属性时,建议使用计算属性,如果我们不是对属性进行操作,只是单纯的依据【data】中的某个值变化后做一些【非属性操作】时或者是在数据变化响应时,【执行异步操作或开销较大的操作】(比如:将变化后的值存入数据库,而不是改变其他属性)就使用Watch。
1.6 计算属性的setter
上面我们是使用的计算属性都是用于对计算属性的取值,计算属性默认页只给了【getter】,但是在需要的时候我们可以人为的添加【setter】
<body>
<div id="app">
<h1>{{fullName}}</h1>
<!-- <h1>Jack Blue</h1> -->
</div>
</body>
<script>
let vm = new Vue({
el: "#app",
data: {
firstName: 'Jack',
lastName: 'Blue',
},
computed: {
fullName: {
//getter
get() {
return this.firstName + ' ' + this.lastName
},
//setter
set(newValue) {
var names = newValue.split(' ')
this.firstName = names[0]
this.lastName = names[names.length - 1]
}
}
}
})
</script>
上面代码定义了计算属性的一个setter,注意当需要定义setter的时候语法上面是有区别的。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# Vue计算属性
# vue计算属性computed的使用方法示例
# Vue中computed(计算属性)和watch(监听属性)的用法及区别说明
# Vue中关于computed计算属性的妙用
# 是一个
# 插值
# 键值
# 什么时候
# 中有
# 推荐使用
# 我们可以
# 如果没有
# 可以使用
# 使用了
# 这里面
# 返回值
# 的是
# 都是
# 是在
# 也有
# 但是在
# 太多
# 是有
# 那是
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
php静态变量怎么调试_php静态变量作用域调试技巧【解答】
PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)
Laravel怎么在Blade中安全地输出原始HTML内容
如何注册花生壳免费域名并搭建个人网站?
黑客如何通过漏洞一步步攻陷网站服务器?
Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出
Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境
作用域操作符会触发自动加载吗_php类自动加载机制与::调用【教程】
Laravel如何使用Socialite实现第三方登录?(微信/GitHub示例)
小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?
详解Android中Activity的四大启动模式实验简述
高性能网站服务器部署指南:稳定运行与安全配置优化方案
php结合redis实现高并发下的抢购、秒杀功能的实例
网站制作报价单模板图片,小松挖机官方网站报价?
EditPlus中的正则表达式实战(5)
Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制
Laravel如何创建和注册中间件_Laravel中间件编写与应用流程
阿里云高弹*务器配置方案|支持分布式架构与多节点部署
zabbix利用python脚本发送报警邮件的方法
Laravel如何创建自定义中间件?(Middleware代码示例)
Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程
黑客如何利用漏洞与弱口令入侵网站服务器?
武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?
Laravel Seeder怎么填充数据_Laravel数据库填充器的使用方法与技巧
东莞市网站制作公司有哪些,东莞找工作用什么网站好?
购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?
Android实现代码画虚线边框背景效果
HTML5空格和nbsp有啥关系_nbsp的作用及使用场景【说明】
北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?
Laravel如何编写单元测试和功能测试?(PHPUnit示例)
Laravel如何使用Telescope进行调试?(安装和使用教程)
网站制作大概要多少钱一个,做一个平台网站大概多少钱?
免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?
详解vue.js组件化开发实践
Laravel如何实现API版本控制_Laravel版本化API设计方案
Python自动化办公教程_ExcelWordPDF批量处理案例
Laravel怎么实现支付功能_Laravel集成支付宝微信支付
七夕网站制作视频,七夕大促活动怎么报名?
智能起名网站制作软件有哪些,制作logo的软件?
如何在建站主机中优化服务器配置?
如何在建站之星网店版论坛获取技术支持?
如何在云主机上快速搭建网站?
Laravel如何理解并使用服务容器(Service Container)_Laravel依赖注入与容器绑定说明
网页设计与网站制作内容,怎样注册网站?
Laravel中间件起什么作用_Laravel Middleware请求生命周期与自定义详解
ChatGPT常用指令模板大全 新手快速上手的万能Prompt合集
Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转
node.js报错:Cannot find module 'ejs'的解决办法
网站建设保证美观性,需要考虑的几点问题!
如何快速搭建FTP站点实现文件共享?
上一篇:apache是干嘛用的
上一篇:apache是干嘛用的

