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

【Vue】计算属性

目录

概念

作用

语法

使用方法

使用示例

计算属性的优势

**完整写法

**示例:多选框全选反选


概念

基于现有的数据,计算出来的新数据;当现有的数据变化,会自动重新计算。

作用

封装一段基于现有数据,计算求的一个新数据

语法

写在computed函数中,必须返回,作为属性直接使用。

  • js中获取计算属性:计算属性.value。
  • 模板中使用计算属性:{{计算属性}}。

import {computed} from 'vue'

const 新数据 = computed( ()=>{

        //编写计算代码

        return 结果

})

使用方法

计算属性的结果用法与ref/reactive响应式数据用法一样,既可以配合插值,也可以配合指令使用。

在js中要获取计算属性,需要通过 计算属性.value

使用示例

效果:

具体代码:

 这里使用了快速计算一个数组的和reduce方法

goodList.value.reduce((acc,cur)=>{return acc+cur.price},0)

第二个参数0,是给acc初始化,随后进行累加

  <h3>水果清单</h3>
  <table>
    <thead>
      <tr>
        <th>名字</th>
        <th>价格</th>
      </tr>
    </thead>
    <tbody>
      <tr v-for="item in goodList" :key="item.id">
        <td>{{ item.name }}</td>
        <td>{{ item.price }}</td>
      </tr>
    </tbody>
  </table>
  <p>总价:{{ totalPrice }}</p>
</template>

<script setup>
    import {computed,ref} from 'vue'
    const goodList=ref([
      {id:1,name:'apple',price:10},
      {id:2,name:'banana',price:20},
      {id:3,name:'orange',price:30},
    ])
    const totalPrice=computed(()=>{
      if(goodList.length===0){
        return 0
      }
      return goodList.value.reduce((acc,cur)=>{
        return acc+cur.price
      },0)
    })
    
</script>

<style>
  table{
    width: 350px;
    border:1px solid #333;
  }
  table th,table td{
    width: 50%;
    border: 1px solid #333;
  }
  table td{
    text-align: center;
  }
</style>

计算属性的优势

带缓存:如果依赖的值没有发生变化,多次调用,函数体只会在第一次调用时执行;当依赖发生变化时,计算属性才会重新计算,并缓存新的结果。

**完整写法

上述的写法是简易的写法,计算属性是只读的,只能展示,不能修改值(界面视图上修改),因此当我们需要修改计算属性的时候,就需要用到完整写法:get、set

    const total=computed({

     //使用计算属性的时候,自动触发get,get内部必须返回计算结果

      get(){

        return 计算结果

      },

     //修改计算属性自动触发set,val参数表示要给计算属性赋予的值

      set(value){

        计算结果=value

      }

    })

这里修改计算属性时,也就是当计算属性配合v-moel的时候 

**示例:多选框全选反选

  1. 当所有选项都被勾选时,全选框自动勾选
  2. 当全选框勾选时,所有选项都被勾选
  3. 当全选框取消勾选时,所有选项都被取消勾选
  4. 点击反选按钮时,所有选项反选

效果如下:

具体代码: 

<template>
  <p>
    <span>
       //v-model和计算属性的配合使用
      <input type="checkbox" id="all" v-model="allChecked"/>
      <label for="all">全选</label>
    </span>
    <button @click="plantList.forEach(item => item.completed = !item.completed)">反选</button>
  </p>
  <ul>
    <li v-for="item in plantList" :key="item.id">
      <input type="checkbox" v-model="item.completed" />
      <span :class="{completedClass:item.completed}">{{ item.name }}</span>
    </li>
  </ul>
</template>

<script setup>
    import { ref ,computed} from 'vue'
    const plantList = ref([
      { id: 1, name: '跑步', completed: false },
      { id: 2, name: '打球', completed: false },
      { id: 3, name: '游泳', completed: true },
      { id: 4, name: '健身', completed: false },
    ])

    const allChecked = computed({
      get(){
        //every方法返回布尔值,true表示所有元素都满足条件,false表示有元素不满足条件  
        return  plantList.value.every(item => item.completed)
      },
      set(value){
        plantList.value.forEach(item => item.completed = value)
      }
    })
  
</script>

<style lang="scss">
  *{
    margin: 0;
    padding: 0;
  }
  #app{
    width: 400px;
    max-width: 100px auto;
    padding:15px 18px;
    background: rgb(4, 250, 218);
    p{
      display: flex;
      justify-content: space-between;
      align-items: center;
      height: 40px;
      border-bottom: 1px solid #ccc;
      button{
        padding:3px 6px; 
      }
      input{
        margin-right: 8px;
      }
      
    }
    ul{
      li{
        display: flex;
        justify-content: space-between;
        align-items: center;
        height: 40px;
        border-bottom: 1px solid #ccc;
        span.completed{
          color:#ddd;
          text-decoration: line-through;
        }
      }
    }
  }
  ul{
    list-style: none;
  }
  .completedClass{
    color:#04c1fb;
  }
</style>


http://www.kler.cn/a/412204.html

相关文章:

  • CTF之密码学(费纳姆密码)
  • 适用于学校、医院等低压用电场所的智能安全配电装置
  • 计算机网络socket编程(5)_TCP网络编程实现echo_server
  • Http 请求协议
  • 2024小迪安全基础入门第七课
  • 文件内容扫描工具
  • Leetcode 每日一题 3.无重复字符的最长子串
  • 基于springboot的雪具销售系统
  • “华为杯”研究生数学建模比赛历年赛题汇总(2004-2024)
  • localStorage缓存 接口 配置
  • python写共享内存,格式json
  • 实践篇:青果IP助理跨境电商的高效采集
  • JQuery -- 第九课
  • AWS IAM 及其功能
  • 『VUE』33. 组件保持存活,切换组件时的生命周期(详细图文注释)
  • 标记matlab曲线的x坐标
  • pyhton+yaml+pytest+allure框架封装-全局变量接口关联
  • C#调用C++ DLL方法之C++/CLI(托管C++)
  • web分页查询
  • Linux 生成/proc/config.gz
  • Java项目实战II基于微信小程序的校运会管理系统(开发文档+数据库+源码)
  • 【redis】zset有序集合详解
  • 计算机网络习题解答--个人笔记(未完)
  • 新版:微信小程序跳转到任意小程序指定页面
  • 【联表查询中的隐蔽 bug】
  • 网易博客旧文-----安卓界面代码例子研究(一)