news 2026/9/10 21:09:44

在 airi 前端工程中用好 VueUse logicOr:用响应式 OR 条件组合 ref 与派生逻辑

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
在 airi 前端工程中用好 VueUse logicOr:用响应式 OR 条件组合 ref 与派生逻辑

在 airi 前端工程中用好 VueUse logicOr:用响应式 OR 条件组合 ref 与派生逻辑

【免费下载链接】airi💖🧸 Self hosted, you-owned Grok Companion, a container of souls of waifu, cyber livings to bring them into our worlds, wishing to achieve Neuro-sama's altitude. Capable of realtime voice chat, Minecraft, Factorio playing. Web / macOS / Windows supported.项目地址: https://gitcode.com/GitHub_Trending/ai/airi

logicOr是 VueUse@vueuse/math提供的一组“针对 ref 的响应式布尔运算”工具之一,它把若干 ref、普通值或 getter 折叠成一个ComputedRef<boolean>,让OR逻辑以声明式、可复用的方式融入 Vue 的响应式系统。airi 的多个 Web / Electron 前端应用都通过 pnpm catalog 统一依赖@vueuse/core,本指南以仓库中收录的 logicOr API 参考文档 为主体,结合同类逻辑函数logicAnd/logicNot讲清其签名、运行语义与组合姿势,帮助你在条件监听、UI 门控、可用性判定等场景里替代手写重复逻辑。读完你即可准确使用logicOr,并能举一反三地把整个逻辑运算族应用到自己的 Vue 3 组件中。

一、定位:@Math类别下的响应式布尔运算

在 VueUse 官方分类中,logicOr属于@Math类别,与logicAndlogicNot互为同族工具,SKILL.md 表中三者的描述分别是:

  • logicAndANDcondition for refs(对 ref 做 AND 运算);
  • logicOrORconditions for refs(对 ref 做 OR 运算);
  • logicNotNOTcondition for ref(对单个 ref 取反)。

在 SKILL.md 的函数总表中,它们的Invocation标注均为EXTERNAL,含义是:仅当项目已经安装所需的扩展依赖(此处即@vueuse/math)时才可自动选用;未安装时应先权衡,确实需要再安装,不能擅自引入外部依赖。这与@vueuse/core内的函数(多为AUTO,可自动使用)形成区分,是实现时的重要纪律。

该 skill 目录下的各份 reference 文档由上游 VueUse 仓库同步而来(见 SYNC.md 中的源路径与 Git SHA 记录),因此本文中的签名、别名与用法均可视为对官方 API 的一次精确本地化摘录。

二、函数签名与类型语义

logicOr的完整类型声明如下(摘自 logicOr.md):

/** * `OR` conditions for refs. * * @see https://vueuse.org/logicOr * * @__NO_SIDE_EFFECTS__ */ export declare function logicOr( ...args: MaybeRefOrGetter<any>[] ): ComputedRef<boolean> /** @deprecated use `logicOr` instead */ export declare const or: typeof logicOr

拆开看,其中有三个关键信息点:

  • 可变参数...args: MaybeRefOrGetter<any>[]logicOr接受任意数量的操作数,每个操作数既可以是ref、也可以是普通值,还可以是返回值的 getter 函数(即MaybeRefOrGetter联合类型)。这意味着不必预先把所有输入都“ref 化”,直接传原始布尔值或() => someState都是合法的。
  • 返回值固定为ComputedRef<boolean>:结果是一个惰性求值的计算属性引用,读取.value时才执行布尔判断,并且当任一依赖的 ref / getter 发生变化时会自动重算。因此它天然可作为其他computedwatch或模板表达式的输入,可无缝嵌进现有响应式数据流。
  • @__NO_SIDE_EFFECTS__标注:这是给打包器/编译器看的效果标记,提示该函数调用无副作用,可在摇树(tree-shaking)与调用裁剪时被安全处理。
  • 废弃别名or:早期版本通过or暴露同一函数,签名处已用@deprecated标注并建议“uselogicOrinstead”。新代码应统一书写为logicOr,以消除歧义并避免未来版本移除别名时的迁移成本。

三、基础用法:让whenever只响应一次状态翻转

文档给出的示例把logicOr@vueuse/corewhenever组合使用:

import { whenever } from '@vueuse/core' import { logicOr } from '@vueuse/math' const a = ref(true) const b = ref(false) whenever(logicOr(a, b), () => { console.log('either a or b is truthy!') })

whenever是“当值变为 truthy 时触发一次”的 watch 简写(其完整 API 见 whenever.md)。这里logicOr(a, b)返回的ComputedRefab任一变为 truthy 时其值会从false翻转为true,于是回调只在条件由假变真的那一刻执行一次;此后ab再变化(例如从true变回false又变回true)会再次触发翻转。

这一组合的实战价值在于:把“多个互相独立的状态源”收敛成一个“统一触发条件”,代码里既不需要手写a || b的临时表达式,也不需要在多处 watch 里重复判断。若用普通watch(() => a.value || b.value)whenever的逻辑同样成立,但logicOr让意图(这是 OR 条件判断)以函数名直接显性表达,可读性更好。

四、运行语义:聚合求值与依赖收集

从文档描述的“ORconditions for refs”出发,可以推断logicOr的实现语义与数组some一致:在计算时对全部操作数做逐一的 truthy 求值,只要有一个为真,结果即为true

基于这套语义,使用时需要注意:

  • 求值是惰性的:与原生||类似,实现上可按顺序短路,一旦遇到 truthy 操作数即可确定结果;对内部每个操作数都会自动执行toValue()解包,因此传 ref 也好、传 getter 也好,写起来形态统一。
  • 结果是响应式的引用而非普通布尔值:用console.log(logicOr(a, b))打印到的是 ref 对象,必须访问.value;而在模板v-ifv-show中可直接传整个返回值,Vue 会自动解包。
  • 操作数可以是任意类型:truthy 判断遵循 JavaScript 规则(0''nullundefinedNaN均为假),所以logicOr不只用于布尔 ref,也能用来表达“几个可空值中至少有一个已就绪”这类判定。

五、进阶组合:把布尔运算“管道化”表达复杂状态

由于三个函数都返回ComputedRef<boolean>,它们的输出可以直接作为彼此的输入,从而像搭积木一样组合出复杂门控逻辑。例如:只有当“网络在线”且(“已授权”或“处于调试模式”)时才放行某个动作:

import { computed } from 'vue' import { useOnline } from '@vueuse/core' import { logicAnd, logicNot, logicOr } from '@vueuse/math' const online = useOnline() const authorized = ref(false) const debugMode = ref(false) // 手工消费:直接塞给 computed 或模板 const canProceed = computed(() => logicAnd(online, logicOr(authorized, debugMode)).value) // 或者不建临时 computed,直接把组合结果交给 watch/whenever whenever(logicNot(logicOr(authorized, debugMode)), () => { // 两个入口都关闭时进入兜底分支 })

在模板中的典型形态则更为简洁——v-if="logicOr(isLoading, isRetrying)"直接表达“加载中或重试中”的渲染门控,无需在<script setup>里再定义一个computed。这正是该函数族提倡的“用组合式函数表达派生状态,减少自制散落逻辑”的思路,与整个 vueuse-functions skill 强调的“优先 VueUse composables 而非手写样板代码”一脉相承。

六、在 airi 前端工程中的应用土壤

airi 是一个覆盖 Web / macOS / Windows 与 Electron 桌面前端的多应用 monorepo,其中 Vue 技术栈应用普遍以 pnpm catalog 依赖 VueUse。在多个应用的 package.json、stage-pocket、stage-tamagotchi、ui-server-auth 与 component-calling 中均可看到"@vueuse/core": "catalog:"的统一版本声明,仓库内各类页面与组合式文件也大量使用@vueuse/corewheneveruseTimeoutFncomputedAsyncuseBroadcastChannel等 API。

在这些工程里,logicOr的典型落点并不难想象(以下为面向此类状态的通用设计建议,而非对仓库既有代码的陈述):

  • 能力可用性判定:多个开关/权限状态(如麦克风、摄像头、授权标记、连接状态)任一可用即渲染对应入口按钮;
  • UI 面板门控v-if中把“面板打开或正在拖拽中”这类多条件 OR 表达收敛为单一可读谓词;
  • 降级分支触发:与logicNot搭配,在“所有输入源都不可用”时统一切到兜底提示。

需要留意的是logicOr位于@vueuse/math,airi 各应用当前依赖声明中可见的是@vueuse/core;按 skill 的EXTERNAL约定,真正落码前应先确认是否已安装@vueuse/math,否则应优先用手写computed(() => a.value || b.value)替代,避免为一个布尔聚合引入整包依赖。这也是仓库内 SKILL.md 关于Invocation规则的显式要求。

七、相关文档与对照阅读

围绕logicOr可对照阅读仓库内同族、相关的 API 参考,构成完整的逻辑运算知识闭环:

  • logicAnd.md:AND条件,仅当全部操作数为真时结果为真,与logicOr的“任一为真”恰好互补;同样提供废弃别名and
  • logicNot.md:NOT取反,接受单个MaybeRefOrGetter;配合上述两者可表达任意组合逻辑。
  • whenever.md:文档示例中的核心搭档,负责在“条件翻转为真”时触发副作用,是消费logicOr返回值最常见的方式。

三者签名同构(MaybeRefOrGetter入参 +ComputedRef<boolean>出参),可以自由嵌套;使用时牢记“结果要读.value、别名or已废弃、@vueuse/math为 EXTERNAL 依赖”三条要点,即可在 airi 或任何 Vue 3 / Nuxt 3 工程里安全、优雅地落地响应式布尔组合逻辑。

【免费下载链接】airi💖🧸 Self hosted, you-owned Grok Companion, a container of souls of waifu, cyber livings to bring them into our worlds, wishing to achieve Neuro-sama's altitude. Capable of realtime voice chat, Minecraft, Factorio playing. Web / macOS / Windows supported.项目地址: https://gitcode.com/GitHub_Trending/ai/airi

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/10 21:07:16

昇腾CANN/GE算子属性获取API

aclmdlGetOpAttr 【免费下载链接】ge GE&#xff08;Graph Engine&#xff09;是面向昇腾的图编译器和执行器&#xff0c;提供了计算图优化、多流并行、内存复用和模型下沉等技术手段&#xff0c;加速模型执行效率&#xff0c;减少模型内存占用。 GE 提供对 PyTorch、TensorFlo…

作者头像 李华
网站建设 2026/9/10 21:04:46

金刚石激光烧蚀多物理场仿真与COMSOL优化实践

1. 金刚石激光烧蚀的物理背景与工程挑战 金刚石作为自然界已知最硬的材料&#xff0c;在精密加工领域一直存在加工效率低、工具损耗大的痛点。传统机械加工方法在应对金刚石超硬特性时往往力不从心&#xff0c;而激光烧蚀技术通过将高能量激光聚焦于微小区域&#xff0c;能在极…

作者头像 李华
网站建设 2026/9/10 21:03:51

怀化短视频公司盘点:AI短视频服务商推荐

来源&#xff1a;唐sirAI&#xff08;www.tangsir.cc&#xff09; | 电话&#xff1a;18874530691━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━随着AI技术的飞速发展&#xff0c;怀化短视频公司已经成为怀化本地企业数字化营销的重要趋势…

作者头像 李华
网站建设 2026/9/10 21:02:35

JMeter性能测试实战:从入门到企业级应用

1. JMeter实战指南&#xff1a;从零开始掌握性能测试利器第一次接触JMeter是在2015年一个电商项目的压力测试中&#xff0c;当时团队需要模拟双11级别的并发请求。面对这个开源工具&#xff0c;我和大多数初学者一样感到无从下手——界面复杂、概念陌生、文档晦涩。经过8年的实…

作者头像 李华