Vue 3 计算属性(Computed Properties)知识点详解与案例代码

在 Vue 3 中,计算属性(Computed Properties) 是用于基于响应式数据派生新数据的一种方式。计算属性具有以下特点:

  • 缓存性:只有在依赖的响应式数据发生变化时,计算属性才会重新计算,否则会返回缓存的结果。
  • 可读性:计算属性用于获取数据,而不是修改数据。
  • 响应性:计算属性会自动追踪其依赖的响应式数据,并在依赖变化时自动更新。

一、计算属性的语法知识点

1. 基本语法

在 Vue 3 中,计算属性通常在 setup 函数中使用 computed 函数来定义。

import { ref, computed } from 'vue';export default {setup() {const count = ref(0);const doubleCount = computed(() => count.value * 2);return {count,doubleCount};}
};

2. 使用 computed 函数

computed 函数接受一个 getter 函数 作为参数,并返回一个 只读的响应式引用(Readonly Ref)

const double = computed(() => count.value * 2);

3. 可写的计算属性

默认情况下,计算属性是只读的。如果需要可写的计算属性,可以传递一个包含 getset 方法的对象。

const firstName = ref('John');
const lastName = ref('Doe');const fullName = computed({get: () => `${firstName.value} ${lastName.value}`,set: (value) => {const parts = value.split(' ');firstName.value = parts[0];lastName.value = parts[1];}
});

4. 依赖追踪

计算属性会自动追踪其内部使用的响应式数据,并在这些数据变化时重新计算。

const firstName = ref('John');
const lastName = ref('Doe');const fullName = computed(() => `${firstName.value} ${lastName.value}`);

firstNamelastName 变化时,fullName 会自动更新。

5. 懒计算

计算属性只有在首次访问时才会计算,并且只有在依赖变化时才会重新计算。这使得计算属性在需要复杂计算时非常高效。


二、案例代码

以下是一个完整的 Vue 3 单文件组件(Single File Component, SFC)示例,展示了计算属性的使用,包括基本计算属性、可写的计算属性以及依赖追踪。

<template><div><h1>Vue 3 计算属性示例</h1><!-- 基本计算属性 --><div><p>当前计数: {{ count }}</p><p>双倍计数: {{ doubleCount }}</p><button @click="increment">增加计数</button></div><!-- 可写的计算属性 --><div><p>全名: {{ fullName }}</p><input v-model="fullName" placeholder="输入全名" /><p>名字: {{ firstName }}</p><p>姓氏: {{ lastName }}</p></div><!-- 依赖追踪示例 --><div><p>名字: {{ firstName }}</p><p>姓氏: {{ lastName }}</p><p>全名: {{ fullName }}</p><input v-model="firstName" placeholder="输入名字" /><input v-model="lastName" placeholder="输入姓氏" /></div></div>
</template><script>
import { ref, computed } from 'vue';export default {name: 'ComputedPropertiesExample',setup() {// 基本计算属性const count = ref(0);const doubleCount = computed(() => count.value * 2);const increment = () => {count.value++;};// 可写的计算属性const firstName = ref('John');const lastName = ref('Doe');const fullName = computed({get: () => `${firstName.value} ${lastName.value}`,set: (value) => {const parts = value.split(' ');if (parts.length >= 2) {firstName.value = parts[0];lastName.value = parts[1];} else {firstName.value = value;lastName.value = '';}}});return {count,doubleCount,increment,firstName,lastName,fullName};}
};
</script><style scoped>
h1 {color: #42b983;
}div {margin-bottom: 20px;
}button {padding: 5px 10px;margin-top: 5px;
}input {padding: 5px;margin-top: 5px;
}
</style>

代码详解

  1. 导入 refcomputed

    import { ref, computed } from 'vue';
    
    • ref 用于创建响应式数据。
    • computed 用于创建计算属性。
  2. 基本计算属性

    const count = ref(0);
    const doubleCount = computed(() => count.value * 2);
    
    • count 是一个响应式的数据。
    • doubleCount 是一个计算属性,其值始终是 count 的两倍。
  3. 增加计数的函数

    const increment = () => {count.value++;
    };
    
    • increment 函数用于增加 count 的值。
  4. 可写的计算属性

    const fullName = computed({get: () => `${firstName.value} ${lastName.value}`,set: (value) => {const parts = value.split(' ');if (parts.length >= 2) {firstName.value = parts[0];lastName.value = parts[1];} else {firstName.value = value;lastName.value = '';}}
    });
    
    • fullName 是一个可写的计算属性。
    • fullName 被设置时,会自动更新 firstNamelastName
    • firstNamelastName 变化时,fullName 也会自动更新。
  5. 模板部分

    <template><div><!-- 基本计算属性 --><div><p>当前计数: {{ count }}</p><p>双倍计数: {{ doubleCount }}</p><button @click="increment">增加计数</button></div><!-- 可写的计算属性 --><div><p>全名: {{ fullName }}</p><input v-model="fullName" placeholder="输入全名" /><p>名字: {{ firstName }}</p><p>姓氏: {{ lastName }}</p></div><!-- 依赖追踪示例 --><div><p>名字: {{ firstName }}</p><p>姓氏: {{ lastName }}</p><p>全名: {{ fullName }}</p><input v-model="firstName" placeholder="输入名字" /><input v-model="lastName" placeholder="输入姓氏" /></div></div>
    </template>
    
    • 基本计算属性:展示当前计数和双倍计数,并提供按钮增加计数。
    • 可写的计算属性:通过 v-model 绑定 fullName,输入全名会自动更新 firstNamelastName
    • 依赖追踪示例:展示 firstNamelastName,并通过输入框修改它们,fullName 会自动更新。
  6. 样式部分

    <style scoped>
    h1 {color: #42b983;
    }div {margin-bottom: 20px;
    }button {padding: 5px 10px;margin-top: 5px;
    }input {padding: 5px;margin-top: 5px;
    }
    </style>
    
    • 使用 scoped 属性确保样式仅作用于当前组件。
    • 设置了一些基本的样式。

三、运行效果

  1. 基本计算属性

    • 页面加载时,count0doubleCount0
    • 点击“增加计数”按钮,count 增加,doubleCount 自动更新为 count 的两倍。
  2. 可写的计算属性

    • 输入框中输入新的全名,例如 Jane SmithfirstName 会更新为 JanelastName 会更新为 Smith
    • 修改 firstNamelastNamefullName 会自动更新。
  3. 依赖追踪示例

    • 修改 firstNamelastNamefullName 会自动更新。
    • 修改 fullNamefirstNamelastName 会根据输入自动调整。

四、案例代码

<template><div class="computed-demo"><h2>Vue3 计算属性示例</h2><!-- 基础用法展示 --><div class="basic-example"><h3>1. 基础只读计算属性</h3><p>姓: <input v-model="firstName" /></p><p>名: <input v-model="lastName" /></p><p>全名: {{ fullName }}</p><p>全名长度: {{ fullNameLength }}</p></div><!-- 可写计算属性展示 --><div class="writable-example"><h3>2. 可写计算属性</h3><p>输入全名: <input v-model="fullNameWritable" /></p><p>拆分结果: {{ firstName }} {{ lastName }}</p></div><!-- 计算属性与方法对比 --><div class="comparison-example"><h3>3. 计算属性与方法对比</h3><p>计算属性 (缓存): {{ reversedMessage }} (访问次数: {{ computedAccessCount }})</p><p>方法 (无缓存): {{ reversedMessageMethod() }} (调用次数: {{ methodCallCount }})</p><button @click="incrementCount">点击增加计数</button><p>当前计数: {{ count }}</p></div></div>
</template><script setup>
import { ref, computed } from 'vue';// 1. 基础示例数据
const firstName = ref('张');
const lastName = ref('三');// 基础只读计算属性:计算全名
const fullName = computed(() => {// 当firstName或lastName变化时,会重新计算return `${firstName.value} ${lastName.value}`;
});// 计算属性可以依赖其他计算属性
const fullNameLength = computed(() => {// 依赖fullName计算属性return fullName.value.length;
});// 2. 可写计算属性示例
const fullNameWritable = computed({// getter:获取值时调用get() {return `${firstName.value} ${lastName.value}`;},// setter:设置值时调用set(newValue) {// 将输入的全名拆分为姓和名const [first, last] = newValue.split(' ');firstName.value = first || '';lastName.value = last || '';}
});// 3. 计算属性与方法对比示例
const count = ref(0);
const message = ref('Hello Vue3');
const computedAccessCount = ref(0);
const methodCallCount = ref(0);// 计算属性版本:反转消息
const reversedMessage = computed(() => {computedAccessCount.value++;return message.value.split('').reverse().join('');
});// 方法版本:反转消息
function reversedMessageMethod() {methodCallCount.value++;return message.value.split('').reverse().join('');
}// 增加计数的方法
function incrementCount() {count.value++;
}
</script><style scoped>
.computed-demo {max-width: 800px;margin: 0 auto;padding: 20px;
}div > div {margin-bottom: 30px;padding: 15px;border: 1px solid #e0e0e0;border-radius: 8px;
}input {padding: 6px 10px;margin-left: 10px;border: 1px solid #ccc;border-radius: 4px;
}button {padding: 8px 16px;background-color: #42b983;color: white;border: none;border-radius: 4px;cursor: pointer;margin-top: 10px;
}button:hover {background-color: #359e75;
}
</style>

4.1.代码解析

  1. 基础只读计算属性
    • fullName 依赖 firstNamelastName 两个响应式数据
    • 当输入框中的值变化时,fullName 会自动更新
    • fullNameLength 依赖 fullName 这个计算属性,形成计算属性链
  2. 可写计算属性
    • fullNameWritable 同时定义了 getset 方法
    • 当读取时,会调用 get 方法拼接全名
    • 当修改输入框的值时,会调用 set 方法拆分全名到 firstNamelastName
  3. 计算属性与方法对比
    • 点击按钮只会改变 count 的值,不会影响 message
    • 计算属性 reversedMessage 因为依赖没有变化,不会重新计算,访问次数不变
    • 方法 reversedMessageMethod 每次访问都会重新执行,调用次数会增加

五、总结

通过上述知识点和案例代码,可以看出 Vue 3 的计算属性在处理基于响应式数据的派生数据时非常强大且高效。计算属性不仅简化了代码逻辑,还提高了应用的性能和可维护性。在实际开发中,合理使用计算属性可以大大提升开发效率和代码质量。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2.5 PN-PTCP

Profinet Precision Transparent Clock Protocol (PN-PTCP) PN-PTCP&#xff08;精确透明时钟协议&#xff09;是一种专用于 Profinet 的 二层协议&#xff0c;其作用是为网络中的设备提供高精度的时间同步。用于实现网络设备的高精度时间同步。

WordPress与Typecho站点CloudFlare缓存优化实战指南

文章目录 WordPress与Typecho站点CloudFlare缓存加速全攻略 引言 一、CloudFlare缓存基础原理 1.1 CloudFlare工作流程 1.2 缓存类型 二、基础配置指南 2.1 CloudFlare账户设置 2.2 缓存配置 2.3 页面规则设置 三、高级缓存策略 3.1 动态内容缓存 WordPress方案: Typecho方案:…

【OpenCV实现多图像拼接】

文章目录1 OpenCV 图像拼接核心原理2 OpenCV 图像拼接实现代码方法一&#xff1a;使用 OpenCV 内置 Stitcher 类&#xff08;推荐&#xff09;方法二&#xff1a;手动实现核心步骤关键参数说明3 常见问题处理4 增量式图像拼接&#xff08;Incremental Image Stitching&#xff…

haproxy 算法

一、静态算法按照事先定义好的规则轮询公平调度&#xff0c;不关心后端服务器的当前负载、连接数和响应速度 等&#xff0c;且无法实时修改权重(只能为0和1,不支持其它值)&#xff0c;只能靠重启HAProxy生效。(不管后端死活&#xff09;1.1、static-rr&#xff1a;基于权重的轮…

Go 的第一类对象与闭包

1. Go 的第一类对象&#xff08;First-Class Citizens&#xff09; 什么是第一类对象&#xff1f; 第一类对象是指能够像 普通值 一样使用的对象&#xff0c;通常可以赋值给变量、传递给函数、作为函数返回值等。在很多编程语言中&#xff0c;函数本身不被视为第一类对象&#…

深度分析Android多线程编程

理解并正确运用多线程是构建高性能、流畅、响应迅速的 Android 应用的关键&#xff0c;但也充满挑战和陷阱。 核心挑战&#xff1a;UI 线程&#xff08;主线程&#xff09;的限制 唯一性&#xff1a; Android 应用只有一个主线程&#xff0c;负责处理所有用户交互&#xff08;触…

uniapp在app中关于解决输入框键盘弹出后遮住输入框问题

问题描述&#xff1a; uniapp的app中&#xff0c;当表单页面过长时&#xff0c;点击下方的输入框时&#xff0c;弹出键盘后会把输入框给挡住&#xff0c;导致看不到输入内容。 解决方案&#xff1a; 在page.json中&#xff0c;找到此页面的配置&#xff0c;加上style中的softin…

二分查找----5.寻找旋转排序数组中的最小值

题目链接 /** 数组在某处进行旋转,分割为两个独立的递增区间,找出数组的最小值;特殊情况:若旋转次数是数组长度的倍数,则数组不变 特点: 常规情况: 数组被分割为两个独立的子区间,左半区的最小值大于右半区的最大值 依据数组长度,mid可能落在左半区也有可能落在右半区,最小值在…

Eureka-服务注册,服务发现

在远程调用的时候&#xff0c;我们写的url是写死的。 String url "<http://127.0.0.1:9090/product/>" orderInfo.getProductId();当换个机器&#xff0c;或者新增个机器&#xff0c;导致ip变换&#xff0c;从而使得 url 发生了变化&#xff0c;接着就需要去…

ubuntu24的一些小问题

截图Keyboard -> Keyboard Shortcus -> View and customize Shortcus如上&#xff0c;可以修改默认的快捷按键。比如截图按键可以修改。 ibus输入法无法&#xff0c;输入V异常问题 也是困扰了很久&#xff0c;发现是这样的&#xff1a;https://github.com/libpinyin/ibus…

Python Locust库详解:从入门到分布式压力测试实战

一、Locust核心优势 作为一款基于Python的开源负载测试工具&#xff0c;Locust通过协程架构实现了高效资源利用。其独特优势体现在&#xff1a; 纯Python脚本&#xff1a;用熟悉的语言定义用户行为&#xff0c;支持条件判断和复杂逻辑分布式扩展&#xff1a;单节点支持数千并发…

Redis数据类型与内部编码

在Redis中通常普遍认为&#xff0c;使用redis的能进行查询&#xff0c;插入&#xff0c;删除&#xff0c;修改操作都是O(1)是因为他是利用hash表实现的&#xff0c;但是&#xff0c;背后的实现不一定是一个标准的hash表&#xff0c;它内部的数据类型还会有变数&#xff0c;不过…

03-netty基础-多路复用select、poll、epoll

1 什么是多路复用多路复用&#xff08;Multiplexing&#xff09; 是一种让单个线程同时处理多个 I/O 通道的技术&#xff0c;核心是通过系统调用将 I/O 状态查询的工作交给操作系统内核&#xff0c;应用程序只需等待内核通知哪些通道就绪。多路&#xff1a;指的是多个socket网络…

网易大模型算法面经总结第一篇

网友一 MHA的原理&#xff0c;是如何进行加速的&#xff0c;用的什么框架推理。 回答&#xff1a; ①先答一下什么是MHA&#xff1a;Multi-Head Attention&#xff08;MHA&#xff09;是 Transformer 的核心机制&#xff0c;并行地关注输入序列中不同位置的多种信息 ②回答MHA的…

Vue3 面试题及详细答案120道(91-105 )

《前后端面试题》专栏集合了前后端各个知识模块的面试题&#xff0c;包括html&#xff0c;javascript&#xff0c;css&#xff0c;vue&#xff0c;react&#xff0c;java&#xff0c;Openlayers&#xff0c;leaflet&#xff0c;cesium&#xff0c;mapboxGL&#xff0c;threejs&…

SAP-MM-物料进销存表

ABAP库存进销存报表程序摘要 该ABAP程序是一个完整的库存进销存报表系统,主要功能包括: 报表类型选择: 物料库存进销存 批次库存进销存 寄售库存进销存 供应商库存进销存 原料库存进销存 主要功能: 从历史数据表(MARDH, MSKAH, MSLBH, MCHBH等)获取期初库存 处理物料移动数…

这几天都是发癫写的

#include <iostream> #include <vector> #include <unordered_map> #include <algorithm> #include <cmath> // for sqrt// Gen-Sort 实现&#xff08;保持不变&#xff09; void genSort(std::vector<int>& arr) {if (arr.empty()) r…

QT6 源,七章对话框与多窗体(11) 进度对话框 QProgressDialog:属性,公共成员函数,槽函数,信号函数,与源代码带注释

&#xff08;1&#xff09; 本类的继承关系 &#xff1a;可见&#xff0c;进度对话框&#xff0c;也是 QDialog 的子类&#xff0c;在其上面又摆放了一些控件&#xff0c;构成了不同用途的对话框。咱们也可以自定义对话框。只是没有 QT 官方大师们做的好。 人家在定义这 6 个子…

学习游戏制作记录(技能系统)7.24

1.技能系统概念首先让我们了解一下游戏的技能本质是什么&#xff0c;以投掷剑为例子&#xff0c;当玩家使用这个技能时&#xff0c;首先会播放玩家的动画&#xff0c;随后通过技能脚本创建一个剑的对象&#xff0c;当剑回收时会再次调用脚本&#xff0c;让它朝向玩家飞来并销毁…

外部存档(External Archive)机制

前言 提醒&#xff1a; 文章内容为方便作者自己后日复习与查阅而进行的书写与发布&#xff0c;其中引用内容都会使用链接表明出处&#xff08;如有侵权问题&#xff0c;请及时联系&#xff09;。 其中内容多为一次书写&#xff0c;缺少检查与订正&#xff0c;如有问题或其他拓展…