📜  Redux Toolkit 在 ReactJS 中编写 Redux 代码的更好方法(1)

📅  最后修改于: 2023-12-03 15:19:47.779000             🧑  作者: Mango

Redux Toolkit 在 ReactJS 中编写 Redux 代码的更好方法

在传统的 Redux 代码中,我们需要定义多个 action、reducer 和 store。这样的代码比较冗长,而且需要写很多重复的代码。Redux Toolkit (RTK) 是一个帮助开发人员更快速、更高效地编写 Redux 代码的工具。

1. 安装 Redux Toolkit

可以通过以下命令来安装 Redux Toolkit:

npm install @reduxjs/toolkit
2. 简化 action 和 reducer 的创建

使用 RTK,我们可以用 createSlice 来替代手动编写 action 和 reducer,这可以让我们更快速地编写 Redux 代码。以下是如何使用 createSlice 的示例代码:

import { createSlice } from '@reduxjs/toolkit';

const initialState = {
  value: 0,
};

export const counterSlice = createSlice({
  name: 'counter',
  initialState,
  reducers: {
    increment: (state) => {
      state.value += 1;
    },
    decrement: (state) => {
      state.value -= 1;
    },
  },
});

export const { increment, decrement } = counterSlice.actions;

export default counterSlice.reducer;

代码解释:

  1. 我们首先导入了 createSlice 工具。
  2. 创建一个名为 counter 的 slice,并定义了 initialState
  3. reducers 中定义了从 state 到下一个 state 的转换函数。
  4. 最后,我们导出了两个action (incrementdecrement) 和声明的 reducer 函数。

使用了 createSlice 后,我们无需再通过 switch 语句和 case 来手动处理 action。这样的代码可以更容易地维护和扩展。

3. 异步操作

Redux Toolkit 还为我们提供了一个名为 createAsyncThunk 的工具,可以使我们更方便地处理异步操作。以下是使用 createAsyncThunk 的示例代码:

import { createAsyncThunk, createSlice } from '@reduxjs/toolkit';
import { userAPI } from '../../api/userAPI';

export const getUserById = createAsyncThunk(
  'users/getUserById',
  async (userId) => {
    const response = await userAPI.getUserById(userId);
    return response.data;
  }
);

const userSlice = createSlice({
  name: 'users',
  initialState: {
    entities: {},
    loading: false,
  },
  reducers: {},
  extraReducers: (builder) => {
    builder
      .addCase(getUserById.pending, (state) => {
        state.loading = true;
      })
      .addCase(getUserById.fulfilled, (state, action) => {
        state.entities[action.payload.id] = action.payload;
        state.loading = false;
      });
  },
});

export default userSlice.reducer;

代码解释:

  1. 我们首先导入了 createAsyncThunkcreateSlice 工具。
  2. 创建一个名为 users 的 slice,并定义了 initialState
  3. 我们创建了一个异步操作 getUserById,并定义了其参数和返回值。
  4. 我们在 extraReducers 中处理了 getUserById 的三种状态:pendingfulfilledrejected。在本例中,只在 pendingfulfilled 状态下更新了 state
  5. 最后,我们导出了声明的 reducer 函数。

使用了 createAsyncThunk 后,我们就可以更容易地处理异步操作,将异步操作状态与数据的更新分离开来。

4. 应用 Redux Toolkit

在您的 React 项目中,我们可以使用 configureStore 函数,使用 combineReducers 合并多个 reducer,使用中间件和 devToolsEnhancer 等功能。以下是如何在 React 中使用 Redux Toolkit 的示例代码:

import { configureStore } from '@reduxjs/toolkit';
import { combineReducers } from 'redux';
import counterReducer from '../features/counter/counterSlice';
import userReducer from '../features/user/userSlice';

const rootReducer = combineReducers({
  counter: counterReducer,
  user: userReducer,
});

const store = configureStore({
  reducer: rootReducer,
  middleware: (getDefaultMiddleware) => getDefaultMiddleware(),
  devTools: process.env.NODE_ENV !== 'production',
});

export default store;

代码解释:

  1. 我们首先导入了 configureStorecombineReducers 和两个声明的 reducer
  2. 使用 combineReducers 合并多个 reducer,导出了一个 rootReducer
  3. 使用 configureStore 函数创建了一个 store,并传入了 rootReducer 和 middleware 配置(此例中为默认配置)。
  4. 最后,我们导出了 store

使用了 configureStore 后,我们可以更方便地创建 Redux store,并且无需再手动使用中间件和 devToolsEnhancer

结论

使用 Redux Toolkit,我们可以更高效地编写 Redux 代码,并且无需过多担心单向数据流和数据同步等问题。读者可以在自己的 React 项目中使用 Redux Toolkit 来提高开发效率和代码可维护性。