【问题标题】:How to track if dexie UseLiveQuery is finished如何跟踪 dexie UseLiveQuery 是否完成
【发布时间】:2022-08-29 20:22:19
【问题描述】:

我想在 UseLiveQuery 未完成时显示加载程序,如果 UseLiveQuery 返回一个空数组,则显示“未找到组件”。

有没有一种简单的方法可以做到这一点?

非常感谢。

【问题讨论】:

  • 请提供足够的代码,以便其他人可以更好地理解或重现该问题。

标签: reactjs nest dexie


【解决方案1】:

当您的查询器返回一个数组时,这是最简单的(见下文)。然后未定义的结果表示仍在加载,而空数组表示已完成加载但结果为零。

const friends = useLiveQuery (() => db.friends.toArray());
if (!friends) return <Spinner />; // Still loading

return <ul>{
  friends.map(friend => <li key={friend.id}>
    {friend.name}, {friend.age}
  </li>)
}</ul>;

但是,如果您的查询器从table.get() 返回结果,则 undefined 值可能意味着查询仍在加载或未找到请求的 id。为了区分这两者,你可以让查询器返回一些更容易区分两者的东西。例如,让查询器将结果作为数组中的一项返回,并为useLiveQuery() 提供第三个参数,并将一个空数组(未定义的其他内容)作为默认结果。

const [friend, loaded] = useLiveQuery (
  () => db.friends.get(1).then(friend => [friend, true]),
  [], // deps...
  []  // default result: makes 'loaded' undefined while loading
);

if (!loaded) return <Spinner />; // Still loading...
if (!friend) return <NotFound ... />; // Loaded but friend not found

return <>{friend.name}, {friend.age}</>; // Loaded and friend found.

也就是说,查询 indexedDB 时通常不需要微调器(除非查询非常复杂)。在这种情况下,最好只返回null 而不是&lt;Spinner /&gt;,这样可以最少地打扰最终用户。

【讨论】:

  • 这是一个正确的答案,帮助我解决了我的问题。谢谢!不幸的是,我无法为您投票,因为我没有足够的声誉,但我已将您的答案标记为已接受。
猜你喜欢
  • 1970-01-01
  • 2014-03-30
  • 1970-01-01
  • 2011-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-08
  • 2018-06-13
相关资源
最近更新 更多