当前位置: 首页 > news >正文

【后端速成Vue】computed计算属性

前言:

本期将会介绍 Vue 中的计算属性,他和 methods 方法又会有什么区别呢?在这里都会给你一一讲解。


篮球哥找工作专属IT岗位内部推荐:

专属内推链接:内推通道


1、computed计算属性

概念:
基于现有的数据,计算出来的新属性依赖的数据变化,自动重新计算。

语法:
● 声明在 computed 配置项中,一个计算属性对应一个函数
● 使用起来和普通属性一样使用 {{ 计算属性名 }}

业务需求:
有一个 list 数据,分别是购物商品的名称和数量,需求是根据商品的数量,统计出总共的商品数量。

list: [{ id: 1, name: '洗衣粉', num: 1 },{ id: 2, name: '餐具', num: 2 },{ id: 3, name: '铅笔', num: 5 },]

简单来说,就是要通过计算属性,将 list 里面的每一项的 num 进行求和。

完整代码如下:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>table {border: 1px solid #000;text-align: center;width: 240px;}th,td {border: 1px solid #000;}h3 {position: relative;}</style>
</head>
<body><div id="app"><h3>购物清单</h3><table><tr><th>名字</th><th>数量</th></tr><tr v-for="(item, index) in list" :key="item.id"><td>{{ item.name }}</td><td>{{ item.num }}个</td></tr></table><!-- 目标:统计求和,求得商品总数 --><p>商品总数:{{ totalCount }} 个</p></div><script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script><script>const app = new Vue({el: '#app',data: {list: [{ id: 1, name: '洗衣粉', num: 1 },{ id: 2, name: '餐具', num: 2 },{ id: 3, name: '铅笔', num: 5 },]},computed: {totalCount () {// 基于现有的数据,编写求值逻辑// 计算属性函数内部,可以直接通过 this 访问到 app 实例// 需求:对 this.list 数组里面的 num 进行求和 → reducelet total = this.list.reduce((sum, item) => sum + item.num, 0)return total}}})</script>
</body>
</html>

上述代码的关键地方,就是 computed 属性里面有一个 totalCount 计算属性,计算属性的值就是最终 return 的值。

这里的写法跟 methods 里面的方法特别像!

而且这样的实现明明用 methods 里面的方法去实现也是可以实现的,为什么还要用计算属性呢?


2、computed VS methods

先来看看他们俩个的介绍:

计算属性computed
作用:封装了一段对于数据的处理,求得一个结果
语法:

  1. 写在computed配置项中
  2. 作为属性,直接使用
    • js中使用计算属性: this.计算属性
    • 模板中使用计算属性:{{计算属性}}

方法methods
作用:给Vue实例提供一个方法,调用以处理业务逻辑
语法:

  1. 写在methods配置项中
  2. 作为方法调用
    • js中调用:this.方法名()
    • 模板中调用 {{方法名()}} 或者 @事件名=“方法名”

最重要的是:

  1. 缓存特性(提升性能)
    计算属性会对计算出来的结果缓存,再次使用直接读取缓存,
    依赖项变化了,会自动重新计算 → 并再次缓存
  2. methods没有缓存特性

所以简单来说,计算属性是拥有缓存机制的!!!

这里我们来用代码看一下计算属性的缓存机制:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><div id="app"><!-- 调用三次计算属性 -->{{totalCount}}{{totalCount}}{{totalCount}}<!-- 调用三次方法 -->{{totalCountFn()}}{{totalCountFn()}}{{totalCountFn()}}</div><script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script><script>const app = new Vue({el: '#app',data: {list: [{ id: 1, name: '洗衣粉', num: 1 },{ id: 2, name: '餐具', num: 2 },{ id: 3, name: '铅笔', num: 5 },]},computed: {totalCount () {console.log('计算属性执行了')let total = this.list.reduce((sum, item) => sum + item.num, 0)return total},},methods: {totalCountFn () {console.log('methods方法执行了')let total = this.list.reduce((sum, item) => sum + item.num, 0)return total}}})</script>
</body>
</html>

观察运行结果和控制台:
在这里插入图片描述
此时通过控制台的日志打印,明显可以发现,计算属性只执行了一次,而方法却调用了三次!


3、计算属性的完整写法

上述计算属性的基本用法已经介绍完了,但是可以明显发现一个问题:

计算属性默认的简写,只能读取访问,不能 “修改”

如何理解这个 “修改” 呢?也就是说,上面的简单写法,程序员是无法直接修改计算属性的值的!比如有个计算属性 count,是不能写出 this.count = 10 这样的代码的!

但是如果使用计算属性的完整写法就可以控制计算属性的值了!

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>input {width: 30px;}</style>
</head>
<body><div id="app">姓:<input type="text" v-model="firstName"> +名:<input type="text" v-model="lastName"> =<span>{{ fullName }}</span><br><br><button @click="changeName">改名卡</button></div><script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script><script>const app = new Vue({el: '#app',data: {firstName: '王',lastName: '五',},methods: {changeName () {this.fullName = '张三'}},computed: {// 简写 → 获取,没有配置设置的逻辑// fullName () {//   return this.firstName + this.lastName// }// 完整写法 → 获取 + 设置fullName: {// (1) 当fullName计算属性,被获取求值时,执行get(有缓存,优先读缓存)//     会将返回值作为,求值的结果get () {return this.firstName + this.lastName},// (2) 当fullName计算属性,被修改赋值时,执行set//     修改的值,传递给set方法的形参set (value) {   this.firstName = value.slice(0, 1)this.lastName = value.slice(1)}}}})</script>
</body>
</html>

直接写完整的 get 和 set 方法即可,此时上述说的 this.count = 10 就会执行对应 count 的计算属性的 set 方法里面的逻辑了。

http://www.lryc.cn/news/481417.html

相关文章:

  • 力扣-每日温度
  • (Go语言)初上手Go?本篇文章帮拿捏Go的数据类型!
  • 支付宝域名如何加入白名单(扫码老是弹窗)
  • 嵌入式学习第21天Linux基础
  • 【activiti工作流源码集成】springboot+activiti+mysql+vue+redis工作流审批流集成整合业务绑定表单流程图会签驳回
  • 华为私有接口类型hybrid
  • 计算机的错误计算(一百五十)
  • 【模块化大作战】Webpack如何搞定CommonJS与ES6混战(3)
  • 工程认证与Spring Boot:计算机课程管理的新探索
  • vue3的自定义hooks怎么写?
  • SpringBoot项目编译报错 类文件具有错误的版本 61.0, 应为 52.0
  • 【网络】应用层——HTTP协议
  • ServletContext介绍
  • 让AI帮我用java实现EasyExel读取图片—支持WPS嵌入图片
  • C# 实现对指定句柄的窗口进行键盘输入的实现
  • 深度学习之卷积问题
  • yum安装zabbix5.0升级php到74的办法
  • JavaWeb合集23-文件上传
  • 当AI遇上时尚:未来的衣橱会由机器人来打理吗?
  • 【初阶数据结构篇】二叉树OJ题
  • Windows系统中Oracle VM VirtualBox的安装
  • go语言使用总结(持续更新)
  • 如何在Android中自定义property
  • 机器学习5_支持向量机_原问题和对偶问题——MOOC
  • 索引的细节
  • LeetCode 540.有序数组中的单一元素
  • 【图文】【DIY便签】如何自行编译OPENCV使用动态库
  • WordPress文章自动提交Bing搜索引擎:PHP推送脚本教程
  • C++题目分享
  • 【Spring 框架】初识 Spring