📜  如何使用 redux 处理更多操作?(1)

📅  最后修改于: 2023-12-03 14:52:01.873000             🧑  作者: Mango

如何使用 Redux 处理更多操作?

Redux 是一个流行的 JavaScript 状态管理库,用于管理复杂的应用程序状态。它提供了一个可预测的状态容器,可使您更轻松地编写可维护的应用程序。在本文中,我们将介绍如何使用 Redux 处理更多操作,并提供一些示例代码片段。

Redux 基础知识

在开始学习如何处理更多操作之前,让我们快速回顾一下 Redux 的基础知识。

Redux 的核心概念是“store(存储)”,它是一个包含整个应用程序状态的对象。应用程序状态只能通过“actions(操作)”来更改。一个操作是一个描述发生了什么事情的对象,可能包含一些数据。当操作被分派到 Redux 时,它将引发“reducers(处理器)”函数的调用,它是一个纯函数,负责根据操作和当前状态计算新状态。

Redux 通过“dispatch(分派)”函数将操作发送到存储中。在我们的应用程序中,我们使用该函数来触发操作,并且我们会编写一个或多个处理器函数来处理这些操作。

处理更多操作的方法

除了使用基本操作之外,我们还可以使用 Redux 提供的一些附加功能来处理更多操作。下面是一些示例:

使用异步操作

在现代 web 应用程序中,我们经常需要处理异步数据。Redux 提供了一个名为“Thunk”的中间件,可以让我们的操作返回一个函数而不是一个对象。这个返回的函数将接收一个 “dispatch(分派)”函数和一个 “getState(获取状态)”函数作为参数,并可以包含异步操作。

下面是一个示例代码片段,它演示如何使用 Thunk 中间件来处理异步操作:

import { createStore, applyMiddleware } from 'redux';
import thunk from 'redux-thunk';

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

const FETCH_DATA_REQUEST = 'FETCH_DATA_REQUEST';
const FETCH_DATA_SUCCESS = 'FETCH_DATA_SUCCESS';
const FETCH_DATA_FAILURE = 'FETCH_DATA_FAILURE';

const fetchDataRequest = () => ({
  type: FETCH_DATA_REQUEST,
});

const fetchDataSuccess = (data) => ({
  type: FETCH_DATA_SUCCESS,
  payload: data,
});

const fetchDataFailure = (error) => ({
  type: FETCH_DATA_FAILURE,
  payload: error,
});

const reducer = (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 fetchDummyData = () => (dispatch) => {
  dispatch(fetchDataRequest());
  fetch('https://jsonplaceholder.typicode.com/todos/1')
    .then((response) => response.json())
    .then((data) => {
      dispatch(fetchDataSuccess(data));
    })
    .catch((error) => {
      dispatch(fetchDataFailure(error));
    });
};

const store = createStore(reducer, applyMiddleware(thunk));

store.dispatch(fetchDummyData());

在这个示例中,我们定义了一个“fetchDummyData(获取虚拟数据)”操作,它使用 Thunk 中间件返回一个函数。这个函数将调用“fetch(获取)”函数来从网络上获取虚拟数据。如果数据成功获取,我们将调用“fetchDataSuccess(获取数据成功)”操作来分派一个成功的操作,并将数据作为负载传递。如果发生错误,我们将调用“fetchDataFailure(获取数据失败)”操作来分派一个失败的操作并传递错误信息。

使用“combinedReducers(组合处理器)”

Redux 的“combineReducers(组合处理器)”函数可用于将多个处理器函数组合成一个根处理器函数。这是一种有用的方法,因为它允许我们将应用程序状态分为多个区域,并编写专用于每个区域的处理器函数。

下面是一个示例代码片段,它演示如何使用“combineReducers(组合处理器)”函数组合多个处理器函数:

import { createStore, combineReducers } from 'redux';

const initialCounterState = {
  value: 0,
};

const initialListState = {
  items: [],
};

const INCREMENT_COUNTER = 'INCREMENT_COUNTER';
const DECREMENT_COUNTER = 'DECREMENT_COUNTER';
const ADD_TO_LIST = 'ADD_TO_LIST';
const REMOVE_FROM_LIST = 'REMOVE_FROM_LIST';

const incrementCounter = () => ({
  type: INCREMENT_COUNTER,
});

const decrementCounter = () => ({
  type: DECREMENT_COUNTER,
});

const addToList = (item) => ({
  type: ADD_TO_LIST,
  payload: item,
});

const removeFromList = (item) => ({
  type: REMOVE_FROM_LIST,
  payload: item,
});

const counterReducer = (state = initialCounterState, action) => {
  switch (action.type) {
    case INCREMENT_COUNTER:
      return {
        ...state,
        value: state.value + 1,
      };
    case DECREMENT_COUNTER:
      return {
        ...state,
        value: state.value - 1,
      };
    default:
      return state;
  }
};

const listReducer = (state = initialListState, action) => {
  switch (action.type) {
    case ADD_TO_LIST:
      return {
        ...state,
        items: [...state.items, action.payload],
      };
    case REMOVE_FROM_LIST:
      return {
        ...state,
        items: state.items.filter((item) => item !== action.payload),
      };
    default:
      return state;
  }
};

const rootReducer = combineReducers({
  counter: counterReducer,
  list: listReducer,
});

const store = createStore(rootReducer);

store.dispatch(incrementCounter());
store.dispatch(addToList('Item 1'));

在这个示例中,我们定义了两个处理器函数(“counterReducer(计数器处理器)”和“listReducer(列表处理器)”)。我们可以将它们组合到一个单独的根处理器函数中,并将其传递给“createStore(创建存储)”函数来创建存储。我们还定义了四个操作函数来更新状态。

使用“connect(连接)”函数和 HOC(高阶组件)

我们可以使用 Redux 的“connect(连接)”函数和高阶组件(HOC)来将我们的 React 组件连接到 Redux 存储中。这样,我们的组件就可以通过获取状态和分派操作,直接与应用程序状态进行交互。

下面是一个示例代码片段,它演示如何使用“connect(连接)”函数和 HOC(高阶组件)将组件连接到 Redux 存储中:

import React from 'react';
import { connect } from 'react-redux';

const Counter = ({ count, increment, decrement }) => (
  <div>
    <h2>Counter</h2>
    <p>Count: {count}</p>
    <button onClick={increment}>Increment</button>
    <button onClick={decrement}>Decrement</button>
  </div>
);

const mapStateToProps = (state) => ({
  count: state.counter.value,
});

const mapDispatchToProps = {
  increment: () => ({ type: 'INCREMENT_COUNTER' }),
  decrement: () => ({ type: 'DECREMENT_COUNTER' }),
};

const ConnectedCounter = connect(mapStateToProps, mapDispatchToProps)(Counter);

export default ConnectedCounter;

在这个示例中,我们定义了一个“Counter(计数器)”组件,并在其外部定义了两个映射函数(“mapStateToProps(映射到状态)”和“mapDispatchToProps(映射到操作)”)来连接它到 Redux 存储中。我们最终使用“connect(连接)”函数和 HOC(高阶组件)来将组件连接到存储中,并导出连接后的组件。

结论

Redux 是管理 JavaScript 应用程序状态的强大库。无论您的应用程序规模如何,您都可以使用 Redux 处理更多操作。在本文中,我们介绍了如何使用 Redux 处理异步操作、组合处理器、以及连接组件和存储。通过这些方法,您将能够更好地组织和管理您的应用程序状态。