ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

VueUse @vueuse/math 之 logicNot:为 ref 提供响应式 NOT 逻辑判断的完整实战指南

VueUse @vueuse/math 之 logicNot:为 ref 提供响应式 NOT 逻辑判断的完整实战指南 前端【免费下载链接】vueuseCollection of essential Vue Composition Utilities for Vue 3项目地址https://gitcode.com/gh_mirrors/vu/vueuse点击查看免费下载logicNot是 VueUse 数学扩展包vueuse/math提供的逻辑组合函数之一其作用是对传入的 ref、普通值或 getter 函数取逻辑非!并返回一个类型为ComputedRefboolean的响应式计算结果。本文将以 logicNot 官方文档 为核心骨架结合 源码实现 与 单元测试 深入讲解其工作原理、与whenever的经典组合用法以及它与logicAnd、logicOr构成的完整逻辑函数家族帮助你在 Vue 3 组合式 API 场景中精准驾驭“反向条件”的响应式编程。一、功能定位为 ref 而生的 NOT 条件logicNot解决的是一类非常常见但容易写脏的 Vue 响应式需求当某个 ref 的值由真变假或由假变真时触发一段逻辑。直接写!a.value只能拿到一次性快照无法保持响应式而logicNot(a)返回的ComputedRef会随着a的变化持续重算天然融入 Vue 的响应式依赖追踪体系。在 VueUse 的官方分类中logicNot属于Math类别文档 frontmatter 中声明了别名alias: not即历史上它也曾以not命名导出详见下文“别名与迁移”一节。import { whenever } from vueuse/core import { logicNot } from vueuse/math const a ref(true) whenever(logicNot(a), () { console.log(a is now falsy!) })这是 官方文档 中的标准用法whenever监听logicNot(a)这个 computed 值一旦它变为 truthy即a变为 falsy回调便会被触发。整个链路完全由响应式系统驱动无需手动订阅与清理。二、安装与引入logicNot与logicAnd、logicOr、useSum、useAverage等一起打包在vueuse/math子包中同时依赖vueuse/core示例中的whenever来自 core。按照 packages/math/README.md 的说明安装npm i vueuse/math vueuse/core引入方式与官方文档保持一致import { logicNot } from vueuse/math所有 math 工具统一从 packages/math/index.ts 的入口聚合导出其中包含export * from ./logicNot一行因此从包根路径导入即可无需深链到具体目录。三、源码剖析computed toValue 的极简实现logicNot的完整实现只有短短几行但它精准体现了 VueUse 工具函数的通用设计范式。以下为 packages/math/logicNot/index.ts 的完整源码import type { ComputedRef, MaybeRefOrGetter } from vue import { computed, toValue } from vue export function logicNot(v: MaybeRefOrGetterany): ComputedRefboolean { return computed(() !toValue(v)) }1. 入参类型MaybeRefOrGetterany函数唯一参数的类型是MaybeRefOrGetterany这是 Vue 3.3 引入的宽松入参类型它涵盖三类输入输入形态示例处理方式普通值logicNot(true)toValue直接返回原值ReflogicNot(ref(true))toValue自动解包读取.valueGetter 函数logicNot(() true)toValue调用函数取返回值正因为接受“值 / ref / getter”三种形态logicNot既可以用在静态场景对普通布尔值取反也可以用在动态场景包裹响应式 ref而调用方无需关心底层形态差异。2. 核心机制computed 惰性重算返回值是computed(() !toValue(v))。computed保证了两个关键性质惰性求值只有被读取时例如被模板、watch、whenever或toValue访问才会真正计算依赖追踪当v是 ref 或 getter 内部引用了响应式状态时toValue的读取行为会被 Vue 收集为依赖v变化时该 computed 自动失效并重算。从源码结构看这正是logicNot与!a.value这类手写表达式最本质的区别前者是响应式数据流中的一等公民后者是一次性快照。3. 语义细节JS 真值truthy/falsy而非严格布尔!toValue(v)使用的是 JavaScript 的通用真值语义因此它不仅处理true/false还覆盖了所有 falsy 值。这一点被 单元测试 明确验证// falsy 输入 - 返回 true expect(toValue(logicNot(shallowRef(false)))).toBe(true) expect(toValue(logicNot(shallowRef()))).toBe(true) expect(toValue(logicNot(shallowRef(0)))).toBe(true) // truthy 输入 - 返回 false expect(toValue(logicNot(shallowRef(true)))).toBe(false) expect(toValue(logicNot(shallowRef(foo)))).toBe(false) expect(toValue(logicNot(shallowRef(1)))).toBe(false)测试覆盖了 ref、普通值、getter 三种输入形态例如logicNot(() 0)返回true、logicNot(foo)返回false。这意味着logicNot可用于判断“空字符串、数字 0、null、undefined、NaN等 falsy 状态”而不仅仅局限于布尔标志位。四、实战用法与 whenever 的组合模式logicNot最经典的搭档是 VueUse 的whenever用于在某个 ref 变为 falsy 时执行副作用。官方示例import { whenever } from vueuse/core import { logicNot } from vueuse/math const a ref(true) whenever(logicNot(a), () { console.log(a is now falsy!) })这段代码等价于手写watch(() !a.value, cb)但语义更直白、可读性更高而且logicNot的返回值本身就是ComputedRefboolean可以直接传给watch、watchEffect、whenever等任何接受响应式数据源的 API。典型场景一表单校验的“反向提示”import { logicNot } from vueuse/math import { whenever } from vueuse/core const email ref() const isValid computed(() /\S\S\.\S/.test(email.value)) // 邮箱从合法变为不合法时立即提示 whenever(logicNot(isValid), () { showError.value true })注意这里logicNot的入参是另一个ComputedRef再次印证了MaybeRefOrGetter的兼容性——computed 同样属于 ref 的一种。典型场景二条件渲染与样式切换const loading ref(true) // 模板中直接使用响应式驱动 UI // v-iflogicNot(loading) 等价于 v-if!loading不过需要说明模板里直接用!loading即可logicNot的价值更多体现在需要把“取反后的条件”作为值传递给其他组合式函数、watch 数据源或复用于多处时避免重复编写!xxx.value表达式也让逻辑命名更具可读性。五、逻辑函数家族logicNot / logicAnd / logicOrlogicNot并非孤立存在它与logicAnd、logicOr共同构成 VueUse 的响应式布尔逻辑家族三者实现高度同构。对照 logicAnd 源码 与 logicOr 源码// logicAnd全部为 truthy 才返回 true export function logicAnd(...args: MaybeRefOrGetterany[]): ComputedRefboolean { return computed(() args.every(i toValue(i))) } // logicOr任一为 truthy 即返回 true export function logicOr(...args: MaybeRefOrGetterany[]): ComputedRefboolean { return computed(() args.some(i toValue(i))) }函数运算入参形态返回文档别名logicNot(v)!toValue(v)单个MaybeRefOrGetterComputedRefbooleannotlogicAnd(...args)全部 truthy可变参数MaybeRefOrGetter[]ComputedRefbooleanandlogicOr(...args)任一 truthy可变参数MaybeRefOrGetter[]ComputedRefbooleanor三者均以__NO_SIDE_EFFECTS__注解标记为无副作用纯函数便于摇树优化与 SSR 分析且都通过computed保持响应式。从 logicAnd 文档 和 logicOr 文档 的 frontmatter 可以看到官方将三者用related字段互相关联建议在需要组合布尔条件时直接混用import { logicAnd, logicOr, logicNot } from vueuse/math import { whenever } from vueuse/core const isAdmin ref(false) const isLoggedIn ref(true) const isBanned ref(false) // 登录且未被封禁 且是管理员 或 非游客 whenever( logicAnd(isLoggedIn, logicNot(isBanned), logicOr(isAdmin, logicNot(ref(guest)))), () { /* 放行逻辑 */ }, )logicAnd、logicOr接受可变参数列表可直接把多个 ref 一次性传入而logicNot负责对其中任一条件单独取反三者组合可以构建任意复杂的响应式布尔表达式且全程保持声明式、可读、无手动订阅。六、别名与迁移not → logicNot在 packages/math/logicNot/index.ts 的末尾保留了历史别名导出/** deprecated use logicNot instead */ export const not logicNot即早期版本中该函数以not命名导出现已被logicNot取代not仅作为向后兼容的弃用别名保留。logicAnd、logicOr也存在对应的弃用别名and、or。因此新代码请统一使用logicNot若在旧代码中见到import { not } from vueuse/math其行为与logicNot完全一致但应尽快迁移文档 frontmatter 中的alias: not正是为文档站点链接与历史引用提供的别名登记。七、注意事项与边界返回类型恒为ComputedRefboolean即使入参是普通值如logicNot(0)返回值也是 computed需要用.value、模板解包或toValue()读取不可直接当布尔量比较。真值语义而非严格类型logicNot遵循 JavaScript 真值规则、0、null、undefined、NaN都会被取反为true。若需要严格的布尔比较应在入参侧先做归一化如computed(() a.value true)。getter 形态的响应式来源当传入() someRef.value 0这类 getter 时toValue执行函数期间读取的响应式状态会成为 computed 的依赖同样具备响应式更新能力但 getter 本身不应包含副作用否则每次重算都会重复执行。无清理负担logicNot本身不注册任何监听器或副作用其响应式更新完全由 Vue 的computed机制托管组件卸载时自动回收无需手动 dispose。结语logicNot是 VueUse 数学扩展包中最“小而美”的工具之一三行核心代码借助MaybeRefOrGetter、toValue与computed三大 Vue 原语把“对响应式值取反”这一高频需求封装成可组合、可复用、可测试的纯函数。配合whenever做反向条件触发、与logicAnd/logicOr组合构建复杂布尔逻辑它能让你的 Vue 3 代码在条件表达层面同样保持声明式与可读性。若想进一步验证其行为细节可直接阅读仓库内的 源码、测试用例 以及 logicAnd、logicOr 的配套文档。赞分享前端【免费下载链接】vueuseCollection of essential Vue Composition Utilities for Vue 3项目地址https://gitcode.com/gh_mirrors/vu/vueuse点击查看免费下载相关推荐深入 VueUse logicNot为 ref 状态构建响应式 NOT 条件实现组件状态的下降沿触发深入 VueUse logicNot为 ref 状态构建响应式 NOT 条件实现组件状态的下降沿触发 本文是 airi 仓库内置 .agents/skillAI 应用人工智能大模型数字人AI Agent语音前端后端桌面应用移动开发即时通讯3D渲染VueUse vueuse/math useMin响应式 Math.min 组合式函数完全指南VueUse vueuse/math useMin响应式 Math.min 组合式函数完全指南 useMin 是 VueUse vueuse/math 扩前端airi 项目中的 refDebounced 实战用 VueUse 为响应式 Ref 做防抖的完整指南airi 项目中的 refDebounced 实战用 VueUse 为响应式 Ref 做防抖的完整指南 refDebounced 是 VueUse 响应式RAI 应用人工智能大模型数字人AI Agent语音前端后端桌面应用移动开发即时通讯3D渲染上一篇GitHub_Trending/cr/create-t3-turbo无服务器数据库DynamoDB与Firebase对比下一篇零知识证明商业变现终极指南ZKP技术在10大行业的赚钱机会创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表