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

【后端速成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 进行求和 → reduce
          let 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.kler.cn/a/389217.html

相关文章:

  • 【金融风控】特征评估与筛选详解
  • 3.5【数据库系统】ER图
  • Android OpenGL ES详解——纹理:纹理过滤GL_NEAREST和GL_LINEAR的区别
  • HTML(超文本标记语言)
  • LLMs之PDF:zeroX(一款PDF到Markdown 的视觉模型转换工具)的简介、安装和使用方法、案例应用之详细攻略
  • sql server启用远程连接与修改默认端口
  • Ardusub中添加自定义控制器
  • 计算机网络-1.2分层结构
  • SQLite 与 Python:集成与使用
  • 七次课掌握 Photoshop:选区与抠图
  • ORACLE创建用户之后查询不到创建的用户
  • React 守卫路由
  • 测试用例设计方法之边界值分析法
  • Dependencies 工具
  • node 阿里云oss上传删除修改文件
  • vue3的自定义hooks怎么写?
  • 《深入浅出Apache Spark》系列③:Spark SQL解析层优化策略与案例解析
  • Redis的缓存问题与应对策略
  • 面试:TCP、UDP如何解决丢包问题
  • 探索开放资源上指令微调语言模型的现状
  • 【Kafka-go】golang的kafka应用
  • ReactPress:深入解析技术方案设计与源码
  • C++学习笔记----10、模块、头文件及各种主题(六)---- C风格可变长度参数列表
  • qt QRunnable 与 QThreadPool详解
  • 【CSS】居中样式
  • Nginx性能调优的具体策略方法