自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

面試官:Redux-Toolkit 是什么,你知道嗎?

開發(fā) 前端
Redux Toolkit(RTK)是 Redux 官方推薦的 狀態(tài)管理庫,它簡化了 Redux 的開發(fā)流程,使 Redux 更簡單、更高效。

Redux Toolkit(RTK)是 Redux 官方推薦的 狀態(tài)管理庫,它簡化了 Redux 的開發(fā)流程,使 Redux 更簡單、更高效。

?? 為什么需要 Redux Toolkit?

  • 簡化 Redux 代碼(減少 boilerplate 代碼)
  • 自動優(yōu)化狀態(tài)更新(內(nèi)置 Immer.js,支持 可變寫法)
  • 內(nèi)置異步處理(Redux Thunk)
  • 性能優(yōu)化(自動 reducer 組合,支持 lazy loading)

?? Redux Toolkit vs 傳統(tǒng) Redux

?? 特性

傳統(tǒng) Redux

Redux Toolkit

Reducer 書寫

需要手寫 switch-case

直接用 createSlice

異步處理

需手寫 redux-thunk

內(nèi)置 createAsyncThunk

狀態(tài)更新

需手寫不可變數(shù)據(jù)更新

支持可變寫法

Immer.js

Store 配置

需手寫 combineReducers、applyMiddleware

configureStore

 自動配置

默認優(yōu)化

需手動優(yōu)化性能

自動優(yōu)化

reselect、RTK Query

?? Redux Toolkit 基本使用

1?? 安裝 Redux Toolkit

npm install @reduxjs/toolkit react-redux

2?? 創(chuàng)建 store

?? 使用 configureStore 代替 createStore:

import { configureStore } from "@reduxjs/toolkit";
import counterReducer from "./counterSlice";

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

? configureStore 自動整合 Reducer、Middleware,不需要手動配置。

3?? 創(chuàng)建 slice(Reducer + Action)

?? 傳統(tǒng) Redux 需要寫 action + reducer,而 createSlice 一步搞定!

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

const counterSlice = createSlice({
  name: "counter",
  initialState: { value: 0 },
  reducers: {
    increment: (state) => { state.value += 1; }, // ? 直接修改 state(內(nèi)部使用 `Immer.js`)
    decrement: (state) => { state.value -= 1; },
    addByAmount: (state, action) => { state.value += action.payload; },
  },
});

// 導出 Actions
export const { increment, decrement, addByAmount } = counterSlice.actions;

// 導出 Reducer
export default counterSlice.reducer;

? 優(yōu)勢:

  • **自動生成 action**(無需手寫 type)
  • 支持可變寫法(內(nèi)部使用 Immer.js)

4?? 組件中使用 Redux

?? 使用 useSelector 讀取 Redux 狀態(tài)

import { useSelector, useDispatch } from "react-redux";
import { increment, decrement, addByAmount } from "./counterSlice";

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

  return (
    <div>
      <p>Count: {count}</p>
      <button onClick={() => dispatch(increment())}>+1</button>
      <button onClick={() => dispatch(decrement())}>-1</button>
      <button onClick={() => dispatch(addByAmount(5))}>+5</button>
    </div>
  );
}

export default Counter;

? 簡潔易懂!不需要 connect,直接 useSelector 讀取狀態(tài),dispatch 觸發(fā)更新。

?? Redux Toolkit 處理異步請求

?? 使用 createAsyncThunk 處理異步請求

import { createAsyncThunk, createSlice } from "@reduxjs/toolkit";

// 創(chuàng)建異步 Action(自動處理 `pending`, `fulfilled`, `rejected`)
export const fetchData = createAsyncThunk("data/fetchData", async () => {
  const response = await fetch("https://jsonplaceholder.typicode.com/todos/1");
  return await response.json();
});

const dataSlice = createSlice({
  name: "data",
  initialState: { item: null, loading: false, error: null },
  reducers: {},
  extraReducers: (builder) => {
    builder
      .addCase(fetchData.pending, (state) => { state.loading = true; })
      .addCase(fetchData.fulfilled, (state, action) => {
        state.loading = false;
        state.item = action.payload;
      })
      .addCase(fetchData.rejected, (state) => { state.loading = false; });
  },
});

export default dataSlice.reducer;

?? 組件中使用異步 Action

import { useSelector, useDispatch } from "react-redux";
import { fetchData } from "./dataSlice";

function DataComponent() {
  const { item, loading } = useSelector(state => state.data);
  const dispatch = useDispatch();

  return (
    <div>
      {loading ? <p>Loading...</p> : <p>Data: {item?.title}</p>}
      <button onClick={() => dispatch(fetchData())}>Fetch Data</button>
    </div>
  );
}

? 優(yōu)勢:

  • createAsyncThunk 自動管理 loading 狀態(tài)
  • 不需要手寫 redux-thunk
  • extraReducers 處理異步狀態(tài),代碼更清晰

?? Redux Toolkit 還提供的高級功能

1?? RTK Query(數(shù)據(jù)請求 & 緩存)

?? 自動管理 API 數(shù)據(jù)請求、緩存、狀態(tài)

import { createApi, fetchBaseQuery } from "@reduxjs/toolkit/query/react";

// 創(chuàng)建 API Slice
export const postApi = createApi({
  reducerPath: "postApi",
  baseQuery: fetchBaseQuery({ baseUrl: "https://jsonplaceholder.typicode.com" }),
  endpoints: (builder) => ({
    getPosts: builder.query({ query: () => "/posts" }),
  }),
});

// 自動生成 Hooks
export const { useGetPostsQuery } = postApi;

?? 組件中直接調(diào)用 API

const { data, error, isLoading } = useGetPostsQuery();

? 優(yōu)勢:

  • 自動緩存數(shù)據(jù),避免重復請求
  • 支持 realtime polling(輪詢)
  • 支持 WebSocket 訂閱

?? 總結(jié)

Redux Toolkit 優(yōu)勢

? 優(yōu)化點

簡化 Redux 代碼

createSlice

 代替 reducer + action,減少 boilerplate

自動優(yōu)化 store

configureStore

 自動組合 reducer,優(yōu)化 middleware

支持可變寫法

內(nèi)置 Immer.js,state 可直接修改

內(nèi)置異步處理

createAsyncThunk

 代替 redux-thunk,管理 loading

支持 API 緩存

RTK Query

 自動緩存 API 請求數(shù)據(jù)

提高性能

reselect

 + 自動 memoization,避免無效渲染

?? Redux Toolkit 是 Redux 的現(xiàn)代化解決方案,推薦用于 React + Redux 開發(fā)!

責任編輯:武曉燕 來源: 大遷世界
相關(guān)推薦

2025-03-05 00:01:00

ReduxReact

2024-04-30 09:02:48

2025-02-18 08:11:17

2024-08-20 08:29:55

2024-10-10 16:53:53

守護線程編程

2023-01-12 08:24:45

ZookeeperZK服務(wù)器

2022-12-05 08:12:31

net/http庫http連接池

2021-04-11 11:20:26

數(shù)字人民幣數(shù)字貨幣區(qū)塊鏈

2025-02-27 08:09:52

2024-09-02 00:30:41

Go語言場景

2024-03-12 10:44:42

2023-12-20 08:23:53

NIO組件非阻塞

2015-08-24 09:23:25

2025-03-11 00:35:00

Spring事件機制

2024-04-22 08:02:34

kafka消息隊列高可用

2022-11-28 00:04:17

2024-01-15 12:16:37

2024-07-30 08:22:47

API前端網(wǎng)關(guān)

2024-11-08 09:48:38

異步編程I/O密集

2024-04-07 00:00:03

點贊
收藏

51CTO技術(shù)棧公眾號