0

0

Vue.js计算属性基于组合式API的Getter逻辑抽离封装

冰川箭仙

冰川箭仙

发布时间:2026-03-13 00:29:26

|

862人浏览过

|

来源于php中文网

原创

计算属性Getter逻辑抽离是将computed内部响应式逻辑封装为可复用函数,解决重复、难维护、难测试问题;基础模式为纯函数,增强模式返回computed实例,进阶支持多依赖响应式追踪。

vue.js计算属性基于组合式api的getter逻辑抽离封装

在 Vue 3 的组合式 API 中,计算属性(computed)本质是响应式 getter 函数的封装。所谓“Getter 逻辑抽离封装”,核心目标是把原本写在 setup()script setup 内部的 computed(() => ...) 表达式,提取为可复用、可测试、职责清晰的独立函数。

为什么需要抽离 Getter 逻辑?

直接在组件内写 computed(() => a.value + b.value * 2) 看似简洁,但当逻辑变复杂(如多层嵌套、条件判断、格式化、依赖多个 ref/state)、或多个组件需复用相同样本计算规则时,就会出现重复、难维护、难单元测试等问题。抽离后,计算逻辑与组件解耦,便于复用和验证。

如何封装一个可复用的计算属性 Getter?

关键不是封装 computed 本身,而是封装其内部的响应式 getter 函数——即返回一个接收响应式源并返回响应式结果的工厂函数。它通常不直接调用 computed,而是交由使用者决定何时响应式包装。

Magic AI Avatars
Magic AI Avatars

神奇的AI头像,获得200多个由AI制作的自定义头像。

下载
  • 基础模式:纯函数式 Getter
    封装一个接收 ref 或 reactive 对象、返回派生值的函数(非响应式),适合简单逻辑或配合 computed 使用:
```js
// composables/useFullName.js
export function getFullName(firstName, lastName) {
  return `${firstName?.trim() || ''} ${lastName?.trim() || ''}`.trim();
}

// 组件中使用
import { getFullName } from '@/composables/useFullName';
import { computed, ref } from 'vue';

const firstName = ref('John');
const lastName = ref('Doe');
const fullName = computed(() => getFullName(firstName.value, lastName.value));
```
  • 增强模式:返回 computed 的工厂函数
    更进一步,封装一个返回 computed 实例的函数,内部自动处理响应式依赖,调用者只需传入 ref/reactive:
```js
// composables/useSortedItems.js
import { computed } from 'vue';

export function useSortedItems(itemsRef, compareFn = (a, b) => a.localeCompare(b)) {
  return computed(() => [...(itemsRef.value || [])].sort(compareFn));
}

// 组件中
const items = ref(['c', 'a', 'b']);
const sorted = useSortedItems(items); // 直接得到 computed Ref
```
  • 进阶:支持自定义依赖与副作用
    若计算逻辑需监听额外信号(如筛选关键词、排序字段),可将这些也作为参数传入,并统一纳入 computed 依赖追踪:
```js
// composables/useFilteredAndSorted.js
import { computed } from 'vue';

export function useFilteredAndSorted(listRef, filterRef, sortKeyRef, sortOrderRef = ref('asc')) {
  return computed(() => {
    let result = listRef.value || [];
    if (filterRef.value) {
      result = result.filter(item =>
        item[sortKeyRef.value]?.toString().includes(filterRef.value)
      );
    }
    return result.sort((a, b) => {
      const aVal = a[sortKeyRef.value];
      const bVal = b[sortKeyRef.value];
      const diff = aVal > bVal ? 1 : aVal       return sortOrderRef.value === 'desc' ? -diff : diff;
    });
  });
}
```

注意事项与最佳实践

  • 避免在封装函数内部调用 ref()reactive() —— 响应式数据应由调用方提供,保持函数无副作用、可预测;
  • 不要在 getter 封装里执行异步操作或产生副作用(如 console.log、API 调用)—— 计算属性必须是同步且无副作用的纯函数;
  • 命名建议以 getXXX(纯函数)或 useXXX(返回 computed/ref 的组合式函数)区分语义;
  • 配合 TypeScript 时,为入参和返回值标注明确类型,提升可读性与安全性;
  • 复杂业务计算若涉及缓存、防抖、节流等需求,更适合用 useMemo-风格自定义 Hook(基于 onBeforeUpdatewatchEffect),而非强行塞进 computed

小结:抽离的本质是关注点分离

Getter 逻辑抽离不是为了炫技,而是让组件只关心“用什么”,而不操心“怎么算”。把计算规则沉淀为可组合、可配置、可测试的函数,是构建健壮 Vue 3 应用的重要习惯。实际项目中,从 getDisplayNameuseSearchResults,尺度可大可小,关键是让逻辑归位、职责清晰。

立即学习前端免费学习笔记(深入)”;

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
TypeScript工程化开发与Vite构建优化实践
TypeScript工程化开发与Vite构建优化实践

本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

47

2026.02.13

TypeScript全栈项目架构与接口规范设计
TypeScript全栈项目架构与接口规范设计

本专题面向全栈开发者,系统讲解基于 TypeScript 构建前后端统一技术栈的工程化实践。内容涵盖项目分层设计、接口协议规范、类型共享机制、错误码体系设计、接口自动化生成与文档维护方案。通过完整项目示例,帮助开发者构建结构清晰、类型安全、易维护的现代全栈应用架构。

194

2026.02.25

vue.js为什么报错
vue.js为什么报错

vue.js报错的原因:1、语法错误;2、组件使用不当;3、数据绑定问题;4、生命周期钩子使用不当;5、插件或依赖问题;6、路由配置错误;7、异步操作处理不当等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

128

2024.03.11

vue.js插槽有哪些用
vue.js插槽有哪些用

vue.js插槽的作用:1、提高组件的可重用性;2、实现组件的灵活布局;3、实现组件间的数据传递和交互;4、促进组件的解耦和模块化。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

187

2024.03.11

vue.js怎么带参数跳转
vue.js怎么带参数跳转

vue.js带参数跳转的方法:1、定义路由;2、在组件中使用路由参数;3、进行带参数的跳转。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

98

2024.03.11

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

847

2023.08.22

sort排序函数用法
sort排序函数用法

sort排序函数的用法:1、对列表进行排序,默认情况下,sort函数按升序排序,因此最终输出的结果是按从小到大的顺序排列的;2、对元组进行排序,默认情况下,sort函数按元素的大小进行排序,因此最终输出的结果是按从小到大的顺序排列的;3、对字典进行排序,由于字典是无序的,因此排序后的结果仍然是原来的字典,使用一个lambda表达式作为key参数的值,用于指定排序的依据。

409

2023.09.04

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

562

2023.09.20

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Vue 教程
Vue 教程

共42课时 | 9.5万人学习

Vue3.x 工具篇--十天技能课堂
Vue3.x 工具篇--十天技能课堂

共26课时 | 1.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号