refactor: 将react-redux的代码迁移至redux-toolkit

master
钟良源 5 months ago
parent 83368c4ffe
commit 8f2980f07f

@ -20,6 +20,7 @@ import useStorage from '@/utils/useStorage';
import { generatePermission } from '@/routes'; import { generatePermission } from '@/routes';
import logoImage from '@/public/assets/logo.png'; import logoImage from '@/public/assets/logo.png';
import useUser from '@/hooks/user'; import useUser from '@/hooks/user';
import { updateUserInfo } from '@/store';
function Navbar({ show }: { show: boolean }) { function Navbar({ show }: { show: boolean }) {
const t = useLocale(); const t = useLocale();
@ -42,15 +43,12 @@ function Navbar({ show }: { show: boolean }) {
} }
useEffect(() => { useEffect(() => {
dispatch({ dispatch(updateUserInfo({
type: 'update-userInfo',
payload: {
userInfo: { userInfo: {
...userInfo, ...userInfo,
permissions: generatePermission(role) permissions: generatePermission(role)
} }
} }));
});
}, [role]); }, [role]);
if (!show) { if (!show) {

@ -4,6 +4,7 @@ import { useSelector, useDispatch } from 'react-redux';
import { GlobalState } from '../../store'; import { GlobalState } from '../../store';
import useLocale from '../../utils/useLocale'; import useLocale from '../../utils/useLocale';
import styles from './style/block.module.less'; import styles from './style/block.module.less';
import { updateSettings } from '@/store';
export interface BlockProps { export interface BlockProps {
title?: ReactNode; title?: ReactNode;
@ -34,12 +35,9 @@ export default function Block(props: BlockProps) {
onChange={(checked) => { onChange={(checked) => {
const newSetting = { const newSetting = {
...settings, ...settings,
[option.value]: checked, [option.value]: checked
}; };
dispatch({ dispatch(updateSettings({ settings: newSetting }));
type: 'update-settings',
payload: { settings: newSetting },
});
// set color week // set color week
if (checked && option.value === 'colorWeek') { if (checked && option.value === 'colorWeek') {
document.body.style.filter = 'invert(80%)'; document.body.style.filter = 'invert(80%)';
@ -58,12 +56,9 @@ export default function Block(props: BlockProps) {
onChange={(value) => { onChange={(value) => {
const newSetting = { const newSetting = {
...settings, ...settings,
[option.value]: value, [option.value]: value
}; };
dispatch({ dispatch(updateSettings({ settings: newSetting }));
type: 'update-settings',
payload: { settings: newSetting },
});
}} }}
/> />
)} )}

@ -6,6 +6,7 @@ import { useSelector, useDispatch } from 'react-redux';
import { GlobalState } from '../../store'; import { GlobalState } from '../../store';
import useLocale from '@/utils/useLocale'; import useLocale from '@/utils/useLocale';
import styles from './style/color-panel.module.less'; import styles from './style/color-panel.module.less';
import { updateSettings } from '@/store';
function ColorPanel() { function ColorPanel() {
const theme = const theme =
@ -26,13 +27,10 @@ function ColorPanel() {
color={themeColor} color={themeColor}
onChangeComplete={(color) => { onChangeComplete={(color) => {
const newColor = color.hex; const newColor = color.hex;
dispatch({ dispatch(updateSettings({ settings: { ...settings, themeColor: newColor } }));
type: 'update-settings',
payload: { settings: { ...settings, themeColor: newColor } },
});
const newList = generate(newColor, { const newList = generate(newColor, {
list: true, list: true,
dark: theme === 'dark', dark: theme === 'dark'
}); });
newList.forEach((l, index) => { newList.forEach((l, index) => {
const rgbStr = getRgbStr(l); const rgbStr = getRgbStr(l);

@ -3,15 +3,12 @@ import { useRouter } from 'next/router';
import cookies from 'next-cookies'; import cookies from 'next-cookies';
import Head from 'next/head'; import Head from 'next/head';
import type { AppProps } from 'next/app'; import type { AppProps } from 'next/app';
import { createStore } from 'redux';
import { Provider } from 'react-redux'; import { Provider } from 'react-redux';
import '../style/global.less'; import '../style/global.less';
import { ConfigProvider, Message } from '@arco-design/web-react'; import { ConfigProvider, Message } from '@arco-design/web-react';
import zhCN from '@arco-design/web-react/es/locale/zh-CN'; import zhCN from '@arco-design/web-react/es/locale/zh-CN';
import enUS from '@arco-design/web-react/es/locale/en-US'; import enUS from '@arco-design/web-react/es/locale/en-US';
import axios from 'axios';
import NProgress from 'nprogress'; import NProgress from 'nprogress';
import rootReducer from '../store';
import { GlobalContext } from '../context'; import { GlobalContext } from '../context';
import checkLogin from '@/utils/checkLogin'; import checkLogin from '@/utils/checkLogin';
import '@/api'; // 全局挂载axios拦截器 import '@/api'; // 全局挂载axios拦截器
@ -21,8 +18,9 @@ import Layout from './layout';
import '../mock'; import '../mock';
import { getUserInfo } from '@/api/user'; import { getUserInfo } from '@/api/user';
import { setSessionUserInfo } from '@/utils/auth'; import { setSessionUserInfo } from '@/utils/auth';
import store from '@/store'; // 只导入 store
import { updateUserInfo } from '@/store'; // 导入 action
const store = createStore(rootReducer);
interface RenderConfig { interface RenderConfig {
arcoLang?: string; arcoLang?: string;
@ -51,16 +49,10 @@ export default function MyApp({
}, [lang]); }, [lang]);
async function fetchUserInfo() { async function fetchUserInfo() {
store.dispatch({ store.dispatch(updateUserInfo({ userLoading: true }));
type: 'update-userInfo',
payload: { userLoading: true }
});
const res: any = await getUserInfo(); const res: any = await getUserInfo();
setSessionUserInfo(res.data); setSessionUserInfo(res.data);
store.dispatch({ store.dispatch(updateUserInfo({ userInfo: { ...res.data } }));
type: 'update-userInfo',
payload: { userInfo: { ...res.data } }
});
} }
useEffect(() => { useEffect(() => {

@ -1,4 +1,6 @@
import { createSlice, configureStore } from '@reduxjs/toolkit';
import defaultSettings from '../settings.json'; import defaultSettings from '../settings.json';
export interface GlobalState { export interface GlobalState {
settings?: typeof defaultSettings; settings?: typeof defaultSettings;
userInfo?: { userInfo?: {
@ -16,28 +18,33 @@ export interface GlobalState {
const initialState: GlobalState = { const initialState: GlobalState = {
settings: defaultSettings, settings: defaultSettings,
userInfo: { userInfo: {
permissions: {}, permissions: {}
}, }
}; };
export default function store(state = initialState, action) { const globalSlice = createSlice({
switch (action.type) { name: 'global',
case 'update-settings': { initialState,
const { settings } = action.payload; reducers: {
return { updateSettings(state, action) {
...state, state.settings = action.payload.settings;
settings, },
}; updateUserInfo(state, action) {
} state.userInfo = action.payload.userInfo || initialState.userInfo;
case 'update-userInfo': { state.userLoading = action.payload.userLoading;
const { userInfo = initialState.userInfo, userLoading } = action.payload;
return {
...state,
userLoading,
userInfo,
};
} }
default:
return state;
} }
} });
// 保持与原来相同的 action creators 导出方式
export const { updateSettings, updateUserInfo } = globalSlice.actions;
// 创建 store
const store = configureStore({
reducer: globalSlice.reducer
});
export type RootState = ReturnType<typeof store.getState>;
export type AppDispatch = typeof store.dispatch;
export default store;

Loading…
Cancel
Save