Firebase onSnapshot 实时反应和 redux - 调度太多操作关注

Firebase onSnapshot realtime with react and redux - Dispatching too many actions concern

我有这个反应应用程序,它显示 table 有很多数据。

而且我需要知道 table 的一行何时从 firebase 中删除,但我需要实时执行此操作并将该数据保存在 reducer 调度操作中,以便我可以访问该数据应用程序的其余部分。

我用 useEffect

做到了
    useEffect(() => {
        const unsubscribe = onSnapshot(
            config(terminal!),
            (snapshot) => {
                // let addedData: any[] = [];
                let deletedData: any[] = [];

                snapshot.docChanges().forEach((change) => {
                    if (change.type === 'removed') {
                        deletedData = [...deletedData, change.doc.data()];
                    }
                });

                if (deletedData.length > 0) {
                    dispatch(realtimePickups(deletedData, 'removed'));
                }
            },
            (error) => {
                console.log(error);
            },
        );

        return () => unsubscribe();
    }, []);

因此,每次删除某些内容时,我都会发送一个操作,我的问题是,这是执行此操作的好方法吗?¿ 我会遇到性能问题吗?¿ 如果我发送 50 个操作,会有问题吗如果出于某种原因删除了 50 行?¿

如果这不是最好的方法,你能帮我改进我的代码吗?

这一行:

dispatch(realtimePickups(deletedData, 'removed'));

可能会导致渲染过多,具体取决于 Firebase 订阅调用的数量。这还取决于另外两个因素:

  1. 被删除的数据是否在组件中使用并挂载在DOM?
  2. 您使用的是不可变数据存储吗?

我推荐一个不同的版本:

  1. 安装use-debounce。它有一个我们需要使用的 useDebouncedCallback 挂钩。

  2. 然后:

import { useDebouncedCallback } from 'use-debounce';

let deletedData: any[] = [];

const MyComponent = () => {
  // Debounce massive updates by 1second
  const deletedDataDispatch = useDebouncedCallback((data) => {  
    dispatch(data)
    deletedData = []
  }, 1000);

  useEffect(() => {
    const unsubscribe = onSnapshot(
      config(terminal!),
      (snapshot) => {
        snapshot.docChanges().forEach((change) => {
          if (change.type === 'removed') {
            deletedData = [...deletedData, change.doc.data()];
          }
        });

        if (deletedData.length > 0) {
          deletedDataDispatch(realtimePickups(deletedData, 'removed'));
        }
      },
      (error) => {
        console.log(error);
      })

    return () => unsubscribe();
  }, [])
}