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

【Vue】Composables 和 Utils 区别

1. 核心功能与状态管理

• Composables

用于封装有状态的逻辑,通常结合 Vue 的响应式 API(如 refreactive)和生命周期钩子(如 onMounted),可管理组件内部的状态和副作用。例如,封装鼠标位置跟踪功能时,会维护 xy 的响应式变量。

// 示例:封装鼠标位置的 Composable
export function useMouse() {const x = ref(0);const y = ref(0);onMounted(() => { /* 监听事件 */ });return { x, y };
}

• Utils

用于处理无状态的纯逻辑,如数据格式化、数组操作等。它们不依赖 Vue 的响应式系统,也不涉及组件状态。例如,日期格式化工具函数仅接收输入并返回结果:

// 示例:日期格式化工具
export function formatDate(date) {return date.toISOString().split('T')[0];
}

2. 框架依赖性与复用范围

• Composables

深度依赖 Vue3 的组合式 API(如 ref、生命周期钩子),通常以 use 前缀命名(如 useFetchuseEventListener),适用于 Vue 组件内部复用逻辑,且每个组件实例会创建独立的状态。

• Utils

与框架无关,可以是纯 JavaScript/TypeScript 函数,适用于任何技术栈(如 React、原生 JS)。例如,字符串处理、数学计算等工具函数。


3. 适用场景

• Composables

• 需要响应式状态管理的场景(如 API 请求、事件监听)。

• 需要复用包含生命周期逻辑的功能(如组件挂载时初始化数据)。

• 需要组合多个逻辑(如将 useMouseuseEventListener 嵌套使用)。

• Utils

• 纯数据转换(如日期格式化、对象深拷贝)。

• 通用辅助功能(如防抖/节流、验证函数)。

• 与 UI 无关的逻辑(如数学计算、本地存储操作)。


4. 代码结构与设计目标

• Composables

强调逻辑的组合性,通过函数返回值暴露状态和方法,支持按需组合多个功能模块。例如,一个复杂的表单逻辑可以拆分为 useValidationuseSubmit

• Utils

强调单一职责,每个函数独立完成一个任务,不涉及状态管理。例如,capitalize 函数仅将字符串首字母大写。


5. 命名规范与类型支持

• Composables

遵循以 use 开头的命名约定(如 useCounter),并通过 TypeScript 提供强类型推导(如返回的 ref 值自动推断类型)。

• Utils

命名更灵活(如 formatDatedeepClone),类型支持取决于具体实现,不强制依赖 Vue 的类型系统。


总结对比表

特性ComposablesUtils
状态管理有状态(响应式数据)无状态(纯函数)
框架依赖依赖 Vue3 的组合式 API框架无关
典型场景组件逻辑复用(如 API 请求、事件)通用数据处理(如格式化、计算)
代码示例useMouse() 跟踪鼠标位置formatDate() 格式化日期
命名规范use 开头无强制规范

相关文章:

  • wordpress自学笔记 第四节 商城菜单的添加和修改美化
  • 力扣451:根据字符频率排序(桶排序)
  • FPGA前瞻篇-计数器设计与实现实例
  • 代码随想录训练营第二十二天| 101.对称二叉树 100.相同的树
  • Linux 内核参数
  • 判断数组对象中是否某个字段的值有重复
  • 生产环境怎么移除console
  • 数字IC后端培训教程之数字后端项目典型案例分析
  • js 字符串中的特殊字符全部替换成定义对象里面key对应的value值(进阶篇)
  • Python | 赤道频散关系图
  • 【Redis】SDS结构
  • 图形化编程平台的破局之道:从工具同质化到生态差异化
  • 从MCU到SoC的开发思维转变
  • 2024年北理工Python123第六章测验题整理
  • React 播客专栏 Vol.9|React + TypeScript 项目该怎么起步?从 CRA 到配置全流程
  • 2025年Energy SCI1区TOP,改进雪消融优化算法ISAO+电池健康状态估计,深度解析+性能实测
  • UE RPG游戏开发练手 第二十一课 使用C++代码实现装备武器
  • C/C++ 内存管理深度解析:从内存分布到实践应用(malloc和new,free和delete的对比与使用,定位 new )
  • 如何使用 WebBrowserPassView 查看所有浏览器密码?
  • 用户态到内核态:Linux信号传递的九重门(二)
  • 高波︱忆陈昊:在中年之前离去
  • 缺字危机:一本书背后有多少“不存在”的汉字?
  • 郑州通报涉“健康证”办理有关问题查处进展情况
  • 金价大跌!足金饰品每克一夜便宜14元,涨势是否已终结?
  • 江西省市场监管局原局长谢来发被双开:违规接受旅游活动安排
  • 言短意长|西湖大学首次“走出西湖”