
前端【免费下载链接】vueuseCollection of essential Vue Composition Utilities for Vue 3项目地址https://gitcode.com/gh_mirrors/vu/vueuse点击查看免费下载VueUse 的reactiveOmit是vueuse/core源码位于 packages/shared/reactiveOmit中用于「响应式剔除对象字段」的核心工具它接收一个响应式对象与一组键名或判定函数返回一个始终与源对象保持同步、但仅包含剩余字段的新响应式对象。本文将从 API 用法、底层实现原理、与reactivePick的对照以及组件 Props 定向透传等真实场景带你彻底掌握它。一、快速上手两种调用形式reactiveOmit支持两种调用方式均返回一个新的响应式对象。1. 按键名剔除传入对象后把要剔除的字段名作为可变参数传入剩余字段会构成新对象import { reactiveOmit } from vueuse/core import { reactive } from vue const obj reactive({ x: 0, y: 0, elementX: 0, elementY: 0, }) // 剔除 x 与 elementX得到 { y: number, elementY: number } const picked reactiveOmit(obj, x, elementX)2. 按判定函数剔除当剔除规则比较复杂例如按值的类型或某个动态条件时可传入(value, key) boolean判定函数import { reactiveOmit } from vueuse/core import { reactive } from vue const obj reactive({ bar: bar, baz: should be omit, foo: foo2, qux: true, }) // 剔除 key baz 或 value true 的字段得到 { bar: string, foo: string } const picked reactiveOmit(obj, (value, key) key baz || value true)判定函数的签名如下见 packages/shared/reactiveOmit/index.tsexport type ReactiveOmitPredicateT (value: T[keyof T], key: keyof T) boolean注意判定函数与按键名剔除不能混用只要第一个可变参数是函数reactiveOmit就自动切换到 predicate 模式其余参数会被忽略。二、核心场景向子组件定向透传 Props在vue的script setup中父组件通过v-bind...一次性下发所有 props。当需要剔除其中某些字段、只把其余部分透传给子组件时reactiveOmit是最简洁的响应式方案这也是官方文档收录的标准场景script setup langts import { reactiveOmit } from vueuse/core const props defineProps{ value: string color?: string font?: string }() // 剔除 value仅透传 color 与 font const childProps reactiveOmit(props, value) /script template div !-- 只把 color 和 font 传给子组件 -- ChildComp v-bindchildProps / /div /template由于reactiveOmit是响应式的当父组件更新 props 时childProps会同步反映最新值子组件无需额外 watch 或手动同步。这个模式在 VueUse 自身代码库中也有实际应用useMouseInElement的指令实现vMouseInElement就通过reactiveOmit(reactive(useMouseInElement(el, options)), stop)把stop控制函数剔除后再交给 watch 消费见 packages/core/useMouseInElement/directive.ts。三、类型声明与返回值推导reactiveOmit是重载函数官方文档给出的完整类型声明如下export type ReactiveOmitReturn T extends object, K extends keyof T | undefined undefined, [K] extends [undefined] ? PartialT : OmitT, ExtractK, keyof T export type ReactiveOmitPredicateT ( value: T[keyof T], key: keyof T, ) boolean export declare function reactiveOmitT extends object, K extends keyof T( obj: T, ...keys: (K | K[])[] ): ReactiveOmitReturnT, K export declare function reactiveOmitT extends object( obj: T, predicate: ReactiveOmitPredicateT, ): ReactiveOmitReturnT要点解读按键名模式返回类型为OmitT, ExtractK, keyof T即从源对象类型中剔除指定键键名既支持单个K也支持键名数组K[]数组会被flat()拍平后统一过滤。predicate 模式返回类型退化为PartialT因为判定函数是动态逻辑TypeScript 无法静态推导出具体保留哪些字段。类型声明已同步生成在类型快照 test/snapshots/tsnapi/vueuse/shared/index.snapshot.d.ts 中可供查阅实际导出形态。四、源码级原理reactiveComputed toRefs toValuereactiveOmit的完整实现非常精简约 10 行核心逻辑见 packages/shared/reactiveOmit/index.tsexport function reactiveOmitT extends object, K extends keyof T( obj: T, ...keys: (K | K[])[] ): ReactiveOmitReturnT, K { const flatKeys keys.flat() as K[] const predicate flatKeys[0] as unknown as ReactiveOmitPredicateT return reactiveComputedany(() typeof predicate function ? Object.fromEntries(Object.entries(toRefs(obj)).filter(([k, v]) !predicate(toValue(v) as T[K], k as K))) : Object.fromEntries(Object.entries(toRefs(obj)).filter(e !flatKeys.includes(e[0] as K)))) }底层链路可以拆解为三步toRefs(obj)把源响应式对象的每个属性转换为独立 ref从而保留逐个属性的响应式追踪能力Object.entries(...).filter(...)在每次求值时按键名集合或 predicate 筛选出需要保留的字段reactiveComputed(() Object.fromEntries(...))把筛选结果构造成新对象并包装成响应式。reactiveComputed位于 packages/shared/reactiveComputed/index.ts本质是toReactive(computed(fn))——即一个「计算得到响应式对象」的便捷封装。因此reactiveOmit的核心原理可以概括为用computed对toRefs后的字段做依赖收集任何源字段的增删改都会触发重新求值新对象与源对象始终同步且对返回对象的写入会回写到源对象因为内部持有的是指向源属性的 ref 引用。关键特性新增字段也会同步由于求值逻辑每次都会重新Object.entries源对象源对象上新增的、未被剔除的字段也会自动出现在返回对象中——这一点由官方测试用例 packages/shared/reactiveOmit/index.test.ts 明确验证const state reactiveOmit(source, bar, baz) source.qux true // 新增字段 expect(state).toEqual({ foo: foo, qux: true }) // qux 自动出现 source.baz should be omit // 被剔除字段后续赋值 expect(state).toEqual({ foo: foo, qux: true }) // 仍被过滤不影响结果关键特性写入回传write-backstate.foo foo2的修改会同步回写到源对象source测试同样覆盖了这一行为见 index.test.ts。五、与 reactivePick 的对比与取舍reactiveOmit与reactivePick是一对方向相反的姊妹函数源码见 packages/shared/reactivePick/index.ts维度reactiveOmitreactivePick语义剔除指定字段保留其余全部保留指定字段剔除其余全部键名模式返回类型OmitT, ExtractK, keyof T{ [S in K]: UnwrapRefT[S] }新增字段行为未被剔除的新字段自动保留新增字段不会进入结果典型场景从 props 中挖掉「不想传给子组件」的字段从大对象中抽出「只关心」的几个字段选型建议当你需要「排除少数项其余全部保留」时用reactiveOmit——最典型的就是 Props 定向透传当你需要「只取少数项其余全部丢弃」时用reactivePick它更适合从 API 返回的大对象中提取精简视图。两者的内部实现都复用reactiveComputed因此具备一致的响应式行为与 write-back 语义。六、注意事项与最佳实践源对象必须是响应式对象reactive()创建reactiveOmit内部依赖toRefs的响应式追踪与依赖收集对普通非响应式对象使用将无法获得更新同步能力。不要混用键名与判定函数两种模式由「第一个参数是否为函数」自动区分混用会静默按 predicate 模式处理。predicate 模式返回类型较宽类型退化为PartialT若需要精确类型可改用按键名模式。注意性能边界每次源对象字段变化都会触发对Object.entries(toRefs(obj))的全量遍历过滤字段较多的对象在高频更新场景下需评估开销同时导出的打包体积约 391 B见 packages/export-size.json是一个相当轻量的工具。同一模块还有多个姊妹工具如reactivePick保留指定字段、reactiveComputed响应式计算对象、toRefs等它们共同构成了 VueUse 的 Reactivity 工具族统一从vueuse/shared与vueuse/core入口导出见 packages/shared/index.ts。七、测试验证一览reactiveOmit的行为由 packages/shared/reactiveOmit/index.test.ts 中的两条用例完整覆盖按键名模式验证字段剔除、新增字段同步、被剔除字段后续赋值仍被过滤、以及写入回传predicate 模式验证按value与key组合条件剔除以及当值变化如qux从true变为false时 predicate 重新求值、字段重新进入结果。这两条用例同时印证了前文提到的「响应式重算」与「动态条件」两大核心能力可作为你接入该工具时理解其边界行为的最直接参考。综上reactiveOmit是处理「响应式对象字段筛选」场景中开箱即用的轻量方案尤其适合组件 Props 透传、事件对象字段清洗等日常开发任务值得加入你的 VueUse 工具箱。赞分享前端【免费下载链接】vueuseCollection of essential Vue Composition Utilities for Vue 3项目地址https://gitcode.com/gh_mirrors/vu/vueuse点击查看免费下载相关推荐VueUse reactiveOmit 深入解析从响应式对象中响应式剔除字段的完整指南VueUse reactiveOmit 深入解析从响应式对象中响应式剔除字段的完整指南 导读 reactiveOmit 是 VueUse 中与 reactiv前端VueUse reactivePick 实战详解在 Vue 3 中按需挑选响应式对象字段与选择性透传 Propsairi 工程视角VueUse reactivePick 实战详解在 Vue 3 中按需挑选响应式对象字段与选择性透传 Propsairi 工程视角 reactivePicAI 应用人工智能大模型数字人AI Agent语音前端后端桌面应用移动开发即时通讯3D渲染VueUse reactivePick 详解从响应式对象中响应式挑选字段VueUse reactivePick 详解从响应式对象中响应式挑选字段 reactivePick 是 VueUse 中一个轻量而精巧的响应式工具函数用于从前端上一篇what-anime-cli社区贡献指南从问题报告到PR提交的完整教程下一篇FunClip 视频剪辑实操10 分钟跑通裁出第一段带字幕的视频创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考