ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

VueUse createUnrefFn 使用指南:让普通函数自动解包 Ref 参数

VueUse createUnrefFn 使用指南:让普通函数自动解包 Ref 参数 前端【免费下载链接】vueuseCollection of essential Vue Composition Utilities for Vue 3项目地址https://gitcode.com/gh_mirrors/vu/vueuse点击查看免费下载导读createUnrefFn是 VueUse 提供的一个轻量工具函数用于把只接受原始值的普通函数包装成可以接收ref/shallowRef等响应式引用作为参数的新函数。在实际 Vue 3 项目中当你手写fetch、正则、数值计算等普通函数又希望调用处直接传入响应式数据而不必手动.value解包时这个工具可以消除大量样板代码。读完本文你将掌握createUnrefFn的完整用法、类型签名、底层实现原理以及它与reactify的取舍边界。createUnrefFn 是什么在 官方文档 中createUnrefFn被定义为Make a plain function accepting ref and raw values as arguments. Returns the same value the unconverted function returns, with proper typing.即将一个普通函数转换为接受 ref 和原始值混合参数的函数返回原函数同样的返回值并保持完善的 TypeScript 类型推导。它属于Utilities分类与reactify相关联related: reactify。核心定位是单向的解包传入包装函数时自动把每个 ref 参数取.value再把解包后的原始值交给原函数执行。基本用法原文档给出了一个非常典型的fetch场景示例摘自 index.mdimport { createUnrefFn } from vueuse/core import { shallowRef } from vue const url shallowRef(https://httpbin.org/post) const data shallowRef({ foo: bar }) function post(url, data) { return fetch(url, { data }) } const unrefPost createUnrefFn(post) post(url, data) /* ❌ 会抛出错误因为参数是 ref */ unrefPost(url, data) /* ✔️ 正常工作因为参数会被自动解包 */使用步骤拆解从vueuse/core导入createUnrefFn当前仓库中它由 packages/core/index.ts 统一导出。定义一个普通函数post(url, data)它只认原始值。调用createUnrefFn(post)得到包装后的unrefPost。后续可以放心地把shallowRef直接传给unrefPost函数内部会自动解包。原函数调用post(url, data)会抛错的原因在于fetch接收到的第一个参数实际是Ref对象而fetch要求传入字符串RequestInfo类型与运行时都不匹配。包装函数则替你完成了toValue解包。类型声明与UnrefFn推导原文档完整给出了类型声明同时见 packages/core/createUnrefFn/index.ts 源码export type UnrefFnT T extends (...args: infer A) infer R ? ( ...args: { [K in keyof A]: MaybeRefA[K] } ) R : never export declare function createUnrefFnT extends Function(fn: T): UnrefFnT逐层解读这段类型条件类型推导T extends (...args: infer A) infer R从原函数中分别提取参数元组类型A和返回值类型R。参数映射{ [K in keyof A]: MaybeRefA[K] }将元组中每一个参数类型A[K]映射为MaybeRefA[K]。MaybeRefT在 Vue 3 中定义为T | RefT因此包装后的每个参数既可以是原始值也可以是 ref。返回值保持返回值类型仍是R不做任何改变——这也是createUnrefFn与reactify最根本的区别后者返回ComputedRefR。约束兜底当传入的不是函数类型时条件类型走到never分支类型系统会给出错误提示。源码实现packages/core/createUnrefFn/index.ts只有寥寥几行export function createUnrefFnT extends Function(fn: T): UnrefFnT { return function (this: any, ...args: any[]) { return fn.apply(this, args.map(i toValue(i))) } as UnrefFnT }关键点使用 Vue 3 的toValue(i)逐个解包参数比unref更通用——toValue除了能解Ref还能解函数 gettertoValue对非 ref 值直接原样返回。通过fn.apply(this, ...)保留了原函数的this上下文意味着createUnrefFn同样适用于作为对象方法被调用的函数。函数声明上标注了__NO_SIDE_EFFECTS__这是 VueUse 的树摇tree-shaking优化标记告知打包器该函数调用本身无副作用、可安全摇树。文件头部注释说明该实现移植自 Stanley Horwood 的 pompaute 项目属于社区公认的实用模式。与 reactify 的区别何时该选谁原文档在::: tip中给出了明确的选型建议Make sure youre using the right tool for the job. Usingreactifymight be more pertinent in some cases where you want to evaluate the function on each changes of its arguments.两者对比如下维度createUnrefFnreactify返回结果原始返回值R一次性执行ComputedRefR响应式计算结果参数类型MaybeRefTMaybeRefT或MaybeRefOrGetterT触发时机调用时执行一次任一参数变化时自动重新求值典型场景fetch、事件回调等调用即取当前值派生计算、依赖多个 ref 的表达式对照 reactify 源码 可以看得更清楚export function reactifyT extends AnyFn, K extends boolean true(fn: T, options?: ReactifyOptionsK): ReactifyReturnT, K { const unrefFn options?.computedGetter false ? unref : toValue return function (this: any, ...args: any[]) { return computed(() fn.apply(this, args.map(i unrefFn(i)))) } as ReactifyReturnT, K }reactify的包装函数内部包了一层computed(() ...)因此返回值是ComputedRefR并且支持传函数 gettercomputedGetter默认true。选型结论如果你要包装的是fetch、消息发送、写入操作这类一次性副作用调用只希望在调用的那一刻解包参数、拿到普通返回值请选createUnrefFn。如果你需要的是参数一变、结果自动更新的派生值比如reactify文档中的add、勾股定理sqrt(add(pow(a, 2), pow(b, 2)))这类场景请选reactify。错误使用createUnrefFn去模拟响应式派生只会得到拍快照式的一次性结果不会随 ref 变化而更新。测试与行为验证仓库中的测试文件 index.browser.test.ts 用 Vitest 对核心行为做了两项验证import { describe, expect, it } from vitest import { createUnrefFn } from ./index describe(createUnrefFn, () { it(should be defined, () { expect(createUnrefFn).toBeDefined() }) it(should return a function that returns the same value, () { const value 42 const fn (value: any) value const res fn(value) const resWrapped createUnrefFn(fn)(value) expect(res).toBe(resWrapped) }) })从测试可以看出两个值得关注的行为返回值一致性createUnrefFn(fn)(value)与fn(value)结果严格相等toBe印证了返回原函数同样的值这一设计目标。测试未直接覆盖 ref 解包路径现有用例主要验证函数存在性与返回值一致性ref 解包行为由实现中的args.map(i toValue(i))保证。在使用时你可以放心地传入ref/shallowRef/computed或混合传原始值toValue会逐一分流处理。适用前提与注意事项一次性执行语义createUnrefFn包装后的函数只在被调用时解包一次参数不具备响应式追踪能力。若希望函数随参数变化自动重算应改用reactify。调用时机由于解包发生在调用瞬间调用前对 ref 赋值与否会直接影响结果这一点与普通函数传值语义一致。this绑定实现保留了this但 TypeScript 层面参数被映射为MaybeRef若原函数依赖this上的方法建议通过箭头函数或显式绑定保证上下文正确。导出位置createUnrefFn从vueuse/core导出见 packages/core/index.ts在 Vue 3 VueUse 项目中可直接引入无需额外安装其他依赖。小结createUnrefFn是一个小而美的工具它解决的是 Vue 3 开发中一个高频痛点——普通函数与响应式 ref 之间的参数桥接。结合 源码实现 与 官方文档 可以看到它的核心价值在于以极小的运行时开销一次maptoValue和完整的类型推导让你在调用fetch等普通函数时免去繁琐的手动.value。而选型上只需记住一条准则需要调用即取当前值用createUnrefFn需要响应式自动重算用reactify。赞分享前端【免费下载链接】vueuseCollection of essential Vue Composition Utilities for Vue 3项目地址https://gitcode.com/gh_mirrors/vu/vueuse点击查看免费下载相关推荐VueUse createUnrefFn 完全指南让普通函数自动解包 Ref 参数VueUse createUnrefFn 完全指南让普通函数自动解包 Ref 参数 createUnrefFn 是 VueUseVue 3 组合式工具集前端VueUse createUnrefFn 深入指南让普通函数无缝接收 Ref 与原始值参数VueUse createUnrefFn 深入指南让普通函数无缝接收 Ref 与原始值参数 本文基于本仓库 .agents 技能集中 VueUse 函数参考文AI 应用人工智能大模型数字人AI Agent语音前端后端桌面应用移动开发即时通讯3D渲染VueUse 最佳实践指南Ref 解构、副作用自动清理与响应式参数深入解析VueUse 最佳实践指南Ref 解构、副作用自动清理与响应式参数深入解析 VueUse 是 Vue 3 生态中基于 Composition API 构建的实前端上一篇电子课本下载工具使用指南从智慧教育平台批量导出官方教材PDF下一篇Beads 意外发布 v1.2.1 事故复盘与恢复指南schema 游标回滚修复 v53/v65 版本错位创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表