第三章: 全局数据状态管理 Redux
Redux 是啥?
可以理解为全局数据状态管理工具,用来做组件通信等。
好的废话不多说,直接上手。
引入redux 与 react-redux
npm install redux react-redux --save
//o r
yarn add redux react-redux
随后创建store.ts,简单封装个项目可用的store
/src/tools/store/store.ts
store.ts源码如下
import { combineReducers, createStore } from "redux";
export const USER_STATE = 'USER_STATE'; // 用户信息标识
export const MENU_STATE = 'MENU_STATE'; // 菜单信息标识
const initState = {
user: {},// 用户信息
menuList: [], // 菜单信息
recentMenu: [] // 最近使用的菜单
};
const todos = (state = initState, action: any) => {
switch (action.type) {
// 用户信息变化
case USER_STATE:
return { ...state, user: action.user };
case MENU_STATE:
return { ...state, menuList: action.menuList };
default:
return state
}
}
const reducers = combineReducers({
globalInfo:todos
})
const createMyStore = () => {
const store = createStore(reducers)
return store;
}
const store = createMyStore()
export default store;
封装好后,在根目录的index.tsx中调用,代码如下:
import React from "react";
import ReactDOM from "react-dom";
import "./index.css";
import reportWebVitals from "./reportWebVitals";
import "./style/index.less";
import Login from "./pages/login";
import { Provider } from "react-redux";
import store from "./tools/store/store";
ReactDOM.render(
<React.StrictMode>
<Provider store={store}>
<Login />
</Provider>
</React.StrictMode>,
document.getElementById("root")
);
// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
reportWebVitals();
好了,封装好后,我们回到上一章的Login(登录页中),更新下信息,后续的组件需要用户信息 直接可以获取。
通过useDispatch方法获取dispatch,进行用户信息更新。
import { Form, Input, Button, Checkbox, Card } from "antd";
import cookie from "react-cookies";
import { useDispatch } from "react-redux";
import store, { USER_STATE } from "../../tools/store/store";
const Login = () => {
const dispatch = useDispatch();
const changeUser = (values: any) => {
return { type: USER_STATE, user: { ...values } };
};
const onFinish = (values: any) => {
console.log("Success:", values);
console.log("cookie:", cookie.load("token"));
console.log("store:", store.getState()); // 获取state
// 登录成功
setTimeout(() => {
const oneDay = new Date(new Date().getTime() + 24 * 3600 * 1000); // 设置失效日期一天
cookie.save("token", "ffffffffff", { expires: oneDay });
//登录更新用户
dispatch(changeUser(values));
}, 1000);
};
const onFinishFailed = (errorInfo: any) => {
console.log("Failed:", errorInfo);
};
return (
<Card style={{ top: 50, width: "50%", marginLeft: "25%" }}>
<Form
name="basic"
labelCol={{ span: 4 }}
wrapperCol={{ span: 18 }}
initialValues={{ remember: true }}
onFinish={onFinish}
onFinishFailed={onFinishFailed}
autoComplete="off"
>
<Form.Item
label="账号"
name="username"
rules={[{ required: true, message: "Please input your username!" }]}
>
<Input />
</Form.Item>
<Form.Item
label="密码"
name="password"
rules={[{ required: true, message: "Please input your password!" }]}
>
<Input.Password />
</Form.Item>
<Form.Item
name="remember"
valuePropName="checked"
wrapperCol={{ offset: 8, span: 16 }}
>
<Checkbox>记住账号</Checkbox>
</Form.Item>
<Form.Item wrapperCol={{ offset: 8, span: 16 }}>
<Button type="primary" htmlType="submit">
登录
</Button>
</Form.Item>
</Form>
</Card>
);
};
export default Login;
到此登录页与状态管理完成。
网友评论