程序员scholar 程序员scholar
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
npm

(进入注册为作者充电)

  • Vue2

  • Vue3

    • 初识Vue3
    • 组合式API
    • Vue3中的data数据
    • vue3 的 script标签
    • setup函数中执行顺序
    • toRefs() 与 toRef()
    • computed()
      • 1. computed() 用法
        • 只读计算属性
        • 可读可写计算属性
      • 2. 示例
      • 3. 总结
    • Vue3弱化this
    • watch() 和 watchEffec()
    • define函数用法
    • defineExpose() 和 ref 属性
    • vue.config.js
    • 生命周期
    • Vue3全局API调用
    • 自定义 Hook
    • 传递数据(props)
    • 路由
    • pinia
    • 组件通信
    • getCurrentInstance() 和 nextTick()
    • Vue3 新组件
  • vue3 + TS 项目集成

  • Vue全家桶
  • Vue3
scholar
2024-08-05
目录

computed()

# computed()

computed 是 Vue 3 内置的函数,用于创建具有缓存的计算属性。它可以根据已有数据计算出新数据,与 Vue 2 中的 computed 功能一致。

  • 对于方法 function:没有缓存,模板调用几次,函数就执行几次。
  • 对于计算属性 computed:有缓存,模板调用多次,实际上只执行一次。

提示

计算属性(computed)返回的是一个 ref 对象,因此在赋值时需要加上 .value。这是因为 computed 属性本质上是一个响应式的 ref 对象,它的值是通过 get 方法计算出来的,赋值时需要通过 set 方法进行修改。

# 1. computed() 用法

# 只读计算属性

使用 computed 函数直接传入一个返回值的函数,用于定义只读的计算属性。这种计算属性只能读取,不能修改。

语法

import { ref, computed } from 'vue';

// 定义响应式变量 firstName 和 lastName
let firstName = ref('zhang');
let lastName = ref('san');

// 只读计算属性
let fullNameReadOnly = computed(() => {
  return firstName.value + '-' + lastName.value; // 通过拼接 firstName 和 lastName 生成 fullName
});
1
2
3
4
5
6
7
8
9
10

访问计算属性

console.log(fullNameReadOnly.value); // 输出 'zhang-san'
1

# 可读可写计算属性

使用 computed 函数传入一个对象,包含 get 和 set 方法,用于定义可读可写的计算属性。

  • get 方法用于读取计算属性的值。
  • set 方法用于修改计算属性的值。

语法

import { ref, computed } from 'vue';

// 定义响应式变量 firstName 和 lastName
let firstName = ref('zhang');
let lastName = ref('san');

// 可读可写计算属性
let fullName = computed({
  // 读取 fullName 的值
  get() {
    return firstName.value + '-' + lastName.value; // 通过拼接 firstName 和 lastName 生成 fullName
  },
  // 修改 fullName 的值
  set(val) {
    console.log('有人修改了fullName', val); // 输出新设置的 fullName
    const [first, last] = val.split('-'); // 将新设置的 fullName 拆分为 firstName 和 lastName
    firstName.value = first; // 更新 firstName 的值
    lastName.value = last; // 更新 lastName 的值
  }
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

访问和修改计算属性

console.log(fullName.value); // 输出 'zhang-san'

fullName.value = 'li-si'; // 修改 fullName 的值,触发 set 方法
console.log(firstName.value); // 输出 'li'
console.log(lastName.value); // 输出 'si'
1
2
3
4
5

提示

当我们访问计算属性时,会自动触发 get 方法,而修改计算属性时,会自动触发 set 方法

# 2. 示例

<template>
  <div class="person">
    姓:<input type="text" v-model="firstName"> <br>
    名:<input type="text" v-model="lastName"> <br>
    全名:<span>{{ fullName }}</span> <br>
    全名:<span>{{ fullName }}</span> <br>
    <button @click="changeFullName">全名改为:li-si</button>
  </div>
</template>

<script setup lang="ts" name="App">
import { ref, computed } from 'vue'; // 引入 computed

// 定义响应式变量 firstName 和 lastName
let firstName = ref('zhang');
let lastName = ref('san');

// 可读可写计算属性
let fullName = computed({
  // 读取 fullName 的值
  get() {
    return firstName.value + '-' + lastName.value; // 通过拼接 firstName 和 lastName 生成 fullName
  },
  // 修改 fullName 的值
  set(val) {
    console.log('有人修改了fullName', val); // 输出新设置的 fullName
    const [first, last] = val.split('-'); // 将新设置的 fullName 拆分为 firstName 和 lastName
    firstName.value = first; // 更新 firstName 的值
    lastName.value = last; // 更新 lastName 的值
  }
});

// 修改 fullName 的方法
function changeFullName() {
  fullName.value = 'li-si'; // 引起 set 中 val 的变化
}
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37

在上述示例中:

  • 定义了两个响应式变量 firstName 和 lastName。
  • 定义了一个可读可写的计算属性 fullName,通过 get 方法读取 firstName 和 lastName 的拼接值,通过 set 方法更新 firstName 和 lastName 的值。
  • 提供了一个修改 fullName 的方法 changeFullName,通过更新 fullName.value 来引起 set 方法的变化。

# 3. 总结

  • computed 用于创建具有缓存的计算属性,可以根据已有数据计算出新数据。
  • 计算属性返回的是一个 ref 对象,因此在赋值时需要加上 .value。
  • 计算属性可以是只读的,也可以是可读可写的,通过传入函数或包含 get 和 set 方法的对象来定义。
  • 访问计算属性时,自动触发 get 方法,修改计算属性时,自动触发 set 方法。
编辑此页 (opens new window)
上次更新: 2025/01/30, 23:55:43
toRefs() 与 toRef()
Vue3弱化this

← toRefs() 与 toRef() Vue3弱化this→

Theme by Vdoing | Copyright © 2019-2025 程序员scholar
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式