【发布时间】:2020-10-30 23:19:33
【问题描述】:
所以我有一个挂载的钩子,从 indexedDB 读取数据并将该数据存储在其内部状态
我遇到的问题是 indexedDB 数据从另一个组件(添加/删除)更改,我需要对这个钩子中的这些更改做出反应。我不是 100% 熟悉钩子以及如何做到这一点,但首先想到的是将 indexedDB 中的值作为钩子依赖。
但是,从 indexedDB 中读取数据是一个异步操作,并且钩子依赖是一个.. 承诺。
所以基本上,流程如下:
- 组件 1 像这样调用钩子:
const eventItems = useEventListItems({
sortBy,
sortGroupedBy,
eventTimestamp,
events,
assets,
touchedEventIds,
unsyncedEvents, // <--- this is the one that we need
order,
});
-
useEventListItems挂钩在挂载时从索引数据库中读取数据,将其存储在其内部状态中并返回:
const { readUnsyncedEvents } = useDebriefStore();
const [unsyncedEvents, setUnsyncedEvents] = useState<number[]>([]);
useEffectAsync(async () => {
const storedUnsyncedEventIds = await readUnsyncedEvents<number[]>();
if (storedUnsyncedEventIds?.data) {
setUnsyncedEvents(storedUnsyncedEventIds.data);
}
}, [setUnsyncedEvents]);
readUnsyncedEvents 在哪里:
export const readUnsyncedEvents = <T>(type: Type): Promise<DebriefStoreEntry<T>> =>
debriefStore
.get(type)
.then((entry) => entry && { data: entry.data, timestamp: entry.timestamp });
-
indexedDB 中的 unsyncedEvents 然后从另一个组件中更改。
-
应该现在发生的是,
useEventListItems钩子应该监听 IDB 中的变化并更新其内部状态的 unsyncedEvents,将它们传递给使用该钩子的组件。我将如何实现这一目标?
我的第一个想法是在 useEventListItems 挂钩中有这样的东西:
useEffect(() => {
setUnsyncedEvents(..newValueFromIdb);
}, [ await readUnsyncedEvents()]);
但这行不通,因为这将是一个承诺。无论如何我可以有一个钩子依赖,一个异步操作返回的值?
【问题讨论】:
标签: javascript reactjs react-hooks indexeddb