React useContext + useReducer 实现 Hooks 状态管理功能
App.tsx
import { useReducer } from "react";
import { BrowserRouter, Switch } from 'react-router-dom';
import { renderRoutes } from "react-router-config";
import routes from "./router";
import { IUser, IReducerAction } from '@/common/types/interface'
import { UserContext } from '@/store/user'
function App() {
const userReducer = (state: IUser, action: IReducerAction) => {
switch (action.type) {
case 'updata':
return { ...state, ...action.params }
default:
return state
}
}
const userStorage = sessionStorage.getItem('userInfo') || '{}'
const initialUserState = JSON.parse(userStorage)
const [store, dispatch] = useReducer(userReducer, initialUserState)
return (
{ renderRoutes(routes) }
);
}
export default App;
创建 createContext (@/store/user)
import { createContext } from "react";
// import { ICreateContext } from '@/common/types/interface'
interface ICreateContext {
store: any,
dispatch: any
}
export const UserContext = createContext({
store: '',
dispatch: ''
});
在登录时获取接口返回的数据,并更新到 store 中
import React, {useContext} from "react";
import { LoginWrapper, LoginContainer } from './styled'
import { Form, Input, Button, message } from 'antd';
import { login } from '@/api/login'
import { UserContext } from '@/store/user'
interface ILogin {
userName: string;
password: string;
}
const Login: React.FC = (props:any) => {
const { dispatch } = useContext(UserContext)
const onFinish = async (form: ILogin) => {
try {
const res:any = await login(form)
message.success(res.message);
sessionStorage.setItem('userInfo', JSON.stringify(res.data))
dispatch({
type: 'updata',
params: res.data
})
setTimeout(() => {
props.history.push('/home')
}, 1000)
} catch (error) {
}
};
const onFinishFailed = (errorInfo: any) => {
console.log('Failed:', errorInfo);
};
return (
登录
<Form
name="basic"
labelCol={{ span: 6 }}
wrapperCol={{ span: 18 }}
initialValues={{
userName: 'Fengchengzhi',
password: '123456'
}}
onFinish={onFinish}
onFinishFailed={onFinishFailed}
autoComplete="off"
>
<Form.Item
label="Username"
name="userName"
rules={[{ required: true, message: 'Please input your username!' }]}
>
<Form.Item
label="Password"
name="password"
rules={[{ required: true, message: 'Please input your password!' }]}
>
10, span: 14 }}>
)
}
export default Login
获取 store 数据并展示
import React, { useContext } from "react";
import { HeaderWrapper } from './styled'
import { UserContext } from '../../store/user'
const HeaderComps: React.FC = () => {
const { store: userInfo } = useContext(UserContext)
return (
"header-wrapper">
用户姓名:{ userInfo.userName }
)
}
export default HeaderComps