使用 Redux 处理 React 应用程序中的异步操作和状态管理

问题描述 投票:0回答:1

我目前正在开发一个 React 应用程序,其中集成了用于状态管理的 redux 和用于管理异步操作的 Redux Thunk 中间件。但是,在有效构建代码以在帮助下异步处理数据获取、正确更新状态以及在整个应用程序中保持 ui 一致性方面,我面临着一些严峻的挑战。

我的应用程序的架构涉及通过 redux 管理的多个状态片。我已经设置了 Redux Thunk 来分派从 API 获取数据并执行其他异步任务的操作。这就是我面临的困难:

异步数据获取:我正在努力解决如何构建 thunk 操作来处理从 api 获取异步数据的问题。我需要一种清晰的方法来分派这些更新相关的状态切片,并确保我的用户界面准确地反映获取的数据。

状态规范化:我已经了解了在 Redux 中规范化状态以避免重复并确保高效更新的重要性。我不确定在我的应用程序上下文中实现此操作的最佳实践,其中数据结构可能在很多方面有所不同。

我尝试使用 async/await 语法构建我的 thunk 操作,并查看了 Redux 文档和各种在线资源。所以,请帮我解决它。

asynchronous data-handling
1个回答
0
投票

我希望您一定尝试以下方法。

针对请求、成功和失败的异步数据获取(使用 API)。

// Example action types
export const FETCH_DATA_REQUEST = 'FETCH_DATA_REQUEST';
export const FETCH_DATA_SUCCESS = 'FETCH_DATA_SUCCESS';
export const FETCH_DATA_FAILURE = 'FETCH_DATA_FAILURE';

// Example action creators
export const fetchDataRequest = () => ({ type: FETCH_DATA_REQUEST });
export const fetchDataSuccess = (data) => ({ type: FETCH_DATA_SUCCESS, payload: data });
export const fetchDataFailure = (error) => ({ type: FETCH_DATA_FAILURE, payload: error });

// Thunk action creator
export const fetchData = () => {
  return async (dispatch) => {
    dispatch(fetchDataRequest());
    try {
      const response = await fetch('https://api.example.com/data');
      const data = await response.json();
      dispatch(fetchDataSuccess(data));
    } catch (error) {
      dispatch(fetchDataFailure(error.message));
    }
  };
};

减少更新处理以保持用户界面一致性

const initialState = {
  data: [],
  loading: false,
  error: null,
};

const dataReducer = (state = initialState, action) => {
  switch (action.type) {
    case FETCH_DATA_REQUEST:
      return { ...state, loading: true, error: null };
    case FETCH_DATA_SUCCESS:
      return { ...state, loading: false, data: action.payload };
    case FETCH_DATA_FAILURE:
      return { ...state, loading: false, error: action.payload };
    default:
      return state;
  }
};

尝试标准化最佳实践作为其数据结构:

const initialState = {
  entities: {
    users: {},
    posts: {},
  },
  ids: {
    users: [],
    posts: [],
  },
  loading: false,
  error: null,
};

// Example action creator for normalized data
export const fetchUsers = () => {
  return async (dispatch) => {
    dispatch(fetchDataRequest());
    try {
      const response = await fetch('https://api.example.com/users');
      const users = await response.json();

      // Normalize users data
      let normalizedUsers = {};
      let userIDs = [];
      users.forEach(user => {
        normalizedUsers[user.id] = user;
        userIDs.push(user.id);
      });

      dispatch(fetchUsersSuccess(normalizedUsers, userIDs));
    } catch (error) {
      dispatch(fetchDataFailure(error.message));
    }
  };
};

更新状态,正确使用选择器并使用 Redux Saga 等其他中间件来进一步改进。

© www.soinside.com 2019 - 2024. All rights reserved.