React后台管理(五)-- 状态管理工具mobx安装以及本项目登录,表格,用户信息状态管理封装使用


前言

本章主要讲mobx的使用以及创建登录,用户信息,表格实例


一、安装mobx mobx-react mobx-react-lite

npm i -S mobx mobx-react mobx-react-lite

二、创建登录,表格,用户公共信息状态管理

1. 创建登录store文件 login.jsx

功能分析:
封装登录系统hook函数
封装退出系统hook函数
存储用户token等信息

// @/store/login.jsx
// login module
import { makeAutoObservable } from "mobx";
import { getUsername, setUsername, getToken, setToken, removeToken } from "@/utils/storage";
import { loginCode } from "@/api/account"; // api
class LoginStore {
  token = getToken() || "";
  state = {
    token: "" || getToken(), // 用户token
    username: "" || getUsername(), // 用户name
    mobile: "" || localStorage.getItem("mobile"), // 手机号
    role: "" || localStorage.getItem("role"), // 角色
    isAdmin: JSON.parse(sessionStorage.getItem("a")) || false, // 是否超管
    permissions: [], // 权限ID
  };
  constructor() {
    // 响应式
    makeAutoObservable(this);
  }
  // 设置token
  SET_TOKEN(payload) {
    this.state.token = payload;
    setToken(payload);
  }
  // 设置手机号
  SET_MOBILE(payload) {
    this.state.mobile = payload;
    localStorage.setItem("mobile", payload);
  }
  // 设置用户名
  SET_USERNAME(payload) {
    this.state.username = payload;
    setUsername(payload);
  }
  // 设置角色
  SET_ROLE(payload) {
    const role = payload && payload.length ? payload.map((item) => item.roleName).join() : "";
    this.state.role = role;
    localStorage.setItem("role", role);
  }
  // 设置权限
  SET_PER(payload) {
    this.state.permissions = payload;
    localStorage.setItem("p", payload);
  }
  // 设置是否是超管
  SET_ISADMIN(value) {
    this.state.isAdmin = value === "10000";
    sessionStorage.setItem("a", JSON.stringify(this.state.isAdmin));
  }
  // 更新数据
  updateData(data) {
    this.SET_TOKEN(data.token);
    this.SET_MOBILE(data.mobile);
    this.SET_USERNAME(data.userName);
    this.SET_ROLE(data.roleList);
    this.SET_PER(data.permissions);
    this.SET_ISADMIN(data.userId);
    data.resetPwd && removeToken();
  }
  // 登录hook
  loginAction = ({ mobile, code }) => {
    return new Promise(async (resolve, reject) => {
      try {
        const res = await loginCode({ mobile: mobile, verification: code });
        this.updateData(res?.data);
        resolve(res?.data);
      } catch {}
    });
  };
  // 退出hook
  logOutAction = () => {
    return new Promise((resolve, reject) => {
      this.token = "";
      removeToken();
      resolve();
    });
  };
}
export default LoginStore;

2. 创建表格store文件----table.jsx

功能分析:
(1)存储离开的路由地址
(2)存储当前的路由地址
(3)存储表格分页器的页码相关参数,为了处理进入详情返回时定位到之前的分页数据
(4)存储表格当前筛选动作类型:初始化,搜索,重置

// @/store/table.jsx
import { makeAutoObservable } from "mobx";
import Config from "@/config";

class TableStore {
  state = {
    fromPath: localStorage.getItem("fromPath") || "", // 离开的路由
    currentPath: localStorage.getItem("currentPath") || "", // 当前的路由
    page: {
      size: Config.pageSize,
      index: Config.pageIndex,
    }, // 页码
    filterAction: "", // 筛选动作
  };
  constructor() {
    makeAutoObservable(this);
  }
  // 记录离开页面的路由
  SET_FROM_PATH(value) {
    this.state.fromPath = value;
    localStorage.setItem("fromPath", value);
  }
  // 记录当前页面的路由
  SET_CURRENT_PATH(value) {
    const prevPath = JSON.parse(JSON.stringify(this.state.currentPath));
    this.SET_FROM_PATH(prevPath);
    setTimeout(() => {
      this.state.currentPath = value;
      localStorage.setItem("currentPath", value);
    }, 500);
  }
  // 记录筛选动作
  SET_FILTER_ACTION(value) {
    this.state.filterAction = value;
  }
  // 记录页码
  SET_PAGE(value) {
    this.state.page.size = value.size;
    this.state.page.index = value.index;
  }
}
export default TableStore;

3. 创建用户信息store文件----userInfo.jsx

功能分析:
(1)添加runInAction正确追踪和响应数据变化
(2)存储展开收起状态
(3)封装获取用户信息接口函数

// @/store/userInfo.js
import { makeAutoObservable, runInAction } from "mobx";
import { http } from "@/utils";

class UserStore {
  userInfo = {};
  state = {
    collapse: false,
  };
  constructor() {
    makeAutoObservable(this);
  }
  getUserInfo = async () => {
    // 调用接口数据
    const data = await http.get("/api/userInfo");
    runInAction(() => {
      this.userInfo = data;
    });
  };
  setCollapse = () => {
    this.state.collapse = !this.state.collapse;
  };
}
export default UserStore;

4. 所有模块统一引入处理----index.jsx

功能分析:
把所有模块统一管理,实例化根,并导出

// @src/store/index.js
import { createContext, useContext } from "react";
import LoginStore from "./login";
import UserStore from "./userInfo";
import TableStore from "./table";
class RootStore {
  constructor() {
    this.LoginStore = new LoginStore();
    this.UserStore = new UserStore();
    this.TableStore = new TableStore();
  }
}
// 实例化根 导出useStore context
const rootStore = new RootStore();
const context = createContext(rootStore);
const useStore = () => useContext(context);

export default useStore;

总结

下一篇讲【mock方案选择以及真实服务器连接】。关注本栏目,会实时更新!

  • 17
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值