Tailwind CSSTailwind CSS
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain
  • Redux Toolkit使用

Redux Toolkit使用

Redux Toolkit 是官方推荐的 Redux 工具集,旨在简化 Redux 的使用和配置。Redux 本身是一个强大的状态管理库,但由于其配置繁琐和较高的学习曲线,很多开发者在使用时遇到困难。Redux Toolkit 通过提供一系列有用的工具和 API,解决了 Redux 的一些常见痛点,让 Redux 的使用变得更加简洁和高效。

在本章中,我们将详细介绍如何使用 Redux Toolkit 来简化 Redux 的开发过程,包括如何创建 slice、配置 store、使用异步操作以及如何进行状态管理。


1. 安装 Redux Toolkit 和 React-Redux

首先,安装 Redux Toolkit 和 React-Redux,这是 React 应用与 Redux 状态管理库进行交互的官方库。

npm install @reduxjs/toolkit react-redux

2. 创建 Slice

在 Redux Toolkit 中,createSlice 是用于简化 reducer 和 action 创建的函数。slice 是 Redux store 中的一部分,它包含了 state 和 actions。在 slice 中定义 reducer 和 action,使得 Redux 的使用更加直观和简洁。

2.1 创建一个简单的 slice

首先,我们来创建一个简单的 counter slice,用于管理计数器的状态。

// counterSlice.js
import { createSlice } from '@reduxjs/toolkit';

// 创建一个 slice
const counterSlice = createSlice({
  name: 'counter',
  initialState: { value: 0 },
  reducers: {
    increment: state => {
      state.value += 1;
    },
    decrement: state => {
      state.value -= 1;
    },
    incrementByAmount: (state, action) => {
      state.value += action.payload;
    }
  }
});

// 导出 actions
export const { increment, decrement, incrementByAmount } = counterSlice.actions;

// 导出 reducer
export default counterSlice.reducer;

2.2 使用 slice reducer

在 Redux Toolkit 中,你可以将 slice.reducer 直接传递给 store 的 reducer 配置项。

// store.js
import { configureStore } from '@reduxjs/toolkit';
import counterReducer from './counterSlice';

const store = configureStore({
  reducer: {
    counter: counterReducer
  }
});

export default store;

3. 配置 Store

使用 configureStore 来配置 Redux store,它会自动设置常见的 Redux 配置,如 middleware、DevTools 等。

// store.js
import { configureStore } from '@reduxjs/toolkit';
import counterReducer from './counterSlice';

const store = configureStore({
  reducer: {
    counter: counterReducer
  }
});

export default store;

configureStore 会自动引入默认的 middleware,通常是 Redux Thunk,用于处理异步操作。

4. 提供 Store 给 React 应用

接下来,我们需要使用 Provider 将 Redux store 提供给 React 应用。通过将 store 包裹在 Provider 组件中,React 应用的所有子组件就可以访问到 Redux store 中的状态。

// index.js
import React from 'react';
import ReactDOM from 'react-dom';
import { Provider } from 'react-redux';
import store from './store';
import App from './App';

ReactDOM.render(
  <Provider store={store}>
    <App />
  </Provider>,
  document.getElementById('root')
);

5. 使用 Redux 状态

在组件中,我们可以使用 useSelector 来访问 Redux store 中的状态,使用 useDispatch 来派发 actions。

5.1 使用 useSelector 获取状态

// Counter.js
import React from 'react';
import { useSelector, useDispatch } from 'react-redux';
import { increment, decrement, incrementByAmount } from './counterSlice';

function Counter() {
  const count = useSelector(state => state.counter.value);
  const dispatch = useDispatch();

  return (
    <div>
      <h1>{count}</h1>
      <button onClick={() => dispatch(increment())}>Increment</button>
      <button onClick={() => dispatch(decrement())}>Decrement</button>
      <button onClick={() => dispatch(incrementByAmount(5))}>Increment by 5</button>
    </div>
  );
}

export default Counter;

5.2 使用 useDispatch 派发 Actions

通过 useDispatch hook 获取 dispatch 方法,进而可以派发 actions 来修改 Redux store 中的状态。

<button onClick={() => dispatch(incrementByAmount(5))}>Increment by 5</button>

6. 异步操作

Redux Toolkit 使用 Redux Thunk 中间件来支持异步操作。你可以在 createSlice 中创建异步的 thunks,或者在外部定义异步操作。

6.1 使用 createAsyncThunk

createAsyncThunk 是 Redux Toolkit 提供的一个工具,帮助你简化异步操作的流程。它返回一个 thunk 函数,该函数会自动处理异步操作的 pending、fulfilled 和 rejected 状态。

示例:

// counterSlice.js
import { createSlice, createAsyncThunk } from '@reduxjs/toolkit';

export const fetchCount = createAsyncThunk(
  'counter/fetchCount',
  async (amount) => {
    const response = await fetch(`https://api.example.com/count?amount=${amount}`);
    const data = await response.json();
    return data.count;
  }
);

const counterSlice = createSlice({
  name: 'counter',
  initialState: { value: 0, status: 'idle' },
  reducers: {
    increment: (state) => {
      state.value += 1;
    },
    decrement: (state) => {
      state.value -= 1;
    }
  },
  extraReducers: (builder) => {
    builder
      .addCase(fetchCount.pending, (state) => {
        state.status = 'loading';
      })
      .addCase(fetchCount.fulfilled, (state, action) => {
        state.status = 'succeeded';
        state.value = action.payload;
      })
      .addCase(fetchCount.rejected, (state) => {
        state.status = 'failed';
      });
  }
});

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

export default counterSlice.reducer;

6.2 使用异步 Action

你可以在组件中触发异步操作,通过 dispatch(fetchCount(amount)) 来获取数据。

// Counter.js
import React, { useEffect } from 'react';
import { useSelector, useDispatch } from 'react-redux';
import { increment, decrement, fetchCount } from './counterSlice';

function Counter() {
  const { value, status } = useSelector(state => state.counter);
  const dispatch = useDispatch();

  useEffect(() => {
    if (status === 'idle') {
      dispatch(fetchCount(10));
    }
  }, [status, dispatch]);

  return (
    <div>
      <h1>{value}</h1>
      <button onClick={() => dispatch(increment())}>Increment</button>
      <button onClick={() => dispatch(decrement())}>Decrement</button>
      <button onClick={() => dispatch(fetchCount(5))}>Fetch Count</button>
    </div>
  );
}

export default Counter;

7. 小结

  • Redux Toolkit 提供了简化 Redux 配置和开发的工具,使 Redux 更加易于使用。
  • createSlice 函数帮助你快速创建 reducers 和 actions。
  • configureStore 简化了 store 的配置,包括自动集成 middleware 和 Redux DevTools。
  • createAsyncThunk 提供了简洁的异步操作处理方法。
  • 使用 useSelector 和 useDispatch hooks 可以轻松在 React 组件中访问和更新 Redux 状态。

Redux Toolkit 是开发 Redux 应用的最佳实践之一,它极大地简化了 Redux 的使用过程,并使得开发者能够专注于应用的业务逻辑而不是配置细节。

Last Updated:: 12/11/24, 12:03 PM