首页 > 其他分享 >vue3 响应式 API:computed()

vue3 响应式 API:computed()

时间:2024-08-20 09:27:23浏览次数:14  
标签:info set computed value name API 计算 vue3 属性

介绍

  • 基本概念
    • 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的值,从而实现双向绑定的效果。

标签:info,set,computed,value,name,API,计算,vue3,属性
From: https://blog.csdn.net/fishmemory7sec/article/details/141322279

相关文章

  • vue3---vite框架
    在使用VUE3的时候,可以使用vite脚手架:Vite的特点:1.快速的冷启动,不需要等待打包2.即时的热模块更新3.真正的按需编译,不用等待整个项目编译完成1、构建vite项目npminitvite@latest#初始化vite项目或者npmcreatevite@latest#创建vite项目选择Vue根据醒目需要选......
  • 033、Vue3+TypeScript基础,路由传参时候把层级脱掉
    01、Datail.vue代码如下:<template><ulclass="news-list"><li>编号:{{route.query.id}}</li><li>编号:{{route.query.title}}</li><li>编号:{{route.query.content}}</li></ul></tem......
  • 【收藏】Arcgis api4.x renderer根据字段值渲染,唯一值渲染和分级渲染
    1.根据字段值渲染(唯一值渲染)  定义唯一值渲染器中每个唯一值的样式,以根据数据字段的不同值为要素指定不同的符号,从而实现基于分类数据的图形化表示。 constrenderer={type:"unique-value",field:"type",defaultSymbol:{type:"simple-marke......
  • 图片热区。vue3+ts和vue3+js写法(js没写完数据,功能完善)2
    不知道为啥我上一篇的图片热区被移出首页,其实我主要是是为了自己看,其次才是分享,这段时间我又整理了一下热区,将里面的功能进一步完善了一下;解决一下问题:1.解决拖拽到规定区域外后松开鼠标再次进入后,坐标错误的问题2.新增6个方向的拖拽放大缩小热区区域3.新增放大了图片区域4.......
  • AI 创业及变现新思路:零门槛 AI 绘图,定制 ComfyUI Serverless API 应用
    作者:鸥弋、筱姜2023年下半年,ComfyUI以其快速、流畅的图像生成能力,结合多样的自定义节点,迅速在创作者中流行起来。ComfyUI的亮点就是能够批量化生成图像,一键加载大量工作流,让用户可以轻松实现人像生成、背景替换、风格迁移和图像动画化等功能。越来越多的企业及个人开发者希望......
  • vue3 之 多张图片压缩下载
    一、涉及的插件①JSZip:jszip是一个用于创建、读取和编辑.zip文件的JavaScript库② FileSaver:FileSaver是一个用于在客户端保存文件的JavaScript库。它提供了一种简单的方式来将数据保存为本地文件,通常用于在浏览器中将动态生成的内容(如图像、文档、压缩文件等)保存......
  • 解决Vue3+Ts打包项目时会生成很多的map文件
     正常打包会生成.js和.map文件怎么去解决它呢?正常来说我们会在vite.config.ts配置我们的项目打包方式,如下:(我这里的target:es2022是为了支持模块中顶层await的使用)//Vite配置文件exportdefault{build:{//指定构建输出目录outDir:"dist",//使用"......
  • 一款专为IntelliJ IDEA用户设计的插件,极大简化Spring项目中的API调试过程,功能强大(附源
    前言在软件开发过程中,尤其是SpringMVC(Boot)项目中,API调试调用是一项常见但繁琐的任务。现有的开发工具虽然提供了一些支持,但往往存在效率不高、操作复杂等问题。为了处理这些痛点,提升开发效率,一款新的工具应运而生。介绍CoolRequest是一款专为IntelliJIDEA用户设计的插......
  • JAVA常用API
     目录1.Math1.1Math类概述1.2Math中方法的调用方式1.3Math类的常用方法2.System 2.1System类的常用方法2.2示例代码3.Object类的toString方法3.1Object类概述3.2查看源代码的方式3.3重写toString方法的方式3.4toString方法的作用4.Object类的equals方......
  • vue3+watch
    watch—vue3是一个惰性,所谓惰性,就是被动的去进行调用,而不是主动的去进行触发,可以通过使用immediate来等进行立即执行调用如何在初始阶段进行触发呢?了解到watch中的参数watch(参数一:监听的数据,参数二:回调函数()=>{编辑代码},参数三:option?用于执行一些配置选项)参数一:是在se......