
前端【免费下载链接】vueuseCollection of essential Vue Composition Utilities for Vue 3项目地址https://gitcode.com/gh_mirrors/vu/vueuse点击查看免费下载本指南聚焦 VueUsevueuse/math包中的useMax组合式函数。它把原生Math.max包装成响应式能力无论是单个响应式数组还是多个 ref / getter / 字面量参数都能在依赖变化时自动重算最大值返回一个ComputedRefnumber。读完本文你将掌握useMax的完整 API、两种重载形态、底层toValueArgsFlat的实现原理、边界行为以及它与useMin、useAverage等数学家族的横向对比。概览ReactiveMath.maxuseMax的定位非常纯粹——官方文档将其描述为ReactiveMath.max。它以函数形式接收若干数值来源可以是 ref、getter 或字面量然后返回一个只读的ComputedRefnumber其中的值始终等于当前所有输入中的最大值。它与原生Math.max的核心差异在于响应性原生Math.max是一次性计算而useMax基于 Vue 的computed实现当任一输入 ref 的值发生变化时最大值会自动、惰性地重新计算无需手动触发更新。该函数声明了__NO_SIDE_EFFECTS__注解意味着它不产生副作用可在任意时机安全调用也便于打包器做 tree-shaking 与死代码消除优化。安装与引入useMax隶属于独立的vueuse/math扩展包。按 packages/math/README.md 的说明安装时需要同时安装 math 包与核心包npm i vueuse/math vueuse/core该包的package.json见 packages/math/package.json显示版本为15.0.0peerDependencies要求vue: ^3.5.0构建产物由tsdown生成包内模块均标记sideEffects: false。引入方式import { useMax } from vueuse/math也可以按需从深层路径导入以进一步减小打包体积import { useMax } from vueuse/math/useMax从 packages/math/index.ts 可以看到useMax与useMin、useAverage、useSum、useClamp等一同从数学包统一导出。两种调用形态数组重载与多参数重载useMax提供了两种重载overload对应两种自然的使用场景文档与类型声明中均有明确描述// 重载 1接收一个响应式数组 export declare function useMax( array: MaybeRefOrGetterMaybeRefOrGetternumber[], ): ComputedRefnumber // 重载 2接收若干独立的数值来源 export declare function useMax( ...args: MaybeRefOrGetternumber[] ): ComputedRefnumber形态一传入数组当数据本身以数组形式存在例如一组分数、传感器读数或统计样本时直接把数组 ref 传给useMaximport { useMax } from vueuse/math import { ref } from vue const array ref([1, 2, 3, 4]) const max useMax(array) // ComputedRef4 array.value [1, 20, 3, 4] console.log(max.value) // 20响应式自动更新这里的参数类型是MaybeRefOrGetterMaybeRefOrGetternumber[]意味着它接受一个数组 refref([1, 2, 3])一个返回数组的 getter() [1, 2, 3]一个返回包含 ref 数组的 getter例如() [ref(1), 2]——数组内部的元素同样可以是 ref会被逐层解包。形态二传入多个独立参数当需要比较的数值来源彼此独立、数量较少时直接以可变参数形式传入import { useMax } from vueuse/math const a ref(1) const b ref(3) const max useMax(a, b, 2) // ComputedRef3 a.value 10 console.log(max.value) // 10响应式自动更新每个参数都接受MaybeRefOrGetternumber即可以混用refuseMax(a, b)getteruseMax(() score.value, threshold)普通字面量useMax(a, b, 2)从 packages/math/useMax/index.test.ts 的测试用例可以看到这种混用是官方明确支持的行为// 数字与 ref 混用 const value1 10 const value2 shallowRef(100) const v useMax(50, value1, value2) expect(v.value).toBe(100) value2.value 200 expect(v.value).toBe(200)底层实现computedtoValueArgsFlatuseMax的实现非常简洁完整代码位于 packages/math/useMax/index.tsexport function useMax(...args: MaybeComputedRefArgsnumber) { return computednumber(() { const array toValueArgsFlat(args) return Math.max(...array) }) }整个函数只有三行逻辑却蕴含了两个关键设计点1. 借助computed实现惰性响应函数通过computed包裹计算逻辑Vue 会自动收集计算过程中读取到的所有 ref / reactive 依赖并在它们变化时重新求值。由于Math.max(...array)展开后读取了数组中的每个数值任何元素所依赖的 ref 变化都会触发重算。这也是useMax返回类型是ComputedRefnumber而非普通 number 的根本原因。2.toValueArgsFlat统一解包与展平两种重载形态之所以能共存靠的是MaybeComputedRefArgs类型与toValueArgsFlat工具函数见 packages/math/utils.tsexport type MaybeComputedRefArgsT MaybeRefOrGetterT[] | [MaybeRefOrGetterMaybeRefOrGetterT[]] export function toValueArgsFlatT(args: MaybeComputedRefArgsT): T[] { return args .flatMap((i: any) { const v toValue(i) if (Array.isArray(v)) return v.map(i toValue(i)) return [v] }) }它做了两件事解包对每个参数调用 Vue 的toValue将 ref / getter 解析为原始数值Vue 3.3 的toValue统一了unref与 getter 求值两种场景展平若解包结果是数组则继续对该数组的每个元素再调用一次toValue将嵌套的 ref 元素也解包随后通过flatMap把元素并入一维数值数组。正因为这个展平逻辑useMax才能同时支持一个数组参数与多个独立参数两种调用方式并且允许数组内部元素仍然是 ref。展开后的数值数组最终传给原生的Math.max(...array)完成计算。类似地useMin见 packages/math/useMin/index.ts与useAverage见 packages/math/useAverage/index.ts也复用了同一套toValueArgsFlat机制只是最终调用Math.min/reduce不同这也是整个vueuse/math包保持轻量与一致性的基础。边界行为与响应性验证针对边界情况packages/math/useMax/index.test.ts 给出了明确的官方行为定义单个参数const v useMax(50) expect(v.value).toBe(50)即使只有一个参数返回值就是该参数本身。零参数const v useMax() expect(v.value).toBe(Number.NEGATIVE_INFINITY)不传任何参数时结果遵循原生Math.max()的语义——返回Number.NEGATIVE_INFINITY-Infinity。这与Math.max()不带参数的返回值完全一致方便后续对空数据集做上游判断。响应式更新const value1 shallowRef(10) const value2 shallowRef(100) const value3 shallowRef(1000) const v useMax(value1, value2, value3) expect(v.value).toBe(1000) value1.value 2000 expect(v.value).toBe(2000) value2.value 2001 expect(v.value).toBe(2001) value3.value 2002 expect(v.value).toBe(2002)每一次修改任意一个 refv.value都立即反映新的最大值验证了computed依赖收集的完整性。实战示例动态统计场景结合响应式数组形态一个典型应用是动态数据集的最大值监控。假设页面统计一组用户的响应耗时script setup langts import { useMax } from vueuse/math import { ref } from vue const latencies refnumber[]([]) // 新增一条耗时记录 function record(ms: number) { latencies.value [...latencies.value, ms] } // 响应式最大值数组变化时自动更新 const slowest useMax(latencies) /script template p最慢请求耗时{{ slowest }}ms/p button clickrecord(Math.floor(Math.random() * 500) 50) 记录耗时 /button /template由于useMax(latencies)对数组本身建立了响应式依赖每次latencies.value被替换为新数组slowest都会重新计算。配合模板渲染无需任何手动监听即可实时显示当前最大值。类似地如果数据源是异步接口返回的 ref 数组useMax也能无缝接入。与数学家族其他函数的对比useMax属于vueuse/math包中数值聚合一族的成员与它共享同一套输入约定MaybeComputedRefArgs的还有函数计算逻辑对应原生 APIuseMax取最大值Math.maxuseMin取最小值Math.minuseAverage求平均值reduce求和后除以长度useSum求和reduce累加useAbs/useCeil/useFloor/useRound/useTrunc逐值取绝对值 / 向上取整 / 向下取整 / 四舍五入 / 截断对应Math方法它们的共同特点是输入可以是 ref、getter、数组或其任意组合输出统一为ComputedRefnumber且彼此可以嵌套组合例如用useMax配合useClamp做上下限约束。从 packages/math/index.ts 的导出清单可以看到整个数学包还包含createGenericProjection、createProjection、useProjection、usePrecision等投影与精度控制工具覆盖了更丰富的数值处理场景。小结useMax是 VueUse 对Math.max的响应式封装返回ComputedRefnumber支持数组与可变参数两种重载参数可混用 ref、getter 与字面量数组内部元素也允许是 ref统一由toValueArgsFlat解包展平实现基于computed惰性求值无副作用、可 tree-shaking与useMin、useAverage等共享同一套输入约定边界行为与原生Math.max对齐零参数返回-Infinity单参数返回其本身使用前请确保安装vueuse/mathVue 版本需^3.5.0并按需从vueuse/math/useMax深层导入以优化体积。赞分享前端【免费下载链接】vueuseCollection of essential Vue Composition Utilities for Vue 3项目地址https://gitcode.com/gh_mirrors/vu/vueuse点击查看免费下载相关推荐VueUse useMax在 Vue 3 中响应式求取最大值的组合式工具详解VueUse useMax在 Vue 3 中响应式求取最大值的组合式工具详解 导读 useMax 是 VueUse 数学扩展包 vueuse/math 中提前端在 Airi 项目的 Vue 技术栈中使用 VueUse useMax 实现响应式最大值计算在 Airi 项目的 Vue 技术栈中使用 VueUse useMax 实现响应式最大值计算 导读 useMax 是 VueUse 数学工具包 vueuseAI 应用人工智能大模型数字人AI Agent语音前端后端桌面应用移动开发即时通讯3D渲染VueUse useArrayFind响应式 Array.find 的源码原理与实战指南VueUse useArrayFind响应式 Array.find 的源码原理与实战指南 在 Vue 3 组合式 API 生态中VueUse 提供了一批把原前端上一篇Coil高級緩存策略Cache-Control與條件請求下一篇Mantle设计模式面向协议的模型层架构创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考