从入门到项目实战 - Vue 计算属性用法解析

news2024/11/25 11:03:54


Vue 计算属性用法解析

上一节:《Vue 监听器用法解析 | 下一节:《Vue 样式绑定

jcLee95
邮箱 :291148484@163.com
CSDN 主页https://blog.csdn.net/qq_28550263?spm=1001.2101.3001.5343
本文地址https://blog.csdn.net/qq_28550263/article/details/127336309

目 录

1. 什么是计算属性

  • 1.1 从一个引例说起
  • 1.2 计算属性的概念

2. 计算属性的用法

  • 2.1 选项式API下的计算属性使用
  • 2.2 组合式API下的计算属性使用
  • 2.3 触发重新计算的条件

3. 计算属性与方法的比较

4. 计算属性与监听器的比较


1. 什么是计算属性

1.1 从一个引例说起

如果没有计算属性,我们返回的一些数据可能并不适合直接使用与模板中,而需要进行一些适当的转换,使之成为适合展示的形式。例如:

<template>
  <p>年: {{ datetime.split(' ')[0].split('/')[0] }}</p>
  <p>月: {{ datetime.split(' ')[0].split('/')[1] }}</p>
  <p>日: {{ datetime.split(' ')[0].split('/')[2] }}</p>
</template>

<script setup lang="ts">
import { ref } from "vue";
const datetime=ref('2022/06/01 17:30:00');
</script>

这里假定 datetime 是一个可能随时改变的变量。 可以看到,我们在模板语法里面写得比较“长”。实际上就是在模板中写了比较长得表达式,而表达式得结果是一个我们需要展示的值。

我们希望模板更为简洁,而不是写过长的表达式。计算属性就能够解决这个问题。

1.2 计算属性的概念

计算属性通过方法来描述一个获取一个值,这个值就像一个属性一样,只不过它是通过方法计算得来的。有了计算属性后:

<template>
  <p>年: {{ year }}</p>
  <p>月: {{ month }}</p>
  <p>日: {{ day }}</p>
</template>

<script setup lang="ts">
import { ref, computed } from 'vue';

const datetime = ref('2022/06/01 17:30:00');
const _ = datetime.value.split(' ')[0].split('/')

const year = computed(()=>{
  return _[0]
})

const month = computed(()=>{
  return _[1]
})

const day = computed(()=>{
  return _[2]
})

</script>

在这个例子中,一旦 datetime 改变后,计算属性 year、month、day 将获得新的值。

2. 计算属性的用法

2.1 选项式API下的计算属性使用

2.1.1 计算属性的完整写法

计算属性实际上由 getter 和 setter 两部分组成,它们分别用来 获取设置 计算属性的值。例如:

<template>
  <input v-model="sn" type="input" placeholder="" name="s" /><br>
  <input v-model="fn" placeholder="" type="input" name="f" /><br>
  <input v-model="name" placeholder="姓-名" type="input" name="n" />
</template>

<script lang="ts">
import { defineComponent, ref } from 'vue';
export default defineComponent({
  data() {
    return {
      fn: ref(''),
      sn: ref(''),
    }
  },
  computed:{
    name:{
      get(){
        return this.sn + '-' + this.fn;
      },
      set(_name:string){
        [this.sn, this.fn] = _name.split('-');
      }
    }
  }
})
</script>

在这里插入图片描述

2.1.2 计算属性的简写法

2.2 组合式API下的计算属性使用

在 1.2 计算属性的概念 的案例中,我们使用的就是 组合式 API。相比与选项式 API, 使用组合式 API 时,需要导入computed函数:

import { computed } from "vue";

完整的组合式 API 同样需要指定 getter 和 setter。例如:

<template>
  <input v-model="sn" type="input" placeholder="" name="s" /><br>
  <input v-model="fn" placeholder="" type="input" name="f" /><br>
  <input v-model="name" placeholder="姓-名" type="input" name="n" />
</template>

<script setup lang="ts">
import { computed, ref } from "vue";

const sn = ref('');
const fn = ref('');

const name = computed({
  get() {
    return sn.value + '-' + fn.value
  },
  set(_name:string){
    [sn.value, fn.value] = _name.split('-')
  }
  
})
</script>

在这里插入图片描述

2.3 触发重新计算的条件

在计算属性的使用中,一个很重要的问题就是,什么情况下将会触发 计算属性 值的改变。换句话说,也就是什么情况下计算属性将重新计算。对我们来说最终计算属性的值是通过计算属性的 getter 获取的,问题就转换为:getter 什么时候调用。

vue 在以下情况下会重新调用 getter:

  1. 初次读取该计算属性时;
  2. 该计算属性所依赖的数据发生改变时。

在上面这两种情况都会触发 getter 的调用,进一步实现数据的更新。

3. 计算属性与方法(函数)的比较

可能你已经看出来,从效果上看,计算属性实际上就是通过函数计算得到一个属性值,这使用函数(方法)完全可以实现同样的效果。例如使用计算属性:

<template>
  <p>{{ now }}</p>
</template>

<script setup lang="ts">
import { computed } from 'vue';

const now = computed(()=>{
  return Date.now()
})
</script>

使用方法(函数):

<template>
  <p>{{ now() }}</p>
</template>

<script setup lang="ts">

const now = ()=>{
  return Date.now()
}
</script>

效果是一样的。既然这样那么我们为什么还需要使用计算属性呢——换句话说,计算属性和普通函数有什么不同呢?

在 Vue 中,若我们将 同样的函数 定义为一个 方法 而不是 计算属性 ,两种方式在结果上确实是完全相同的。
不同之处在于 计算属性值会基于其 响应式依赖 被缓存。 一个 计算属性 仅 会在其 响应式依赖 更新时才会进行 重新计算

再举一个例子:

<template>
  <input v-model="str" />
  <p>{{ msg }}</p>
  <p>{{ msg }}</p>
  <p>{{ msg }}</p>
</template>

<script setup lang="ts">
import { computed, ref } from 'vue';

const str = ref("Some words.")
const msg = computed(()=>{
  return str
})
</script>

在这个例子中,虽然有三次使用了'<p>{{ msg }}</p>',但是仅仅计算了一次,并将计算属性值缓存。换句话说,这三个值共用的是同一次计算,并没有计算三次。

4. 计算属性与监听器的比较

经常同一个功能使用 计算属性(computed)和监听器(watch)都可以实现。比如在 2.2 小节中的案例,是使用 computed 实现的:

<template>
  <input v-model="sn" type="input" placeholder="" name="s" /><br>
  <input v-model="fn" placeholder="" type="input" name="f" /><br>
  <input v-model="name" placeholder="姓-名" type="input" name="n" />
</template>

<script setup lang="ts">
import { computed, ref } from "vue";

const sn = ref('');
const fn = ref('');

const name = computed({
  get() {
    return sn.value + '-' + fn.value
  },
  set(_name:string){
    [sn.value, fn.value] = _name.split('-')
  }
  
})
</script>

我们也可以改成使用 watch 实现:

<template>
  <input v-model="sn" type="input" placeholder="" name="s" /><br>
  <input v-model="fn" placeholder="" type="input" name="f" /><br>
  <input v-model="fullname" placeholder="姓-名" type="input" name="n" />
</template>

<script setup lang="ts">
import { watch, ref } from "vue";

const sn = ref('');
const fn = ref('');
const fullname = ref('');

watch(fullname, (newValue, oldValue)=>{
  [sn.value, fn.value] = newValue.split('-')
})

watch([sn, fn], ([new_sn, new_fn])=>{
  fullname.value = new_sn + '-' + new_fn
})
</script>

在这里插入图片描述

可以看出来,都实现了一样的功能。不过有时候计算属性可能会简单一些。比如上面的例子,定义的计算属性name直接就可以作为值绑定到输入框上,不需要另外声明一个属性。而监听器则需要定义一个 fullname 变量作为其所监听的对象。

另外,在这个例子中如果需要给定一个初始姓名,计算属性只需要分别给 snfn 初值,而 name 将自动计算获得。但如果使用的时监听器,你需要同时给姓、名、全名正确的初始值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/116295.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

衣服、商品、商城网站模板首页,仿U袋网,vue+elementui简洁实现(二)

一.前言 接上一遍博客&#xff1a;《衣服、商品、商城网站模板首页&#xff0c;仿U袋网&#xff0c;vueelementui简洁实现》 在此基础上增加了和完善一些页面&#xff1a; 商品分类筛选页面登录、注册、找回密码共用页面U袋学堂&#xff08;视频专区&#xff0c;视频播放&am…

编译原理——参数传递—传名、传地址、得结果、传值

1.传名&#xff08;替换操作&#xff09; 把这种方式理解为替换操作&#xff0c;把P函数参数X、Y、Z和P函数内部的Y、Z替换为A、B&#xff0c;然后P函数对Y、Z的操作&#xff0c;其实就是对A、B的操作&#xff1b;需要注意这和传地址一样&#xff0c;上面对A造成的变化&#x…

制品仓库 Nexus 安装、配置、备份、使用

目录 1.1 Nexus 优点 1.2 Nexus 仓库类型 2. 安装 Nexus 2.1 设置持久化目录 2.2 拉取 Nexus docker 镜像 2.3 运行并启动 Nexus 3. 系统配置 3.1 配置管理员密码 3.2 配置 LDAP 3.3 配置 Email 服务器 4. 配置 Repository 4.1 添加 Blob Stores 4.2 添加 Reposit…

软考高级考哪个好?

软考高级一共5个科目&#xff0c;含金量都差不多&#xff0c;每个人考证的需求各不相同&#xff0c;合适自己情况的才是最有用的证书。看你自己的工作、专业与哪个更相近&#xff0c;再来深入学习备考的&#xff0c;当然自己也要对考试取证有一定的信心。 高级科目介绍&#x…

【LeetCode每日一题】——剑指 Offer II 072.求平方根

文章目录一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【解题思路】七【题目提示】八【题目注意】九【时间频度】十【代码实现】十一【提交结果】一【题目类别】 二分查找 二【题目难度】 简单 三【题目编号】 剑指 Offer II 072.求平方根 …

《图解TCP/IP》阅读笔记(第七章 7.5)—— OSPF 开放最短路径优先协议

7.5 OSPF OSPF&#xff08;Open Shortest Path First&#xff0c;开放最短路径优先&#xff09;是一种链路状态性的路由协议&#xff0c;即使网络中有环路&#xff0c;也可以进行稳定的路由控制。 另外&#xff0c;OSPF支持子网掩码&#xff0c;使得在RIP中无法实现的可变长度…

在简历上写了“精通自动化测试,阿里面试官跟我死磕后就给我发了高薪 offer

事情是这样的 前段时间面试了阿里&#xff0c;大家也都清楚&#xff0c;如果你在简历上面写着你精通 XX 技术&#xff0c;那面试官就会跟你死磕到底。 我就是在自己的简历上写了精通自动化测试&#xff0c;然后就开启了和阿里面试官的死磕之路&#xff0c;结果就是拿到了一份…

【Lilishop商城】No4-2.业务逻辑的代码开发,涉及到:会员B端第三方登录的开发-平台注册会员接口开发

仅涉及后端&#xff0c;全部目录看顶部专栏&#xff0c;代码、文档、接口路径在&#xff1a; 【Lilishop商城】记录一下B2B2C商城系统学习笔记~_清晨敲代码的博客-CSDN博客 全篇会结合业务介绍重点设计逻辑&#xff0c;其中重点包括接口类、业务类&#xff0c;具体的结合源代…

AMQP协议:消费者、生产者与RibbitMQ节点之间的交互流程,RibbitMQ的核心组成部分

原文链接 一、什么是AMQP协议&#xff1f; AMQP全称&#xff1a;Advanced Message Queuing Protocol(高级消息队列协议)。是应用层协议的一个开发标准&#xff0c;为面向消息的中间件设计。 基于此协议的客户端与消息中间件可以传递消息&#xff0c;不受客户端/中间件的不同产品…

小程序之首页搭建——Flex布局

目录 Flex布局简介 什么是flex布局&#xff1f; flex属性 学习地址&#xff1a; 视图层 View WXML 数据绑定 列表渲染 条件渲染 模板 WXSS 尺寸单位 样式导入 内联样式 选择器 全局样式与局部样式 WXS 示例 注意事项 页面渲染 数据处理 会议OA项目-首页 …

Python实现照片、视频一键压缩及备份源代码

代码 完整代码下载地址&#xff1a;Python实现照片、视频一键压缩及备份源代码 第一次运行前先编辑脚本&#xff0c;修改其中的主库位置、随库位置&#xff0c;保存。 此后要更新随库时&#xff0c;只要双击运行脚本即可。 运行结果示例&#xff1a; 主库位置&#xff1a;D…

用了这么多年的 SpringBoot 你知道什么是 SpringBoot 的 Web 类型推断吗?

用了这么多年的 SpringBoot 那么你知道什么是 SpringBoot 的 web 类型推断吗&#xff1f; 估计很多小伙伴都不知道&#xff0c;毕竟平时开发做项目的时候做的都是普通的 web 项目并不需要什么特别的了解&#xff0c;不过抱着学习的心态&#xff0c;阿粉今天带大家看一下什么是 …

jQuery库冲突

文章目录jQuery库冲突原因jQuery.noConflict()如还想使用$可以这么做jQuery库冲突 原因 在某些情况下&#xff0c;可能有必要在同一个页面中使用多个JavaScript库。但是很多库都使用了“$”这个符号&#xff08;因为它简短方便&#xff09;&#xff0c;这时就需要用一种方式来…

Oracle中Null和无值的区别

以Leetcode第176题“第二高的薪水”为例。 首先说一下这道题最容易理解、最容易实现的解法&#xff0c;就是比最大值小的值里最大的值。 SELECT MAX(salary) AS SecondHighestSalary FROM Employee WHERE salary < (SELECT MAX(salary) FROM Employee)通过这道题目&#…

泛型------数据结构

泛型 问题:下面是一个简单的顺序表&#xff0c;我们在这里面实现的一个顺序表&#xff0c;是存放的数据类型只有int类型&#xff0c;这就会很不通用&#xff0c;如果我们想什么样的类型的数据都想要放进去,就要把这个数组的类型设置成Object类型 能不能啥样的类型都可以存放呢&…

ArcGIS中ArcMap栅格重采样操作与算法选择

本文介绍在ArcMap软件中&#xff0c;实现栅格图像重采样的具体操作&#xff0c;以及不同重采样方法的选择依据。 在文章Python中ArcPy实现栅格图像文件批量掩膜与批量重采样&#xff08;https://blog.csdn.net/zhebushibiaoshifu/article/details/124282764&#xff09;中&…

optimization问题的解决

目录 临界点critical point 基本介绍临界点两种情况的区分 g和H的举例介绍根据H区分Saddle Point和local minima 批次Batch batch大小的比较 时间的开销训练集和测试集的效果 训练集效果测试集效果 动量Momentum 一般的Gradient Descent带有动量的Gradient Descent 2021 -…

异步通信技术AJAX | 原理剖析、发送Ajax请求四步

目录 一&#xff1a;快速搞定AJAX&#xff08;第一篇&#xff09; 1、传统请求及缺点 2、AJAX请求原理剖析 3、AJAX概述 4、XMLHttpRequest对象 5、AJAX GET请求 6、AJAX GET请求提交数据 7、AJAX GET请求的缓存问题 8、AJAX POST请求及模拟表单提交数据 9、经典案例…

C语言基础--数组

文章目录一维数组一、一维数组的创建和初始化&#xff08;1&#xff09;一维数组的创建&#xff08;2&#xff09;一维数组的初始化1&#xff09;整形数组初始化2&#xff09;字符数组初始化3&#xff09;sizeof与strlen4&#xff09;总结二、一维数组的使用三、一维数组在内存…

基于C++实现(控制台)职工信息管理系统【100010060】

职工信息管理系统 一、实验内容 ​ 设计一个职工信息管理案例&#xff0c;实现不同类别职工的工资数据。职工的种类包括&#xff1a;正式职工和临时工。定义一个基本的职工类&#xff0c;基本信息包括&#xff1a;编号、姓名、性别、年龄、家庭住址、基本职务工资。派生出正式…