当前位置: 首页 > article >正文

Vue 3 中的计算属性:只读与可读写的使用与案例

在 Vue 3 中,计算属性(Computed Properties)是一种强大的工具,它允许我们根据响应式数据动态计算并返回一个新的值。计算属性具有缓存机制,只有当依赖的响应式数据发生变化时,才会重新计算。本文将详细介绍 Vue 3 中计算属性的使用,并通过只读和可读写两种案例来演示其实际应用。本文将使用 <script setup> 语法,这是 Vue 3 中推荐的一种更简洁的写法。


1. 计算属性的基本概念

计算属性是通过 computed 函数创建的,它接收一个 getter 函数作为参数,并返回一个只读的 ref 对象。如果需要创建一个可读写的计算属性,可以传入一个包含 getset 函数的对象。

1.1 只读计算属性

只读计算属性是最常见的用法,它根据依赖的响应式数据动态计算并返回一个值。

import { ref, computed } from 'vue';

const count = ref(0);

// 只读计算属性
const doubleCount = computed(() => count.value * 2);

console.log(doubleCount.value); // 0
count.value = 5;
console.log(doubleCount.value); // 10

1.2 可读写计算属性

可读写计算属性允许我们在读取和写入时执行自定义逻辑。它通过传入一个包含 getset 函数的对象来实现。

import { ref, computed } from 'vue';

const count = ref(0);

// 可读写计算属性
const doubleCount = computed({
  get: () => count.value * 2,
  set: (newValue) => {
    count.value = newValue / 2;
  }
});

console.log(doubleCount.value); // 0
doubleCount.value = 10; // 设置 doubleCount 的值
console.log(count.value); // 5

2. 只读计算属性案例:老师信息

假设我们有一个老师的信息对象,包含姓名、年龄和教授的课程。我们可以使用只读计算属性来动态计算老师的教龄。

2.1 代码示例

<template>
  <div>
    <h2>老师信息</h2>
    <p>姓名: {{ teacher.name }}</p>
    <p>年龄: {{ teacher.age }}</p>
    <p>教龄: {{ teachingYears }}</p>
    <p>课程: {{ teacher.course }}</p>
  </div>
</template>

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

// 定义老师信息的响应式对象
const teacher = reactive({
  name: '张老师',
  age: 40,
  course: '数学'
});

// 只读计算属性:计算教龄
const teachingYears = computed(() => teacher.age - 22);
</script>

2.2 代码解析

  1. 响应式对象

    • 使用 reactive 创建了一个包含老师信息的响应式对象 teacher
  2. 只读计算属性

    • 使用 computed 创建了一个只读计算属性 teachingYears,它根据 teacher.age 动态计算教龄。
  3. 模板中使用

    • 在模板中直接使用 teachingYears,它会随着 teacher.age 的变化自动更新。

3. 可读写计算属性案例:老师信息

假设我们需要允许用户修改老师的教龄,并自动更新老师的年龄。我们可以使用可读写计算属性来实现这一功能。

3.1 代码示例

<template>
  <div>
    <h2>老师信息</h2>
    <p>姓名: {{ teacher.name }}</p>
    <p>年龄: {{ teacher.age }}</p>
    <p>教龄: <input v-model="teachingYears" /></p>
    <p>课程: {{ teacher.course }}</p>
  </div>
</template>

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

// 定义老师信息的响应式对象
const teacher = reactive({
  name: '张老师',
  age: 40,
  course: '数学'
});

// 可读写计算属性:教龄
const teachingYears = computed({
  get: () => teacher.age - 22,
  set: (newValue) => {
    teacher.age = newValue + 22;
  }
});
</script>

3.2 代码解析

  1. 响应式对象

    • 使用 reactive 创建了一个包含老师信息的响应式对象 teacher
  2. 可读写计算属性

    • 使用 computed 创建了一个可读写计算属性 teachingYears
    • get 函数根据 teacher.age 计算教龄。
    • set 函数根据用户输入的教龄更新 teacher.age
  3. 双向绑定

    • 在模板中使用 v-model 绑定 teachingYears,用户可以通过输入框修改教龄。
    • 修改教龄后,teacher.age 会自动更新,并触发视图重新渲染。

4. 总结

  • 只读计算属性

    • 适用于根据响应式数据动态计算并返回一个值的场景。
    • 通过 computed 函数传入 getter 函数实现。
  • 可读写计算属性

    • 适用于需要在读取和写入时执行自定义逻辑的场景。
    • 通过 computed 函数传入包含 getset 函数的对象实现。
  • <script setup> 语法

    • 使用 <script setup> 语法可以让代码更简洁,减少模板和逻辑之间的切换。
    • 适合在 Vue 3 项目中广泛使用。

通过本文的案例和代码示例,希望你能更好地理解 Vue 3 中计算属性的使用,并在实际项目中灵活运用它们来管理复杂的逻辑!


http://www.kler.cn/a/520868.html

相关文章:

  • 初阶1 入门
  • AIP-130 方法
  • 进程间通信
  • Day27-【13003】短文,线性表两种基本实现方式空间效率、时间效率比较?兼顾优点的静态链表是什么?如何融入空闲单元链表来解决问题?
  • MongoDB中常用的几种高可用技术方案及优缺点
  • springboot 动态配置定时任务
  • 图论汇总1
  • 项目概述与规划 (I)
  • 【算法】BFS
  • vue3和vue2的区别有哪些差异点
  • 【JavaEE进阶】图书管理系统 - 壹
  • LabVIEW 保存文件 生产者/消费者设计
  • Golang Gin系列-7:认证和授权
  • 小白买车记
  • 磐维数据库PanWeiDB2.0日常维护
  • ORB-SLAM2源码学习:Initializer.cc(11): Initializer::ReconstructH用H矩阵恢复R, t和三维点
  • fatal error C1083: ޷[特殊字符]ļ: openssl/opensslv.h: No such file or directory
  • 软件质量与测试报告3-功能测试 JUnit与覆盖测试 EclEmma
  • 深度学习|表示学习|卷积神经网络|非线形如何帮助卷积操作|11
  • 寒假学web--day09
  • 堆的简要分析与实现(Java)
  • CentOS/Linux Python 2.7 离线安装 Requests 库解决离线安装问题。
  • UE学习日志#12 Niagara特效大致了解(水文,主要是花时间读了读文档和文章)
  • 重回C语言之老兵重装上阵(十三)C 预处理器
  • 2025美赛美国大学生数学建模竞赛A题完整思路分析论文(43页)(含模型、可运行代码和运行结果)
  • C# 探秘:PDFiumCore 开启PDF读取魔法之旅