新闻详情

新闻详情

首页 / 资讯中心 / 详情

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

发布时间:2026/10/1 21:26:12来源:尧图网络
VueUse createUnrefFn 完全指南:让普通函数自动解包 Ref 参数
前端【免费下载链接】vueuseCollection of essential Vue Composition Utilities for Vue 3项目地址https://gitcode.com/gh_mirrors/vu/vueuse点击查看免费下载createUnrefFn是 VueUseVue 3 组合式工具集packages/core 中一个精巧的实用函数它把一个普通函数包装成参数会自动解包 ref的新函数返回值类型与原始函数完全一致。在需要把shallowRef、ref等响应式数据直接传入非响应式 API如fetch、JSON.stringify、第三方库回调时用它可以免去手动toValue/unref的样板代码。读完本文你将掌握createUnrefFn的用法、类型推导原理、与reactify的取舍以及它在 VueUse 源码中的真实实现。一、为什么需要 createUnrefFn在 Vue 3 中组合式函数通常接收ref作为参数并返回响应式结果。但很多原生 APIfetch、navigator.clipboard、WebSocket等和第三方函数并不认识Ref对象——直接传入会得到[object Object]之类的错误结果甚至直接抛错。传统做法是手动在每个调用点解包const url shallowRef(https://httpbin.org/post) // 每次都要手动 .value / toValue fetch(toValue(url), { ... })当函数有多个 ref 参数、且在多处调用时手动解包既啰嗦又容易遗漏。createUnrefFn把解包集中到一次包装中之后所有调用都自动完成。二、用法与完整示例原文档给出的典型场景是包装一个post请求函数见 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) // ❌ 参数是 reffetch 无法识别会抛错 unrefPost(url, data) // ✔️ 参数自动 unref 后传入正常工作要点原函数post原样保留未被修改unrefPost与post的返回值完全相同fetch返回的Promise类型也被完整保留你依然可以向包装后的函数传入原始值非 refcreateUnrefFn对原始值不做任何处理直接透传。也可以用于任何普通函数例如格式化字符串import { createUnrefFn } from vueuse/core import { shallowRef } from vue const name shallowRef(VueUse) const format (name: string) Hello, ${name}! const unrefFormat createUnrefFn(format) console.log(unrefFormat(name)) // Hello, VueUse!安装与引入createUnrefFn属于vueuse/core包。安装 VueUse 后直接命名导入即可入口见 packages/core/index.tspnpm add vueuse/core # 或 npm install vueuse/core / yarn add vueuse/coreimport { createUnrefFn } from vueuse/core从 package.json 可以看到vueuse/core要求 Vue^3.5.0作为 peer dependency并提供dist/index.js等构建产物源码中声明了__NO_SIDE_EFFECTS__配合sideEffects: false支持 tree-shaking未使用时不进入最终 bundle。三、源码实现一行核心逻辑createUnrefFn的实现非常精简完整源码在 packages/core/createUnrefFn/index.tsimport type { MaybeRef } from vue import { toValue } from vue export type UnrefFnT T extends (...args: infer A) infer R ? (...args: { [K in keyof A]: MaybeRefA[K] }) R : never /** * Make a plain function accepting ref and raw values as arguments. * Returns the same value the unconverted function returns, with proper typing. * * __NO_SIDE_EFFECTS__ */ 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 }关键点拆解toValue是核心Vue 3.3 提供的toValue对ref/getter/普通值一视同仁统一取出其当前值。这里逐个参数args.map(i toValue(i))因此任意位置的 ref 参数都会被自动解包非 ref 参数原样透传。this透传包装函数使用fn.apply(this, ...)如果原函数依赖this上下文如对象方法调用方式不变依然生效。__NO_SIDE_EFFECTS__向打包器标注该函数无副作用配合 tree-shaking 可安全摇树。实现来源文件头部注明该实现移植自 Stanley Horwood 的pompaute库。测试验证仓库中的单元测试 index.browser.test.ts 覆盖了两个核心契约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) })包装后的函数返回值与原始函数严格相等toBe同时验证了传入原始值非 ref时也能正常工作。四、类型推导UnrefFn 是如何工作的createUnrefFn的泛型签名保证了参数接受 ref、返回值不变的类型安全性export type UnrefFnT T extends (...args: infer A) infer R ? (...args: { [K in keyof A]: MaybeRefA[K] }) R : never通过条件类型提取原函数的参数元组A和返回值类型R用映射类型{ [K in keyof A]: MaybeRefA[K] }把每个参数类型包一层MaybeRefT即T | RefT于是新函数既接受RefT也接受原始T返回值类型R原样保留——例如包装fetch返回类型依然是PromiseResponse不会变成ComputedRef。因此与reactify返回ComputedRef不同createUnrefFn是一次性求值、返回值不变的包装而非响应式转换。五、createUnrefFn 与 reactify 如何选择原文档明确给出提示index.md 的 tip 区块请确认自己在用对工具。两者对比维度createUnrefFnreactify返回值原函数的返回值如Promise、普通值ComputedRefR依赖变化时自动重算求值时机每次调用时求值一次响应式追踪参数变化自动重新求值适用场景一次性调用、不关心响应式更新需要参数变化 → 结果自动更新例如把Math.pow变成响应式版本import { reactify } from vueuse/core import { shallowRef } from vue const pow reactify(Math.pow) // 返回 ComputedRef const a shallowRef(3) const b shallowRef(4) const c reactify((a: number, b: number) a b)reactify的源码packages/shared/reactify/index.ts能看出根本差异它内部把参数交给computed(() fn.apply(this, args.map(i toValue(i))))即每次求值都发生在 computed 的响应式上下文中因此 ref 参数变化时结果自动更新而createUnrefFn只是调用时解包一次不建立任何响应式依赖。选择建议只要当前值调用一次或返回值本就不是普通值如fetch返回Promise、函数是副作用型 API 调用 → 用createUnrefFn需要响应式输入、自动更新的计算结果纯函数、数学运算、字符串处理→ 用reactify。六、源码中的佐证与体积信息导出入口packages/core/index.ts 第 5 行export * from ./createUnrefFn从vueuse/core可直接导入实现与文档目录packages/core/createUnrefFn含index.ts、index.md、index.browser.test.ts体积export-size.json记录createUnrefFn压缩后约100 B见 packages/export-size.json是一个非常轻量的工具函数关联概念reactify别名createReactiveFn位于 packages/shared/reactify是文档中 recommended 的姊妹函数。七、小结createUnrefFn用极少的代码解决了真实痛点把参数是 ref 的普通函数一键变成可安全调用、类型完备的函数。它不引入响应式系统、不改变返回值、不修改原函数配合toValue与精心的泛型推导成为 VueUse 中处理ref 与原生 API 对接的最简方案。需要响应式自动求值时则切换到reactify——两者互补构成了 VueUse 中解包 ref 参数的完整工具链。赞分享前端【免费下载链接】vueuseCollection of essential Vue Composition Utilities for Vue 3项目地址https://gitcode.com/gh_mirrors/vu/vueuse点击查看免费下载相关推荐VueUse createUnrefFn 深入指南让普通函数无缝接收 Ref 与原始值参数VueUse createUnrefFn 深入指南让普通函数无缝接收 Ref 与原始值参数 本文基于本仓库 .agents 技能集中 VueUse 函数参考文AI 应用人工智能大模型数字人AI Agent语音前端后端桌面应用移动开发即时通讯3D渲染MikroORM 实体构造函数完全指南em.create() 参数推断、rel()/ref() 引用与 forceEntityConstructor 详解MikroORM 实体构造函数完全指南 em.create 参数推断、 rel / ref 引用与 forceEntityConstructor 详解 本文基后端Sway 函数全解析从 fn 声明到 ref mut 可变参数Sway 函数全解析从 fn 声明到 ref mut 可变参数 本指南以 Sway 智能合约语言Fuel 生态官方 Book 的 Functions 章节编程语言编译器区块链上一篇TanStack Table Angular 的 flexRenderComponent 函数类型安全的表格单元格组件渲染指南下一篇Haversine 距离计算实战在 Swift 中用 haversine 公式求球面两点距离Swift Algorithm Club 实现解析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

BERT+BiLSTM+CRF中文命名实体识别实战:从源码到上线 2026/10/1 22:18:15

BERT+BiLSTM+CRF中文命名实体识别实战:从源码到上线

简介:本资源面向计算机、人工智能、数据科学等专业学生及企业开发者,提供一套基于BERTBILSTMCRF的中文命名实体识别完整项目源码,适合毕业设计、课程设计、大作业及初期项目立项演示,也可作为NLP入门实战练习。压缩包共58个文件&a…

阅读更多 →
飞牛fnOS实测:国产NAS系统架构、存储与免费内网穿透拆解 2026/10/1 22:18:08

飞牛fnOS实测:国产NAS系统架构、存储与免费内网穿透拆解

折腾NAS这件事,我从最早的黑群晖一路玩到各种开源方案,硬盘换过七八块,系统重装过不知道多少次,机箱从ITX换到MATX再换回小机箱。最近圈子里讨论度明显变高的一个东西,是国产自研的NAS操作系统——飞牛私有云系统&…

阅读更多 →
Muse 云端虚拟机+智能体:自动化任务与数字助理实战指南 2026/10/1 22:18:07

Muse 云端虚拟机+智能体:自动化任务与数字助理实战指南

1. 从热搜词看 Muse 的真实定位1.1 它到底是个什么东西先把结论摆在前面:Muse 不是某一个单一功能的工具,它更像是一个把“云端虚拟机 智能体 自动化执行”三件事揉在一起的运行环境。你给它一个目标,它能在云端拉起一台机器,在…

阅读更多 →
基于SSM的中小企业HR管理系统:从环境配置到核心模块开发全解析 2026/10/1 22:17:59

基于SSM的中小企业HR管理系统:从环境配置到核心模块开发全解析

简介:基于SSM框架(SpringSpringMVCMyBatis)的中小企业人力资源管理系统,采用B/S架构,面向Java Web学习者和毕业设计学生,实现员工管理、考勤打卡、奖惩绩效、工资核算、培训岗位等业务的一体化操作。系统区…

阅读更多 →
DeepSeek Harness客户端实测:Token管理与多模型切换的本地化实践 2026/10/1 22:17:53

DeepSeek Harness客户端实测:Token管理与多模型切换的本地化实践

最近DeepSeek Harness客户端开放下载的消息在技术群里传得很开。这个客户端最大的价值在于,你不用再对着网页对话框一个个试模型,也不用为了换一个模型就去改代码,安装、配置、领token,然后就能在同一个界面里把DeepSeek和主流的第…

阅读更多 →
Winform Ribbon控件:从源码到集成的实战避坑指南 2026/10/1 22:17:52

Winform Ribbon控件:从源码到集成的实战避坑指南

简介:Winform Ribbon控件源码.zip 是一份面向C# WinForm开发者的Ribbon界面实现参考,适合希望在桌面应用中引入类似Office风格选项卡工具栏的开发者。资源共212个文件,压缩包仅487KB,其中126个cs源码文件覆盖Ribbon控件核心类、渲…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉