深入解析 Vue 3 中的 `computed` 以及相关知识点

news2024/11/19 14:24:40

深入解析 Vue 3 中的 computed 以及相关知识点

一、引言

在 Vue.js 中,computed 属性用于定义计算属性,是一个基于响应式依赖的缓存值,只有当依赖的数据变化时才会重新计算。它是构建高效、性能优异的 Vue 应用的重要工具。

Vue 3 通过 Composition API 为 computed 提供了更灵活的用法和更强的可扩展性。本文将深入讲解 Vue 3 中 computed 的用法及其相关知识点,并提供基于 语法糖 的完整示例,帮助你快速掌握。


二、computed 的基础用法

在 Vue 3 中,computed 是通过 @vue/reactivity 提供的一个函数,用于创建响应式的计算属性。

1. 定义只读计算属性

示例代码

<script setup>
import { ref, computed } from 'vue'

// 定义响应式数据
const firstName = ref('张')
const lastName = ref('三')

// 定义计算属性
const fullName = computed(() => `${firstName.value} ${lastName.value}`)
</script>

<template>
  <div>
    <p>名字:{{ fullName }}</p>
    <input v-model="firstName" placeholder="姓氏" />
    <input v-model="lastName" placeholder="名字" />
  </div>
</template>

输出说明

  • fullName 是一个基于 firstNamelastName 计算得出的值。
  • firstNamelastName 更新时,fullName 会自动重新计算并更新到视图中。

2. 定义可写计算属性

在某些情况下,我们需要允许计算属性被写入。可以通过 getset 配合实现。

示例代码

<script setup>
import { ref, computed } from 'vue'

const firstName = ref('张')
const lastName = ref('三')

// 定义可读写的计算属性
const fullName = computed({
  get: () => `${firstName.value} ${lastName.value}`,
  set: (value) => {
    const [first, last] = value.split(' ')
    firstName.value = first || ''
    lastName.value = last || ''
  }
})
</script>

<template>
  <div>
    <p>名字:{{ fullName }}</p>
    <input v-model="fullName" placeholder="全名" />
  </div>
</template>

输出说明

  • fullName 支持双向绑定:可以从输入框中更新 firstNamelastName 的值。

三、computedwatch 的对比

1. 功能上的区别
特性computedwatch
用途依赖值变化时,自动返回计算后的新值监控一个或多个响应式数据的变化,并执行回调函数
是否有返回值有,始终返回计算结果无,回调函数不返回值
是否缓存是,只有依赖发生变化时才会重新计算否,每次依赖值变化时都会执行回调
2. 选择何时使用
  • 使用 computed:当需要基于一个或多个数据源计算新值,并在模板中直接使用时。
  • 使用 watch:当需要执行副作用操作(如调用 API、写日志等)时。

四、computed 的高级用法

1. 依赖多重数据

计算属性可以依赖多个响应式数据,并自动跟踪这些依赖。

示例代码

<script setup>
import { ref, computed } from 'vue'

const items = ref([
  { name: '苹果', price: 3 },
  { name: '香蕉', price: 2 },
  { name: '橙子', price: 4 }
])

// 计算总价格
const totalPrice = computed(() => items.value.reduce((sum, item) => sum + item.price, 0))
</script>

<template>
  <div>
    <ul>
      <li v-for="item in items" :key="item.name">{{ item.name }}: {{ item.price }} 元</li>
    </ul>
    <p>总价:{{ totalPrice }} 元</p>
  </div>
</template>

说明

  • totalPrice 会根据 items 的变化自动更新。
  • 在 Vue 中,你不需要手动声明依赖关系,computed 会自动追踪依赖。

2. 配合 watchEffect 使用

有时需要在计算属性中依赖外部副作用的场景,可以配合 watchEffect 使用(副作用是指任何会影响外部状态的行为,比如打印日志,发起网络请求,操作DOM,调用外部API)。

示例代码

<script setup>
import { ref, computed, watchEffect } from 'vue'

const basePrice = ref(100)
const discount = ref(10)

const finalPrice = computed(() => basePrice.value - discount.value)

// 打印计算过程
watchEffect(() => {
  console.log(`基础价格: ${basePrice.value}, 折扣: ${discount.value}, 最终价格: ${finalPrice.value}`)
})
</script>

<template>
  <div>
    <p>最终价格:{{ finalPrice }}</p>
    <input v-model.number="basePrice" type="number" placeholder="基础价格" />
    <input v-model.number="discount" type="number" placeholder="折扣" />
  </div>
</template>

五、computed 的原理解析

Vue 3 中的 computed 是基于响应式系统实现的,其原理大致如下:

  1. 依赖收集:在 computedgetter 函数中访问响应式数据时,会自动注册对这些数据的依赖。
  2. 懒惰计算computed 默认采用 惰性求值 策略,只有当计算属性被访问时,才会重新计算。
  3. 缓存机制computed 会缓存计算结果,只有在依赖值发生变化时,才会重新计算。

核心源码(简化版):

function computed(getter) {
  let cachedValue
  let dirty = true

  const effect = new ReactiveEffect(getter, () => {
    dirty = true
  })

  return {
    get value() {
      if (dirty) {
        cachedValue = effect.run()
        dirty = false
      }
      return cachedValue
    }
  }
}

六、常见问题与优化

1. 不要在 computed 中执行副作用

错误示例

const invalid = computed(() => {
  console.log('执行副作用') // 不推荐
  return someValue
})

优化建议

  • 将副作用逻辑放在 watchwatchEffect 中。
2. 避免复杂计算

计算属性过于复杂可能导致性能问题。建议将复杂逻辑拆分成多个小的 computed 属性。


七、总结

  • computed 是 Vue 3 中高效管理依赖关系的重要工具,通过缓存和懒加载提高性能。
  • 它适合处理基于响应式数据的派生状态,并提供只读和可写两种模式。
  • watch 相比,computed 更适合用于模板中的派生值计算,而 watch 更适合处理副作用。

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

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

相关文章

学习QT第二天

QT6示例运行 运行一个Widgets程序运行一个QT Quick示例 工作太忙了&#xff0c;难得抽空学点东西。-_-||| 博客中有错误的地方&#xff0c;请各位道友及时指正&#xff0c;感谢&#xff01; 运行一个Widgets程序 在QT Creator的欢迎界面中&#xff0c;点击左侧的示例&#xf…

删除课表中课程

文章目录 概要整体架构流程技术细节小结 概要 业务分析 删除课表中的课程有两种场景&#xff1a; 用户直接删除已失效的课程 用户退款后触发课表自动删除 技术细节 退款通知 其中用户退款与用户报名课程类似&#xff0c;都是基于MQ通知的方式。具体代码是在tj-trade模块的…

MySQL深度剖析-索引原理由浅入深

什么是索引&#xff1f; 官方上面说索引是帮助MySQL高效获取数据的数据结构&#xff0c;通俗点的说&#xff0c;数据库索引好比是一本书的目录&#xff0c;可以直接根据页码找到对应的内容&#xff0c;目的就是为了加快数据库的查询速度。 索引是对数据库表中一列或多列的值进…

MATLAB常见数学运算函数

MATLAB中含有许多有用的函数,可以随时调用。 a b s abs abs函数 a b s abs abs函数在MATLAB中可以求绝对值,也可以求复数的模长:c e i l ceil ceil函数 向正无穷四舍五入(如果有小数,就向正方向进一)f l o o r floor floor函数 向负无穷四舍五入(如果有小数,就向负方向…

如何使用本地大模型做数据分析

工具&#xff1a;interpreter --local 样本数据&#xff1a; 1、启动分析工具 2、显示数据文件内容 输入&#xff1a; 显示/Users/wxl/work/example_label.csv 输出&#xff1a;(每次输出的结果可能会不一样&#xff09; 3、相关性分析 输入&#xff1a; 分析客户类型与成…

操作系统不挂科】<创建线程(7)>单选多选简答题(带答案与解析)

前言 大家好吖&#xff0c;欢迎来到 YY 滴操作系统不挂科 系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 本博客主要内容&#xff0c;收纳了一部门基本的操作系统题目&#xff0c;供yy应对期中考试复习。大家可以参考 本章为选择题题库&#xff0c;试卷…

RAG(Retrieval-Augmented Generation)评测篇

一、为什么需要 对 RAG 进行评测&#xff1f; 在探索和优化 RAG&#xff08;检索增强生成器&#xff09;的过程中&#xff0c;如何有效评估其性能已经成为关键问题。 二、如何合成 RAG 测试集&#xff1f; 假设你已经成功构建了一个RAG 系统&#xff0c;并且现在想要评估它的…

宝塔 docker 部署onlyoffice 服务

1.宝塔安装docker,直接下载安装就行 2.docker拉取onlyoffice镜像 docker pull onlyoffice/documentserver:5.3.1.26 5.4或更高的版本已经解决了连接数限制方法的Bug 3.创建容器 docker run -d --name onlyoffice --restartalways -p 暴露端口号:80 onlyoffice/documentserv…

强制放大缩小(适用于所有ctrl-,ctrl+)

以下操作&#xff1a; 使用资源管理器打开启动文件夹&#xff1a; 按下 Win R 键打开“运行”对话框。输入 shell:startup&#xff0c;然后按下 Enter。这应该会打开启动文件夹。 手动定位启动文件夹&#xff1a; 打开资源管理器并导航到以下路径&#xff1a; C:\Users\admin…

项目2:简易随机数生成器 --- 《跟着小王学Python·新手》

项目2&#xff1a;简易随机数生成器 — 《跟着小王学Python新手》 《跟着小王学Python》 是一套精心设计的Python学习教程&#xff0c;适合各个层次的学习者。本教程从基础语法入手&#xff0c;逐步深入到高级应用&#xff0c;以实例驱动的方式&#xff0c;帮助学习者逐步掌握P…

数字资产与大健康领域的知识宝藏:高效知识库搭建策略

在数字化时代&#xff0c;大健康领域的企业积累了丰富的数字资产&#xff0c;这些资产如同一座待挖掘的金矿&#xff0c;蕴含着巨大的价值。高效搭建知识库&#xff0c;能够将这些数字资产转化为企业竞争力。 数字资产与大健康领域知识宝藏 数字资产在大健康领域包括患者数据…

OpenAI震撼发布:桌面版ChatGPT,Windows macOS双平台AI编程体验!

【雪球导读】 「OpenAI推出ChatGPT桌面端」 OpenAI重磅推出ChatGPT桌面端&#xff0c;全面支持Windows和macOS系统&#xff01;这款新工具为用户在日常生活和工作中提供了前所未有的无缝交互体验。对于那些依赖桌面端进行开发工作的专业人士来说&#xff0c;这一更新带来了令人…

全同态加密基于多项式环计算的图解

全同态加密方案提供了一种惊人的能力 —— 能够在不知道数据具体内容的情况下对数据进行计算。这使得你可以在保持潜在敏感源数据私密的同时&#xff0c;得出问题的答案。 这篇文章的整体结构包括多项式环相关的数学介绍&#xff0c;基于多项式环的加密和解密是如何工作的&…

HarmonyOS NEXT应用元服务开发Intents Kit(意图框架服务)事件推荐开发者测试

意图框架向开发者提供真机测试能力&#xff0c;即开发者可连接设备进行调测。开发者完成代码开发之后&#xff0c;功能正式上架应用市场前&#xff0c;可以在HarmonyOS NEXT设备上面进行自验证&#xff0c;打磨体验。真机测试分为三个步骤&#xff1a;基础信息提供&#xff0c;…

MySQL —— MySQL基础概念与常用功能介绍

文章目录 基本概念数据类型数据类型分类 约束主键约束&#xff08;PRIMARY KEY&#xff09;外键约束&#xff08;FOREIGN KEY&#xff09;使用非空约束&#xff08;not null&#xff09;使用唯一性约束&#xff08;UNIQUE&#xff09;使用默认约束&#xff08;DEFAULT&#xff…

PCB+SMT线上报价系统+PCB生产ERP系统自动化拼板模块升级

PCB生产ERP系统的智能拼版技术&#xff0c;是基于PCB前端报价系统获取到的用户或市场人员已录入系统的板子尺寸及set参数等&#xff0c;按照最优原则或利用率最大化原则自动进行计算并输出拼版样式图和板材利用率&#xff0c;提高工程人员效率&#xff0c;减少板材的浪费。覆铜…

商业物联网详细指南:优势与挑战

物联网是信息技术行业最具前景的领域之一。为什么它如此热门呢&#xff1f;原因在于全球连接性。设备可以像人群一样相互协作。正如我们所知&#xff0c;协作能显著提高生产力。 物联网对普通用户和企业都有益处。许多日常流程可以通过传感器、扫描仪、摄像头和其他设备实现自…

开源项目低代码表单设计器FcDesigner获取表单的层级结构与组件数据

在使用开源项目低代码表单设计器FcDesigner时&#xff0c;获取和理解表单的层级结构非常关键。通过getDescription和getFormDescription方法&#xff0c;您可以清晰掌握表单组件的组织结构和层次关系。这些方法为操控表单的布局和配置提供了强大的支持。 源码地址: Github | G…

【android USB 串口通信助手】stm32 源码demo 单片机与手机通信 Android studio 20241118

android 【OTG线】 接 下位机STM32【USB】 通过百度网盘分享的文件&#xff1a;USBToSerialPort.apk 链接&#xff1a;https://pan.baidu.com/s/122McdmBDUxEtYiEKFunFUg?pwd8888 提取码&#xff1a;8888 android 【OTG线】 接 【USB转TTL】 接 【串口(下位机 SMT32等)】 需…

在云服务器搭建 Docker

操作场景 本文档介绍如何在腾讯云云服务器上搭建和使用 Docker。本文适用于熟悉 Linux 操作系统&#xff0c;刚开始使用腾讯云云服务器的开发者。如需了解更多关于 Docker 相关信息&#xff0c;请参见 Docker 官方。 说明&#xff1a; Windows Subsystem for Linux&#xff…