在 React 中处理多个 GraphQL 订阅事件

Handling multiple GraphQL subscription events in React

这让我抓狂,我似乎找不到其他人遇到同样的问题,这可能意味着我遗漏了一些基本的东西。

我正在使用 AWS Amplify 并有一个 GraphQL 端点,我在 React 项目中订阅了一些事件(更新、创建、删除)。我有一个 table 绑定到保存我的数据的列表对象。

当多个事件进入时,我的状态由于异步而变得一团糟,我的 table 最终丢失了一整块数据。我已经尝试使用 useReducer 来查看这是否有所作为,但事实并非如此。我觉得我需要一种方法来对订阅事件进行排队然后使用它们,这让我想知道这是否不是标准做法,或者我是否遗漏了一些基本的东西。

这是我的减速器。

const reducer = (state, action) => {
   switch (action.type) {
      case "ADD":
         return { ...state, productList: action.payload };
      case "UPDATE":
         //update code
      case "DELETE":
         //delete code
      default:
         return state;
   }
};

我在组件中的初始加载和设置

   const [state, despatch] = useReducer(reducer, { productList: [] });

   useEffect(() => {
      fetchData()
         .then((result) => {
            despatch({ type: "ADD", payload: result });
         })
         .catch((err) => console.log(err));

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

我的订阅

   function setupSubscriptions() {
      subscriptionOnCreateProduct = API.graphql(graphqlOperation(onCreateProduct)).subscribe({
         next: (e) => {
            const product = e.value.data.onCreateProduct;
            despatch({ type: "ADD", payload: product });
         },
      });
...

终于是我的渲染图了

return (
...
{state.productList.map((product) => (
  // Display my data
))}

我很沮丧,所以匆忙发布了这个。

我需要为初始加载和订阅事件添加新项目时设置不同的操作类型。

我的减速器现在看起来像这样...

const reducer = (state, action) => {
   switch (action.type) {
      case "INIT_LOAD":
         return { ...state, productList: action.products };
      case "ADD":
         return { ...state, productList: [...state.productList, action.product] };
      case "UPDATE":

      ...

      default:
         return state;
   }
};