第六章 Vue计算属性之computed

目录

一、概述

二、computed简写的代码

三、computed简写的运行效果

四、computed完整写法

五、computed完整写法的代码

六、computed完整写法运行效果


一、概述

**概念:**computed基于现有的数据,计算出最终值。 如果依赖的数据发生变化,将自动重新计算。

语法:

① 声明在 computed 配置项中,一个计算属性对应一个函数

② 使用起来和普通属性一样使用 {{ 计算属性名 }}

注:计算属性 → 可以将一段 求值的代码 进行封装。

二、computed简写的代码

html 复制代码
<!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: '崔克马东9', num: 6 },
          { id: 2, name: '闪电SL8', num: 2 },
          { id: 3, name: '梅花C68', num: 4 },
          { id: 4, name: 'Cervelo S5', num: 7 }
        ]
      },
      computed: {
        totalCount () {
          // 基于现有的数据,编写求值逻辑
          // 计算属性函数的内部可以直接通过this访问到app实例 this.list
          // 需求:对 this.list数组里面的num进行求和(使用到reduce函数),其中sum为总和item为元素项0为起始总和赋值给sum
          let total = this.list.reduce((sum, item) => sum + item.num, 0)
          return total
        }
      }
    })
  </script>
</body>
</html>

三、computed简写的运行效果

四、computed完整写法

computed计算属性默认是简写,只能读取访问,不能 "修改"。

如果要 "修改" → 需要写计算属性的完整写法。

五、computed完整写法的代码

html 复制代码
<!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">
    姓<input type="text" v-model="lastName"><br>
    名:<input type="text" v-model="firstName"><br>
    <input type="text" v-model="fullName"><br>
  </div>
  <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
  <script>
    const app = new Vue({
      el: '#app',
      data: {
        firstName: '哲晓',
        lastName: '王',
      },
      computed: {
        // 简写 -> 只有获取逻辑,没有设置/修改的逻辑
        // fullName () {
        //   return this.lastName + this.firstName
        // }

        // 完整写法 -> 获取 + 设置
        fullName: {
          // 当fullName计算属性被获取求值时,执行get(有缓存),会将返回值作为求值的结果
          get () {
            return this.lastName + this.firstName
          },
          // 当fullName计算属性被赋值修改时,执行set,修改的值传递给set方法的形参
          set (value) {
            this.firstName = value.slice(1)
            this.lastName = value.slice(0,1)
          }
        }
      }
    })
  </script>
</body>
</html>

六、computed完整写法运行效果

注:实际我们在项目开发过程中,遇到需要同时获取和修改的情况比较少,因此大部分情况下,简写就可以。

相关推荐
new出一个对象几秒前
uniapp接入BMapGL百度地图
javascript·百度·uni-app
你挚爱的强哥1 小时前
✅✅✅【Vue.js】sd.js基于jQuery Ajax最新原生完整版for凯哥API版本
javascript·vue.js·jquery
y先森2 小时前
CSS3中的伸缩盒模型(弹性盒子、弹性布局)之伸缩容器、伸缩项目、主轴方向、主轴换行方式、复合属性flex-flow
前端·css·css3
前端Hardy2 小时前
纯HTML&CSS实现3D旋转地球
前端·javascript·css·3d·html
susu10830189112 小时前
vue3中父div设置display flex,2个子div重叠
前端·javascript·vue.js
IT女孩儿3 小时前
CSS查缺补漏(补充上一条)
前端·css
吃杠碰小鸡4 小时前
commitlint校验git提交信息
前端
天天进步20154 小时前
Vue+Springboot用Websocket实现协同编辑
vue.js·spring boot·websocket
虾球xz4 小时前
游戏引擎学习第20天
前端·学习·游戏引擎
我爱李星璇4 小时前
HTML常用表格与标签
前端·html