在 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类别,与logicAnd、logicNot互为同族工具,SKILL.md 表中三者的描述分别是:
logicAnd:ANDcondition for refs(对 ref 做 AND 运算);logicOr:ORconditions for refs(对 ref 做 OR 运算);logicNot:NOTcondition 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 发生变化时会自动重算。因此它天然可作为其他computed、watch或模板表达式的输入,可无缝嵌进现有响应式数据流。 @__NO_SIDE_EFFECTS__标注:这是给打包器/编译器看的效果标记,提示该函数调用无副作用,可在摇树(tree-shaking)与调用裁剪时被安全处理。- 废弃别名
or:早期版本通过or暴露同一函数,签名处已用@deprecated标注并建议“uselogicOrinstead”。新代码应统一书写为logicOr,以消除歧义并避免未来版本移除别名时的迁移成本。
三、基础用法:让whenever只响应一次状态翻转
文档给出的示例把logicOr与@vueuse/core的whenever组合使用:
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)返回的ComputedRef在a、b任一变为 truthy 时其值会从false翻转为true,于是回调只在条件由假变真的那一刻执行一次;此后a、b再变化(例如从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-if、v-show中可直接传整个返回值,Vue 会自动解包。 - 操作数可以是任意类型:truthy 判断遵循 JavaScript 规则(
0、''、null、undefined、NaN均为假),所以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/core的whenever、useTimeoutFn、computedAsync、useBroadcastChannel等 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),仅供参考