React Redux Store Layout:如何处理“添加项目”请求的“待处理”状态?

本杰明·M

示例商店:

{
  todos: {
    byId: {
      "1": { id: "1", title: "foo" },
      "2": { id: "2", title: "bar" }
    },
    allIds: ["2", "1"]   // ordered by `title` property
  }
}

现在用户想要添加一个新的 Todo 条目:

dispatch({
  type: 'ADD_TODO_REQUEST',
  payload: { title: "baz" }
})

这会触发一些API请求:POST /todospending只要没有响应(successerror,请求的状态就是这也意味着,我还没有id新创建的 Todo 条目。

现在我已经想将它添加到商店(并显示它)。但是我当然不能将它添加到byIdand 中allIds,因为它还没有id

问题 1:我应该如何更改我的商店布局以使其成为可能?

响应到达后,有两种可能:

  1. success: 更新 store 并设置id新 Todo Entry属性。使用dispatch({type:'ADD_TODO_SUCCESS', payload: response.id}).

  2. error:从商店中删除新的 Todo Entry。使用dispatch({type:'ADD_TODO_ERROR', payload: ???})

现在这两个动作的减速器必须以某种方式在商店中找到相应的元素。但它没有标识符。

问题 2:如果没有,我如何在商店中找到该商品id


附加信息:

  • 我正在使用 redux-saga 进行反应
  • 应该可以同时ADD_TODO_REQUEST运行多个并发尽管pending商店中必须有多个Todo 条目是可能的。(例如,如果网络连接很慢,并且用户只需输入“TITLE1”,并点击“添加”按钮,然后在“标题2”和“添加”,“TITLE3”和“添加”。)虽然它不是可以禁用AddTodo请求挂起时组件。

您如何解决应用程序中的此类问题?

编辑:还有更多:

相同的功能应该可用于“更新”和“删除”Todo 条目:

  • 当用户编辑 Todo Entry 然后点击“保存”按钮时,该项目也应该处于该pending状态,直到响应到达。如果出现错误,则必须将旧版本的数据放回存储中(无需从服务器请求)。

  • 当用户单击“删除”时,该项目将立即消失。但是,如果服务器响应是错误的,则应将该项目放回列表中。

如果有错误响应,这两个操作都应该恢复以前的数据。

本杰明·M

我找到了一个简单的解决方案。但我确信还有其他可能性和更好的解决方案。

将 Todo 条目保存在 2 个单独的集合中:

{
  todos: {
    byId: {
      "1": { id: "1", title: "foo" },
      "2": { id: "2", title: "bar" }
    },
    allIds: ["2", "1"],
    pendingItems: [
      { title: "baz" },
      { title: "42" }
    ]
  }
}

现在我可以“通过引用”在商店中找到它们。

// handle 'ADD_TODO_REQUEST':
const newTodoEntry = { title: action.payload.title };
yield put({ type: 'ADD_TODO_PENDING', payload: newTodoEntry });
try {
  const response = yield api.addTodoEntry(newTodoEntry);
  yield put({ type: 'ADD_TODO_SUCCESS', payload: { id: response.id, ref: newTodoEntry } });
} catch(error) {
  yield put({ type: 'ADD_TODO_ERROR', payload: newTodoEntry });
}

减速器将如下所示:

case 'ADD_TODO_PENDING':
  return {
    ..state,
    pendingItems: // add action.payload to this array
  }

case 'ADD_TODO_SUCCESS':
  const newTodoEntry = { ...action.payload.ref, id: action.payload.id };
  return {
    ..state,
    byId: // add newTodoEntry
    allByIds: // add newTodoEntry.id
    pendingItems: // remove action.payload.ref from this array
  }

case 'ADD_TODO_ERROR':
  return {
    ..state,
    pendingItems: // remove action.payload.ref from this array
  }

有2个问题:

  1. reducer必须使用对象引用。不允许 reducer 从 的动作负载创建自己的对象ADD_TODO_PENDING

  2. Todo Entries 不能在商店内轻松排序,因为有两个不同的集合。

有两种解决方法:

  1. 使用客户端生成的uuids,这些 s 仅在项目处于pending状态内时才存在这样,客户端可以轻松地跟踪所有内容。

2.

  • a)insertAtIndex为待处理的项目添加某种属性。然后 React 组件代码可以合并这两个集合并以自定义顺序显示混合数据。

  • b) 将物品分开。例如,在服务器数据库中已经持久化的项目列表之上和之下的挂起项目列表。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何从react-router onEnter钩子连接到Redux Store?

来自分类Dev

react-redux处理多个请求

来自分类Dev

从通过React Router设置的路由访问Redux Store

来自分类Dev

使用React / Redux处理datagrid分页

来自分类Dev

以React / Redux形式处理提交

来自分类Dev

编写React / Redux时如何处理TDD

来自分类Dev

如何使Redux Store表现得可观察?

来自分类Dev

如何处理react / redux中的副作用?

来自分类Dev

React Redux不传播状态

来自分类Dev

React Redux不更新状态

来自分类Dev

如何处理嵌套React Redux组件的动作调度

来自分类Dev

React Redux处理大型嵌套树更新

来自分类Dev

从Redux迁移到React Context API +钩子时如何处理副作用

来自分类Dev

如何使用Redux-Toolkit重置Redux Store

来自分类Dev

如何使Redux Store表现得可观察?

来自分类Dev

如何处理react / redux中的副作用?

来自分类Dev

将Redux Store与状态混合

来自分类Dev

将React组件与Redux Store连接

来自分类Dev

关于 react redux 的状态

来自分类Dev

处理 Redux Store 数据中的依赖项

来自分类Dev

如何在 React 中使用 Redux Store 和 GraphQl 进行查询

来自分类Dev

组件中的 React-Redux 状态与 store 中的状态不同

来自分类Dev

组件如何从 redux store 获取数据?

来自分类Dev

处理 React Redux 中的错误

来自分类Dev

Redux Store 未连接到 React 组件

来自分类Dev

Redux/React 项目包的包

来自分类Dev

在 React Native Redux 中获取 store not found 错误

来自分类Dev

在 React-Redux 中加载 Store

来自分类Dev

Redux 无法将 store 传递给 React 组件