vue3 响应式 API:computed()

news2024/11/16 4:22:40

介绍

  • 基本概念
    • computed()接收一个 getter 函数或者一个包含 gettersetter 函数的对象作为参数,并返回一个基于原始响应式数据计算得到的新的响应式数据对象。
    • 计算属性的值会根据其依赖的响应式数据自动更新,当依赖的数据发生变化时,计算属性的值也会自动重新计算。
  • 返回值
    • 返回一个计算属性的响应式引用对象,可以通过.value属性来访问计算属性的值。
  • 特点
    • 自动更新:计算属性会根据其依赖的响应式数据自动更新,无需手动触发更新。
    • 缓存结果:计算属性会缓存其计算结果,只有当依赖的数据发生变化时才会重新计算。

示例

创建一个只读的计算属性

<template>
  <div>
    <div>姓名:<input type="text" v-model="name"></div>
    <div>年龄:<input type="number" v-model="age"></div>
    <div>信息:{{ info }}</div>
  </div>
</template>
<script setup lang="ts">
import { computed, ref } from 'vue';

let name = ref('张三')
let age = ref(18)

let info = computed(() => {
  return `${name.value}-${age.value}`
})

// 报错:无法为“value”赋值,因为它是只读属性。
// info.value = name.value
</script>

在这个例子中,当name.valueage.value 发生改变时,info的值会自动重新计算。
计算属性 info只读的。

创建一个可写的计算属性

在 Vue 3 中,使用computed创建的计算属性默认情况下是只读的,只有明确提供了set方法时,它才是可写的。

示例:

<template>
  <div>
    <div>姓名:<input type="text" v-model="name"></div>
    <div>年龄:<input type="number" v-model="age"></div>
    <!-- 在input中修改info,只能触发计算属性info的setter函数。 -->
    <!-- 计算属性info本身的值是没有改变的。 -->
    <div>信息:<input type="text" v-model="info"></div>

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

let name = ref('张三')
let age = ref(18)

let info = computed({
  get: () => `${name.value}-${age.value}`,
  set: newValue => {
    // setVal 是用户写入的计算属性的值
    // 如果需要处理 set 逻辑,可以在这里添加代码
  }
})
</script>

这里创建了一个可写的计算属性 info ,它的 getter 函数根据nameage的值返回一个自我介绍,setter 函数则根据传入的值更新info的值。

注意:操作<input type="text" v-model="info">修改info的值,实际上只是触发了计算属性infoset方法调用。计算属性info本身的值是没有任何改变的。

set方法中直接修改计算属性本身是不正确的,会导致无限循环:

let info = computed({
  get: () => `我是${name.value},今年${age.value}`,
  set: newValue=> {
    // newValue是用户写入的计算属性的值
    // 在计算属性的set方法中,直接修改计算属性本身
    info.value = newValue
  }
})

在计算属性的set方法中,直接修改计算属性本身,不会触发数据的双向绑定:
在这里插入图片描述
浏览器控制台输出错误:

Uncaught RangeError: Maximum call stack size exceeded...

在这里插入图片描述

要实现双向绑定的效果,应该在 set 方法中修改计算属性所依赖的响应式数据源:

let info = computed({
  get: () => `${name.value}-${age.value}`,
  set: newValue => {
    // newValue 是用户写入的计算属性的值
    const [newName, newAge] = newValue.split('-')
    name.value = newName
    age.value = Number(newAge)
  }
})

当修改info的值时,set方法则根据传入的值(newValue)会正确地更新nameageget方法根据nameage的值自动更新info的值,从而实现双向绑定的效果。

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

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

相关文章

设计模式23-职责链

设计模式23-职责链 动机定义与结构定义结构职责链模式图中元素解释工作流程 C 代码推导优缺点应用场景总结 动机 在软件构建过程中&#xff0c;一个请求可能被多个对象处理。但是每个请求在运行时只能有一个接受者。如果显示指定将必不可少的带来请求发送者与接受者的紧耦合。…

lvs+keepalive大战haproxy+keepalive实现高可用集群

华子目录 lvskeepalive实验架构实验前的准备工作1.主机准备2.KA1和KA2上安装lvskeepalive3.webserver1和webserver2上安装httpd4.制作测试效果网页内容5.所有主机关闭firewalld和selinux6.开启httpd服务 实验步骤1.webserver1和webserver2上配置vip2.webserver1和webserver2上关…

【C语言】 作用域和存储期

C语言的作用域和存储期 一、作用域1、概念&#xff1a;2、函数声明作用域3、局部作用域4、全局作用域5、作用域的临时掩盖6、static关键字 二、存储期1、概念2、自动存储期3、静态存储期4、自定义存储期 一、作用域 1、概念&#xff1a; \quad C语言中&#xff0c;标识符都有一…

《小迪安全》学习笔记03

须知少时凌云志&#xff0c;曾许人间第一流。 静态页面&#xff08;HTML&#xff09;是没有漏洞的&#xff0c;没有数据传递。 动态网站一般来说&#xff0c;有开发组合&#xff0c;即开发语言和数据库&#xff0c;两者兼容性比较好&#xff1a; 而且有的数据库不支持windows或…

网站自动化锚文本的实现逻辑

锚文本&#xff0c;‌即超链接的文本部分&#xff0c;‌它在网页中扮演着至关重要的角色。‌通过点击锚文本&#xff0c;‌用户可以方便地在网页间进行跳转&#xff0c;‌从而极大地提升了用户体验。‌同时&#xff0c;‌在搜索引擎优化&#xff08;‌SEO&#xff09;‌领域&am…

idea 修改背景图片教程

&#x1f30f;个人博客主页&#xff1a;意疏-CSDN博客 希望文章能够给到初学的你一些启发&#xff5e; 如果觉得文章对你有帮助的话&#xff0c;点赞 关注 收藏支持一下笔者吧&#xff5e; 阅读指南&#xff1a; 开篇说明修改背景图片 开篇说明 给小白看得懂的修改图片教程&…

Spring项目:文字花园(三)

一.实现博客详情 1.后端逻辑代码 controller层添加方法&#xff08;根据博客id查看博客详情&#xff09; RequestMapping("/getBlogDetail")public Result<BlogInfo> getBlogDetail(Integer blogId){log.info("getBlogDetail, blogId: {}", blogId…

并发编程 | Future是如何优化程序性能

在初识Future一文中介绍了Future的核心方法。本文中接着介绍如何用Future优化我们的程序性能。 在此之前&#xff0c;有必要介绍Future接口的一个实现类FutureTask。 FutureTask介绍 FutureTask继承结构 首先我们看一下FutureTask的继承结构&#xff1a; public class Futur…

JUC阻塞队列(二):LinkedBlockingQueue

1、LinkedBlockingQueue 介绍 LinkedBlockingQueue 也是接口BlockingQueue的一个实现类&#xff0c;与 ArrrayBlockingQueue基于 数组实现不同的是&#xff0c;LinkedBlockingQueue是基于单项链表实现的&#xff0c;在LinkedBlockingQueue 内部维护了一个单向链表来存储数据&am…

探索深度学习的力量:从人工智能到计算机视觉的未来科技革命

目录 1. 引言 2. 人工智能的历史背景 3. 深度学习的崛起 3.1 深度神经网络的基本原理 4. 计算机视觉的发展现状 4.1 传统计算机视觉与深度学习的结合 5. 深度学习在计算机视觉中的应用 5.1 图像分类 5.2 目标检测 6. 深度学习引领的未来科技创新与变革 7. 结论 引言…

opencv cv.findContours 函数图像轮廓层级(记录)

opencv cv.findContours 函数详解 图像轮廓层级 图像轮廓检索方式 cv.findContours contours, hierarchy cv.findContours( image, mode, method[, contours[, hierarchy[, offset]]] ) 参数1&#xff1a;源图像 参数2&#xff1a;轮廓的检索方式&#xff0c;主要参数 参数3…

专题--自底向上的计算机网络(物理层)

目录 计算机网络概述 物理层 数据链路层 网络层 运输层 应用层 网络安全 详细见http://t.csdnimg.cn/MY5aI http://t.csdnimg.cn/8Ipa4 http://t.csdnimg.cn/uvMxS

康耐视相机与发那科机器人通过Ethernet I/P直连与程序编写

配置TCP/IP&#xff1a;按MENU—SETUP—NEXT—HOSTCOMM&#xff0c;选择TCP/IP—按ENTER或者F3[DETAIL] Port#1 IP addr&#xff1a;输入机器人IP地址&#xff0c;按ENTER后输入&#xff0c;如192.168.1.11&#xff1b;如果控制柜有2个网络端口&#xff0c;则按F3[PORT]进行切换…

科创中心“核”动力|趋动科技:AI算力界的领跑者

近日&#xff0c;趋动科技与深信服正式推出联合解决方案。联合解决方案将深信服EDS的高性能存储与趋动科技OrionX AI算力资源池化软件、以及GeminiAI训练平台有机结合&#xff0c;整合存力与算力资源的同时&#xff0c;帮助用户建好AI平台、管好AI资源、用好AI服务。 双方已完成…

监控zabbix的安装与使用

文章目录 1.zabbix的安装步骤2.zabbix的主动模式和被动模式简介及实现3.zabbix proxy主动及被动4.自定义监控&#xff0c;监控linux和连接状态&#xff0c;创建email进行基础报警5.部署zabbix agent脚本&#xff0c;适配rocky和ubuntu系统6.使用脚本&#xff0c;基于zabbix api…

yolov8旋转框+关键点检测

一、Yolov8obb_kpt -----------------------------------现已在v8官方库上更新旋转框分割算法和旋转框关键点检测算法-------------------------- ------------------------------------------- https://github.com/yzqxy/ultralytics-obb_segment---------------------------…

每天五分钟深度学习框架pytorch:自动求导机制

本文重点 深度学习框架pytorch拥有自动求导的机制,自动求导是 PyTorch 中非常重要的特性,能够让我们避免手动去计算非常复杂的导数,这能够极大地减少了我们构建模型的时间。本文学习的是第10步反向传播,学习路线参考前面一篇文章。 pytorch0.4版本 在pytorch的0.4版本中…

YOLO知识点总结:

分类&#xff1a; 即是将图像结构化为某一类别的信息&#xff0c;用事先确定好的类别(category)或实例ID来描述图片。这一任务是最简单、最基础的图像理解任务&#xff0c;也是深度学习模型最先取得突破和实现大规模应用的任务。其中&#xff0c;ImageNet是最权威的评测集&…

C语言刷题日记(附详解)(1)

一、选择判断部分 第一题&#xff1a; 如下代码是否存在风险&#xff0c;并说明原因和修改方案 #include<stdio.h> int main() {char* str "hello world";*str a;return 0; }思路提示&#xff1a;这种形式的字符串存储在什么区域呢&#xff1f;是否真的有…

【个人笔记公司项目】vue项目配置代理解决跨域问题

前后端分离模式势必会遇到跨域问题&#xff0c;比如我是10.106.46.169:8080要去请求10.114.46.108:9191。下面讲下代理详细步骤。 本文步骤基于本人的项目结构 一般项目结构已支持代理 // 部署时需要将改开关置为false window.isDev trueif (window.isDev) { // Devwindow.l…