如何在Redux中正确处理同步持久性操作?

如何在Redux中正确处理同步持久性操作?,redux,react-redux,Redux,React Redux,使用Redux对应用程序进行反应。A有一个组合减速器,由appStateReducer和CompetingReducer组成。这两者中的每一个都负责应用程序数据的某些部分。 执行操作时,我不仅希望更改相应的状态,还希望持久保存新状态,这样,如果用户在浏览器中重新加载应用程序页面,该状态将保留。 我的想法是添加第三个减速器,以便只考虑保存和加载操作(两个子状态分别)。 保存和加载将通过localbasepackage使用IndexedDB。所有db操作(添加、获取、更新、删除)似乎都是同步的,也就

使用Redux对应用程序进行反应。A有一个组合减速器,由
appStateReducer
CompetingReducer
组成。这两者中的每一个都负责应用程序数据的某些部分。 执行操作时,我不仅希望更改相应的状态,还希望持久保存新状态,这样,如果用户在浏览器中重新加载应用程序页面,该状态将保留。 我的想法是添加第三个减速器,以便只考虑保存和加载操作(两个子状态分别)。 保存和加载将通过
localbase
package使用IndexedDB。所有db操作(添加、获取、更新、删除)似乎都是同步的,也就是说,似乎没有真正需要实现异步操作。更新:这是错误的,它是异步的,只是一些基本示例忽略了它

我不知道如何妥善处理这个问题

  • 我需要一个数据库连接对象,一个singleton,在页面加载后初始化一次,它应该被所有保存/加载操作共享,而不管存储或加载状态的哪一部分。这将导致一个单独的reducer只处理db对象。如果我这样做,db reducer将不得不访问所有其他子状态,这在Redux中通常不是这样
  • 或者,我可以在每个减速机中分别实现save和load操作,实际上这不是什么大问题。但是如何使全局db对象可以被还原器访问呢

  • 它与用typescript编写的React应用程序一样,所有组件都以类的形式实现。

    如果您使用的是中间件,则您已经可以访问所有数据,例如:

    export const requestPost = (id) => (dispatch,getState) => {
      // You can make an bank for post and check If data exist or not
      const postState = getState().bank.posts.data;
      const found = postState?.find((post) => post.id === id);
    
      if (found) {
        dispatch({ type: SUCCESS.POST, data: found });
      } else {
        dispatch({ type: REQUEST.POST });
        API.get(`/post/v2?id=${id}`)
          .then((res) => dispatch({ type: SUCCESS.POST, data: res.data[0] }))
          .catch((err) => errorHandler(err, FAILURE.POST));
      }
    };
    

    只需在DB或某处创建和还原保存数据,并在开始时读取它们。

    谢谢,但我无法在我的typescript项目中实现这一点。唯一的区别是,我调用localbase.collection('config').doc('some-key').get().then(…).catch(…),但是当我尝试在index.tsx(store.dispatch(loadContesticConfig())中分派正确键入的(或者看起来是正确的)操作创建者时,我得到了错误TS-2345。好像store dispatch方法无法正确地看到分派的操作一样(它抱怨缺少属性“type”-这是如果在每个操作中课程创建者返回值)已解决。是的,这就是解决方法。错误TS-2345是在其他地方解决的另一个问题。很高兴帮助您:)