react状态管理store用法二: 使用Hooks 配置redux
react最通用的状态管理方案就是的redux,下面介绍通过Hooks的方式使用redux
npm install react-redux @reduxjs/toolkit -S
创建store
1.新建store文件夹,在下面新建index.tsx文件和slices文件夹,其中slices文件夹用来定义需要放进store的数据结构和方法

slices文件夹下新建app.ts文件,内容
import api from '@/api'; import {createAsyncThunk, createSlice} from '@reduxjs/toolkit'; import type {RootState} from '../index'; export interface BInfo { title: string; link?: string; } interface AppState { bInfo: BInfo[]; collapsed: boolean; user: { userName: string; loading: boolean; authList: string[]; }; } interface QueryUserInfoReturned { userName: string; authList: string[]; } export const queryUserInfo = createAsyncThunk<QueryUserInfoReturned>('app/userinfo', async (_, {rejectWithValue}) => { try { const res = await api.getUserInfo(); const userName: string = res?.loginEmail || '"'; const roleList: any[] = res?.authList || []; const authList: string[] = Array.from( new Set( roleList .map((item) => { const authKeyList: string | undefined = item.resourceIds; return authKeyList ? authKeyList.split(',') : []; }) .flat() ) ); return { userName, authList }; } catch (err: any) { return rejectWithValue(err?.msg || '网络错误'); } }); const initialState: AppState = { bInfo: [], collapsed: false, user: { loading: true, userName: '', authList: [] } }; export const appSlice = createSlice({ name: 'app', initialState, reducers: { setBInfo(state, {payload}) { Array.isArray(payload) && (state.binfo = payload); }, toggleCollapse(state) { state.collapsed = !state.collapsed; } }, extraReducers: (builder) => builder .addCase(queryUserInfo.pending, (state) => { state.user.loading = true; }) .addCase(queryUserInfo.fulfilled, (state, {payload}) => { state.user.loading = false; state.user.userName = payload.userName; state.user.authList = payload.authList; }) .addCase(queryUserInfo.rejected, (state) => { state.user.loading = false; }) }); export const {setBInfo, toggleCollapse} = appSlice.actions; export const selectApp = (state: RootState) => state.app; export default appSlice.reducer;
createAsyncThunk用来处理异步数据,正常情况使用createSlice的action即可。
index.tsx文件
import {configureStore} from '@reduxjs/toolkit';
import app from './slices/app';
// import pageList from './slices/pageList'; // 组件状态
const store = configureStore({
reducer: {
app,
// pageList
},
//关闭redux序列化检测
middleware: getDefaultMiddleware => [
...getDefaultMiddleware({serializableCheck: false}),
],
});
export default store;
export type RootState = ReturnType<typeof store.getState>;
export type AppDispatch = typeof store.dispatch;
export interface AppThunkApiConfig {
state: RootState;
rejectValue: string;
}
使用
import {Provider} from 'react-redux';
import store from '@/store';
const App = () => {
return (
<Provider store={store} >
<Component>
</Provider>
)
}
export default App;
调用
import React, { useEffect} from 'react';
import {useDispatch, useSelector} from 'react-redux';
import {queryUserInfo, setBinfo,selectApp} from '@/store/slices/app';
const Mycomponent =() => {
const dispatch = useDispatch();
const {user} = useSelector(selectApp);
useEffect(() => {
dispatch(queryUserInfo());
}, [dispatch]);
useEffect(() => {
dispatch(setBInfo([1,2,3]));
}, [dispatch]);
return (<div>
</div>)
}
export default Mycomponent;
ps: 上面只是介绍了hooks使用方式,但也可以在类组件中正常使用,你可以按原来的方式使用redux
// 类组件使用 import store from '@/store'; // 你自己的数据结构 const { pageList: { pageName:{ selectedRow: [], selectedRowKeys: [], }, }, } = store.getState(); store.dispatch(setSelectedRowKeys( { pageName, selectedRowKeys: _selectedRowKeys, } ));

浙公网安备 33010602011771号