You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Drizzle ORM中useLiveQuery未检测参数变化致查询异常

解决Drizzle ORM useLiveQuery依赖动态ID数组无响应的问题

问题分析

核心问题是useLiveQuery无法感知动态生成的ids数组变化:每次组件渲染时,habits.map(...)都会生成新的数组引用,而useLiveQuery默认仅对比引用是否相同,不会深度校验数组内容。传入固定数组[1,2]时引用稳定且内容有效,所以能正常返回结果;但动态生成的ids每次引用不同却未被识别为有效变化,导致第二个查询始终用初始空数组执行,返回0条结果。

解决方案

用useMemo缓存ids数组,确保仅当habits实际变化时才生成新的数组引用;同时将缓存后的ids作为第二个useLiveQuery的显式依赖项传入,让查询能感知参数变化并重新执行。

修改后的代码

import { useMemo } from 'react';
// 导入你的schema、db、eq、inArray等依赖

const { data: habits } = useLiveQuery(
  db.query.habits.findMany({
    where: eq(schema.habits.userId, parseInt(userId as string)),
  })
);

// 用useMemo缓存ids,仅在habits变化时更新
const ids = useMemo(() => {
  return habits ? habits.map((h) => h.habitId) : [];
}, [habits]);

// 显式传入ids作为查询依赖,触发参数变化后的重新查询
const { data: tasks } = useLiveQuery(
  db.query.tasks.findMany({
    where: inArray(schema.tasks.habitId, ids),
  }),
  [ids]
);

补充说明

  • useMemo避免了每次渲染都生成新数组,既减少不必要的性能消耗,也保证了数组引用的稳定性。
  • 显式声明依赖数组[ids]是关键,能让useLiveQuery明确感知查询条件的变化,确保查询逻辑实时响应数据更新。

内容的提问来源于stack exchange,提问作者1110

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 19:40:06