如何使用Redux Toolkit簡(jiǎn)化Redux
了解Redux Toolkit,這是用于高效Redux開(kāi)發(fā)的經(jīng)過(guò)驗(yàn)證的工具集。在本文中,你將看到為什么Redux Toolkit值得React社區(qū)更多的關(guān)注。
React和Redux被認(rèn)為是大規(guī)模React應(yīng)用中管理狀態(tài)的最佳組合。然而,隨著時(shí)間的推移,Redux的受歡迎程度下降,原因是:
- 配置Redux Store并不簡(jiǎn)單。
- 我們需要幾個(gè)軟件包來(lái)使Redux與React一起工作。
- Redux需要太多樣板代碼。
帶著這些問(wèn)題,Redux的創(chuàng)建者Dan Abramov發(fā)表了名為《你可能不需要Redux》的文章,建議人們只在需要的時(shí)候使用Redux,而在開(kāi)發(fā)不那么復(fù)雜的應(yīng)用時(shí),要遵循其他方法。
Redux Toolkit解決的問(wèn)題
Redux Toolkit(之前稱(chēng)為Redux Starter Kit)提供了一些選項(xiàng)來(lái)配置全局store,并通過(guò)盡可能地抽象Redux API來(lái)更精簡(jiǎn)地創(chuàng)建動(dòng)作和reducers。
它包括什么?
Redux Toolkit附帶了一些有用的軟件包,例如Immer,Redux-Thunk和Reselect。它使React開(kāi)發(fā)人員的工作變得更加輕松,允許他們直接更改狀態(tài)(不處理不可變性),并應(yīng)用Thunk之類(lèi)的中間件(處理異步操作)。它還使用了Redux的一個(gè)簡(jiǎn)單的“選擇器”庫(kù)Reselect來(lái)簡(jiǎn)化reducer函數(shù)。
Redux Toolkit API的主要功能?
以下是Redux Took Kit使用的API函數(shù),它是現(xiàn)有Redux API函數(shù)的抽象。這些函數(shù)并沒(méi)有改變Redux的流程,只是以更易讀和管理的方式簡(jiǎn)化了它們。
- configureStore:像從Redux中創(chuàng)建原始的createStore一樣創(chuàng)建一個(gè)Redux store實(shí)例,但接受一個(gè)命名的選項(xiàng)對(duì)象并自動(dòng)設(shè)置Redux DevTools擴(kuò)展。
- createAction:接受一個(gè)Action類(lèi)型字符串,并返回一個(gè)使用該類(lèi)型的Action創(chuàng)建函數(shù)。
- createReducer:接受初始狀態(tài)值和Action類(lèi)型的查找表到reducer函數(shù),并創(chuàng)建一個(gè)處理所有Action類(lèi)型的reducer。
- createSlice:接受一個(gè)初始狀態(tài)和一個(gè)帶有reducer名稱(chēng)和函數(shù)的查找表,并自動(dòng)生成action creator函數(shù)、action類(lèi)型字符串和一個(gè)reducer函數(shù)。
您可以使用上述API簡(jiǎn)化Redux中的樣板代碼,尤其是使用createAction和createReducer方法。然而,這可以使用createSlice進(jìn)一步簡(jiǎn)化,它可以自動(dòng)生成action creator和reducer函數(shù)。
createSlice有什么特別之處?
它是一個(gè)生成存儲(chǔ)片的助手函數(shù)。它接受片的名稱(chēng)、初始狀態(tài)和reducer函數(shù)來(lái)返回reducer、action類(lèi)型和action creators。
首先,讓我們看看在傳統(tǒng)的React-Redux應(yīng)用程序中reducers和actions的樣子。
Actions
import {GET_USERS,CREATE_USER,DELETE_USER} from "../constant/constants"; export const GetUsers = (data) => (dispatch) => { dispatch({ type: GET_USERS, payload: data, }); }; export const CreateUser = (data) => (dispatch) => { dispatch({ type: CREATE_USER, payload: data, }); }; export const DeleteUser = (data) => (dispatch) => { dispatch({ type: DELETE_USER, payload: data, }); };
Reducers
import {GET_USERS,CREATE_USER,DELETE_USER} from "../constant/constants"; const initialState = { errorMessage: "", loading: false, users:[] }; const UserReducer = (state = initialState, { payload }) => { switch (type) { case GET_USERS: return { ...state, users: payload, loading: false }; case CREATE_USER: return { ...state, users: [payload,...state.users], loading: false }; case DELETE_USER: return { ...state, users: state.users.filter((user) => user.id !== payload.id), , loading: false }; default: return state; } }; export default UserReducer;
現(xiàn)在,讓我們看看如何使用createSlice簡(jiǎn)化并實(shí)現(xiàn)相同的功能。
import { createSlice } from '@reduxjs/toolkit'; export const initialState = { users: [], loading: false, error: false, }; const userSlice = createSlice({ name: 'user', initialState, reducers: { getUser: (state, action) => { state.users = action.payload; state.loading = true; state.error = false; }, createUser: (state, action) => { state.users.unshift(action.payload); state.loading = false; }, deleteUser: (state, action) => { state.users.filter((user) => user.id !== action.payload.id); state.loading = false; }, }, }); export const { createUser, deleteUser, getUser } = userSlice.actions; export default userSlice.reducer;
正如你所看到的,現(xiàn)在所有的動(dòng)作和reducer都在一個(gè)簡(jiǎn)單的地方,而在傳統(tǒng)的redux應(yīng)用中,你需要在reducer中管理每一個(gè)action和它對(duì)應(yīng)的action,當(dāng)使用createSlice時(shí),你不需要使用開(kāi)關(guān)來(lái)識(shí)別action。
當(dāng)涉及到突變狀態(tài)時(shí),一個(gè)典型的Redux流程會(huì)拋出錯(cuò)誤,你將需要特殊的JavaScript策略,如spread operator和Object assign來(lái)克服它們。由于Redux Toolkit使用Immer,因此您不必?fù)?dān)心會(huì)改變狀態(tài)。由于slice創(chuàng)建了actions和reducers,你可以導(dǎo)出它們,并在你的組件和Store中使用它們來(lái)配置Redux,而無(wú)需為actions和reducers建立單獨(dú)的文件和目錄,如下所示。
import { configureStore } from "@reduxjs/toolkit"; import userSlice from "./features/user/userSlice"; export default configureStore({ reducer: { user: userSlice, }, });
這個(gè)存儲(chǔ)可以通過(guò)使用useSelector和useDispatch的redux api直接從組件中使用。請(qǐng)注意,您不必使用任何常量來(lái)標(biāo)識(shí)操作或使用任何類(lèi)型。
處理異步Redux流
為了處理異步動(dòng)作,Redux Toolkit提供了一個(gè)特殊的API方法,稱(chēng)為createAsyncThunk,它接受一個(gè)字符串標(biāo)識(shí)符和一個(gè)payload創(chuàng)建者回調(diào),執(zhí)行實(shí)際的異步邏輯,并返回一個(gè)Promise,該P(yáng)romise將根據(jù)你返回的Promise處理相關(guān)動(dòng)作的調(diào)度,以及你的reducers中可以處理的action類(lèi)型。
import axios from "axios"; import { createAsyncThunk } from "@reduxjs/toolkit"; export const GetPosts = createAsyncThunk( "post/getPosts", async () => await axios.get(`${BASE_URL}/posts`) ); export const CreatePost = createAsyncThunk( "post/createPost",async (post) => await axios.post(`${BASE_URL}/post`, post) );
與傳統(tǒng)的數(shù)據(jù)流不同,由createAsyncThunk處理的action將由分片內(nèi)的extraReducers部分處理。
import { createSlice } from "@reduxjs/toolkit"; import { GetPosts, CreatePost } from "../../services"; export const initialState = { posts: [], loading: false, error: null, }; export const postSlice = createSlice({ name: "post", initialState: initialState, extraReducers: { [GetPosts.fulfilled]: (state, action) => { state.posts = action.payload.data; }, [GetPosts.rejected]: (state, action) => { state.posts = []; }, [CreatePost.fulfilled]: (state, action) => { state.posts.unshift(action.payload.data); }, }, }); export default postSlice.reducer;
請(qǐng)注意,在extraReducers內(nèi)部,您可以處理已解決(fulfilled)和已拒絕(rejected)狀態(tài)。
通過(guò)這些代碼片段,您可以看到此工具包在Redux中簡(jiǎn)化代碼的效果如何。我創(chuàng)建了一個(gè)利用Redux Toolkit的REST示例供您參考。
最后的想法
根據(jù)我的經(jīng)驗(yàn),當(dāng)開(kāi)始使用Redux時(shí),Redux Toolkit是一個(gè)很好的選擇。它簡(jiǎn)化了代碼,并通過(guò)減少模板代碼來(lái)幫助管理Redux狀態(tài)。
最后,就像Redux一樣,Redux Toolkit并非僅為React構(gòu)建。我們可以將其與其他任何框架(例如Angular)一起使用。
您可以通過(guò)參考Redux Toolkit的文檔找到更多信息。
謝謝您的閱讀!
以上就是如何使用Redux Toolkit簡(jiǎn)化Redux的詳細(xì)內(nèi)容,更多關(guān)于使用Redux Toolkit簡(jiǎn)化Redux的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
React中的useState和useEffect詳細(xì)解析
useState和useEffect是React的兩個(gè)重要Hook,用于組件狀態(tài)管理和處理副作用,useState允許添加狀態(tài)變量,控制組件渲染,而useEffect用于執(zhí)行渲染后的副作用操作,本文給大家介紹React中的useState和useEffect詳細(xì)解析,感興趣的朋友跟隨小編一起看看吧2024-10-10React中使用react-json-view展示JSON數(shù)據(jù)的操作方法
react-json-view是一個(gè)用于顯示和編輯javascript數(shù)組和JSON對(duì)象的React組件,本文給大家分享React中使用react-json-view展示JSON數(shù)據(jù)的操作方法,感興趣的朋友一起看看吧2023-12-12IntersectionObserver實(shí)現(xiàn)加載更多組件demo
這篇文章主要為大家介紹了IntersectionObserver實(shí)現(xiàn)加載更多組件demo,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07React報(bào)錯(cuò)之組件不能作為JSX組件使用的解決方法
本文主要介紹了React報(bào)錯(cuò)之組件不能作為JSX組件使用的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07react PropTypes校驗(yàn)傳遞的值操作示例
這篇文章主要介紹了react PropTypes校驗(yàn)傳遞的值操作,結(jié)合實(shí)例形式分析了react PropTypes針對(duì)傳遞的值進(jìn)行校驗(yàn)操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2020-04-04