当前位置: 首页 > 知识库问答 >
问题:

前端 - react reducer中如何异步更新数据?

江佐
2023-12-12
export enum actionType {    updateData = 'updateData',}export const initData = {    data: {}}const update = () => {    const age = 'xxx'    let name = 'xxxx'    // 这里模拟异步请求    setTimeout(() => {        name = '异步数据'    }, 2000)    return {        age,        name,    }}export const passengerReducer = (state, action) => {    const data = update()    switch (action.type) {        case actionType.updateData:            return {                ...state,                data,            }        default:            return state    }}
// 外部调用dispatch({     type: updateData})

之前name的更新是同步更新的没有问题现在需要走接口,等接口返回后再更新,我试过在这个文件中调用dispath但是调用报错,请问下这种异步的数据该怎么更新

共有1个答案

洪雅健
2023-12-12

这个问题是在问如何在 React Reducer 中异步更新数据。

在 Redux 中,reducer 是一个纯函数,它接收当前的 state 和 action,然后返回新的 state。对于异步操作,我们通常在 action creator 中处理它们,而不是在 reducer 中。这是因为 reducer 必须是同步的,而处理异步操作可能会导致不必要的复杂性和错误。

然而,如果你需要在 reducer 中处理异步操作,可以使用某些中间件(例如 redux-thunk 或 redux-saga),这些中间件可以处理异步操作,并在完成后派发一个 action。

在你的代码中,你试图在 reducer 中模拟一个异步操作(使用 setTimeout)。然而,这不会按预期工作,因为 reducer 必须在每次调用时都返回一个新的状态,而你的代码在等待异步操作完成时不会返回任何新的状态。

正确的做法应该是这样的:

  1. 首先,创建一个异步的 action creator,它会在数据加载完成后派发一个 action:
export const fetchData = () => {    return async dispatch => {        dispatch({ type: actionType.FETCH_DATA_REQUEST });        const data = await fetchDataFromServer(); // 模拟异步请求        dispatch({ type: actionType.FETCH_DATA_SUCCESS, payload: data });    };};
  1. 在你的 component 中,当数据加载完成时,派发这个 action:
componentDidMount() {    this.props.fetchData();}
  1. 在你的 reducer 中,处理这个 action 并更新 state:
export default function(state = initData, action) {    switch (action.type) {        case actionType.FETCH_DATA_REQUEST:            return state; // 在数据加载期间,保持当前的 state        case actionType.FETCH_DATA_SUCCESS:            return { ...state, ...action.payload }; // 用新的数据更新 state        default:            return state;    }}
 类似资料:
  • 问题内容: 我有一个带有某些表和视图的PostgreSQL 8.4数据库,这些表和视图本质上是对某些表的联接。我使用的NetBeans 7.2(如描述这里)来从这些观点和表导出并部署那些到Glassfish的3.1.2.2服务器基于REST的服务。 还有另一个过程可以异步更新用于构建视图的某些表中的内容。我可以直接查询视图和表,并查看这些更改已正确发生。但是,从基于REST的服务中提取时,这些值与

  • 我有一个PostgreSQL 8.4数据库,其中有一些表和视图,它们实际上是一些表上的联接。我使用NetBeans7.2(如本文所述)创建基于REST的服务,这些服务派生自这些视图和表,并将它们部署到Glassfish 3.1.2.2服务器上。 还有另一个进程,它异步更新用于构建视图的某些表中的内容。我可以直接查询视图和表,并看到这些更改已经正确发生。但是,当从基于REST的服务中提取时,这些值与

  • 我有一个弹窗想显示5秒后4秒后3秒后2秒后1秒后自动跳转的提示,但是这个秒数怎么更新,就是弹窗一打开就自动倒计时,不用按钮触发

  • 使用React封装的图表组件,如何实现自动更新图表数据?

  • 时间8.31 base深圳 吹爆面试官,体验很好,不过也很开心 面试官先自我介绍,开摄像头,很和蔼 做题,给了一个叉叉图标,问不用图片可以怎么实现(脑子懵了,答了svg和canvas绘制,不知道想考什么) 做题,try catch块里的输出 项目拷打,lz主要聊了webworker和大文件上传,面试官会边听边记录重点,面试官会问需求和根据重点细节探讨,20min Vue3相对Vue2的最大的改进

  • 可能你还没有注意到,Vue异步执行 DOM 更新。只要观察到数据变化,Vue 将开启一个队列,并缓冲在同一事件循环中发生的所有数据改变。如果同一个 watcher 被多次触发,只会被推入到队列中一次。这种在缓冲时去除重复数据对于避免不必要的计算和 DOM 操作上非常重要。然后,在下一个的事件循环“tick”中,Vue 刷新队列并执行实际 (已去重的) 工作。Vue 在内部尝试对异步队列使用原生的P