我想知道使用Redux的人是如何实现后端持久性的.特别是,您是将"操作"存储在数据库中,还是仅存储应用程序的最后一个已知状态?

如果您正在存储这些操作,您是否只是从服务器请求它们,然后在加载给定页面时重播所有这些操作?对于一个有很多动作的大型应用程序,这难道不会导致一些性能问题吗?

如果只存储"当前状态",那么当客户端上发生操作时,如何在任何给定时间保持该状态?

有没有人有一些代码示例,说明他们是如何将redux Reducer连接到后端存储API的?

我知道这是一个非常"取决于你的应用"类型的问题,但我只是在这里思考一些 idea ,并试图了解这种"无状态"架构如何在全堆栈意义上工作.

谢谢大家.

推荐答案

Definitely persist the state of your reducers!

如果你保留了一系列动作,你将永远无法在前端修改你的动作,而不需要在你的prod数据库中翻来覆go .

Example: persist one reducer's state to a server

我们将从三种额外的动作类型开始:

// actions: 'SAVE', 'SAVE_SUCCESS', 'SAVE_ERROR'

我使用redux-thunk来执行异步服务器调用:这意味着一个action creator函数可以执行dispatch个额外的操作并判断当前状态.

save action creator会立即发送一个操作(这样您就可以显示微调器,或者在UI中禁用"保存"按钮).一旦POST请求完成,它就会发送SAVE_SUCCESSSAVE_ERROR个动作.

var actionCreators = {
  save: () => {
    return (dispatch, getState) => {
      var currentState = getState();
      var interestingBits = extractInterestingBitsFromState(currentState);

      dispatch({type: 'SAVE'});

      window.fetch(someUrl, {
        method: 'POST',
        body: JSON.stringify(interestingBits)
      })
      .then(checkStatus) // from https://github.com/github/fetch#handling-http-error-statuses
      .then((response) => response.json())
      .then((json) => dispatch actionCreators.saveSuccess(json.someResponseValue))
      .catch((error) =>
        console.error(error)
        dispatch actionCreators.saveError(error)
      );
    }
  },

  saveSuccess: (someResponseValue) => return {type: 'SAVE_SUCCESS', someResponseValue},

  saveError: (error) => return {type: 'SAVE_ERROR', error},

  // other real actions here
};

(注:$.ajax完全可以代替window.fetch,我只是不想为一个函数加载整个jQuery!)

reducer只跟踪任何未完成的服务器请求.

function reducer(state, action) {
  switch (action.type) {
    case 'SAVE':
      return Object.assign {}, state, {savePending: true, saveSucceeded: null, saveError: null}
      break;
    case 'SAVE_SUCCESS':
      return Object.assign {}, state, {savePending: false, saveSucceeded: true, saveError: false}
      break;
    case 'SAVE_ERROR': 
      return Object.assign {}, state, {savePending: false, saveSucceeded: false, saveError: true}
      break;

    // real actions handled here
  }
}

你可能想对服务器返回的someResponseValue做些什么——可能是一个新创建实体的id等等.

我希望这能有所帮助,到目前为止对我来说效果很好!

Reactjs相关问答推荐

TypeError:SearchProduct.get()获得了意外的关键字参数查询'

使用Reaction-Hook-Form时未激发React.js onBlur事件

React中的useEffect钩子

如何在与AntD的react 中限制文件上传和显示消息?

StrictMode+SetInterval=双重渲染(即使使用useEffect清理)

列表中的每个子项都应该有一个唯一的keyprops .在react 应用程序中

FabricJS反序列化问题

标签文本删除了 MUI 概述的输入

如何渲染子路径并触发react 路由父加载器?

使用登录保护 React 中的 SPA 应用程序 - 为什么这种方法不起作用?

在按钮单击中将动态参数传递给 React Query

使用 map 循环浏览列表列表中的列表并显示它们

使用 toast 时挂钩调用无效

部署到github pages时请求路径错误

改变输入的默认值时出现问题:number react-hook-form

如何使用 React 更改 Material UI 中 ButtonGroup 的 colored颜色 ?

react 本机日历

如何在自定义 JSX 元素上声明属性?

无法有条件地更新useEffect中的setState

调用函数以获取数据并在数据到达时导航到链接