Mobx+Reactjs+Material-UI+Webpack+React-Router 搭建后台管理系统

先讲一下mobx,mobx是一个强大的状态管理工具,相比redux, 更将深入的阐释了面向对象的概念,mobx官网的几个实例demo也写得很精彩,大家可以好好拜读一下。https://github.com/mobxjs/awesome-mobx#example-projects中有很多封装得不错的工具类。mobx简单的应用方法官网都有介绍,自行入门。

Material-ui号称是最流行的ui框架之一,手残入坑,个人觉得这个ui框架还有很多成长空间。倒是有不少基于当前框架的第三方组件,需要在实际应用中去挖掘,该框架的优势是web端和移动端用起来都没有违和感。可能是之前在使用antd留下的惯用,第一次接触表单控件时觉得很费劲,后期跟mobx结合使用,也算是一大利器。

其他三个都是常用的技术栈,无须赘述,下面直接讲项目。

在项目中添加material-ui一定要按照官网的步骤进行操作,避免不必要的错误,例如图标不显示,css样式不对等,mobx同理。

项目入口:index.js

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import {Provider} from "mobx-react";
import * as rootStore from './store/rootStore';
import {BrowserRouter} from 'react-router-dom';
import Routes from './routes/index';
ReactDOM.render(
    <Provider {...rootStore}>
        <BrowserRouter>
            <Routes />
        </BrowserRouter>
    </Provider>, document.getElementById('root'));

这里涉及到怎么管理多个store文件,rootStore是多个store的集合,以便于在项目编译过程中进行统一管理。以下是rootStore的代码

import UserStore from './userStore'
import CommonStore from './commonStore'
export {UserStore,CommonStore}

react-router的基础配置,因为系统本身有多级菜单的情况,除了外部链接地址,其他内部链接地址将在另外一个文件中进行配置

import {Route, Switch} from "react-router";
import React from 'react';
import Main from "../pages/main";
import Login from "../pages/login"; // 导入store
import SignUp from '../pages/signup'
const Routes = () => (
    <Switch>
        <Route path={"/signup"} component={SignUp}/>
        <Route path={"/main"} component={Main}/>
        <Route path={"/"} component={Login}/>
    </Switch>
)

export default Routes;

下图所示为左侧菜单栏,mui中没有可以直接用的菜单,需要自己写控件,官网有一级菜单的写法,稍作优化改成了二级菜单的样子

32973eb6e57979381625194c296ee304bbe.jpg

下图是数据展示的控件,可以直接使用第三方控件material-table

9ce0cd2c36d11b343984ad4db3d90dc3ac6.jpg

常用的模块权限的分配

0c4b44b5342118a261c1c28cc1f69423410.jpg

网络请求选用的是fetch,对fetch进行了简单的封装,结合mobx,控制整个框架的mvc结构模式

import "whatwg-fetch"
import commonStore from '../store/commonStore'
const API_ROOT = '';
const _req = (url,body,method)=>{
  fetch(url, {
    method: method,
    body: JSON.stringify(body),
    headers:{
      "Content-type":"application:/x-www-form-urlencoded:charset=UTF-8"
    },
  }).then(resp => {
    return resp;
  }).then((data) => {
    return data
  }).catch(error => {
    throw error;
  });
}
const requests = {
  get: url =>{
     return fetch(url, {
      method: 'GET',
    }).then((res) => {
          return res.json();
        })
        .then((data)=>{
          return JSON.stringify(data)
        })
        .catch((error)=>{
          throw error
        });
  },
  post: (url,body)=>{
     _req(API_ROOT+url,body,"POST")
  },
  delete:(url,body)=>{
    _req(API_ROOT+url,body,"DELETE")
  },
  put: (url,body)=>{
    _req(API_ROOT+url,body,"PUT")
  }
};

const Auth ={
  login:()=>{
     return requests.get("http://jsonplaceholder.typicode.com/posts").then((data)=>{
        return data;
    }).catch((e)=>{
      throw  e
     })
  },
  register:(username,email,password)=>{
    return requests.post("/register",{"username":username,"password":password,"email":email})
        .then((data)=>{
          return data;
        }).catch((e)=>{
          throw e;
        })
  }
}

export default {
  Auth
}

简单封装后在mobx中进行调用,

@action
setUser(){
      return agent.Auth.login().then((data)=>{
          return data;
      }).catch((e)=>{
          throw e;
    })
}

在ui中调用store再调用该方法

this.props.UserStore.setUser().then((data)=> {

    this.props.history.push('main/dashboard');
}).catch((error=>{
    alert("error"+error)
}));

附一份具体的链接地址

https://gitee.com/joycewu/reactjs_mobx_material-ui

转载于:https://my.oschina.net/u/588582/blog/3075429

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值