介绍

基于umi搭建一个快速开发框架,react 应用框架。umi 以路由为基础的,支持类 next.js 的约定式路由,以及各种进阶的路由功能,并以此进行功能扩展,比如支持路由级的按需加载。

我们会在基于umi的基础上,开发出一个框架通用功能和业务功能

框架功能列表

  • 全局layout
  • 权限管理
  • 封装列表增删改查
  • 国际化
  • 集成 g2 chart图表
  • 集成 socket.io
  • ....(后续补充)

业务功能

  • 用户管理
  • ....(后续补充)

创建项目

umi 提供了脚手架供我们快速创建项目。参考umi脚手架创建项目

包管理器我们推荐用yarn来替换npm,yarn在包安装速度上确实提升不少

1.在你的空目录下执行,

  1. yarn create umi
  2. 我们需要选择 antd,code splitting, dll, hard source

2.安装依赖

  1. yarn

3.启动本地开发

  1. yarn start

构建全局layout和菜单

umi规定 src/layouts 目录下存放我们全局layout组件, 在index.js中加入代码如下

  1. class BaseLayout extends React.Component {
  2. state = {
  3. collapsed: false,
  4. };
  5. onCollapse = (collapsed) => {
  6. console.log(collapsed);
  7. this.setState({ collapsed });
  8. }
  9. render() {
  10. return (
  11. <Layout style={{ minHeight: '100vh' }}>
  12. <Sider
  13. collapsible
  14. collapsed={this.state.collapsed}
  15. onCollapse={this.onCollapse}
  16. >
  17. <div className={styles.logo} />
  18. <MenuComponent />
  19. </Sider>
  20. <Layout>
  21. <Header style={{ background: '#fff', padding: 0 }} />
  22. <Content style={{ margin: '0 16px' }}>
  23. <Breadcrumb style={{ margin: '16px 0' }}>
  24. <Breadcrumb.Item>User</Breadcrumb.Item>
  25. <Breadcrumb.Item>Bill</Breadcrumb.Item>
  26. </Breadcrumb>
  27. <div style={{ padding: 24, background: '#fff', minHeight: 360 }}>
  28. {this.props.children}
  29. </div>
  30. </Content>
  31. <Footer style={{ textAlign: 'center' }}>
  32. Ant Design ©2018 Created by Ant UED
  33. </Footer>
  34. </Layout>
  35. </Layout>
  36. );
  37. }
  38. }
  39. export default BaseLayout;

layout 组件需要 MenuComponent,

在构建组件之前我们需要先mock菜单数据,umi支持mock,我们在mock文件下添加 auth.js

  1. const menu = [
  2. {
  3. id: 1,
  4. name: '概览',
  5. icon: 'dashboard',
  6. url: '/dashboard',
  7. },
  8. {
  9. id: 2,
  10. name: '系统管理',
  11. icon: 'setting',
  12. url: '/system',
  13. children: [
  14. {
  15. id: 21,
  16. name: '用户管理',
  17. icon: 'user',
  18. url: '/system/user',
  19. }
  20. ]
  21. },
  22. ];

menu数据是树形结构,在项目当中,可以构造放到前台,也可以让后台小伙伴们返回。比较灵活,我们基于数据去做渲染就行。

还有一个很重要的概念,umi也集成了dva,我们的src/models路径下添加auth.js的如下。

  1. import { getMenu } from '../services/auth';
  2. export default {
  3. namespace: 'auth',
  4. state: {
  5. menu: []
  6. },
  7. effects: {
  8. *getMenu(_, { put, select, call }) {
  9. const menu = yield call(getMenu);
  10. yield put({
  11. type: 'setMenu',
  12. payload: menu,
  13. });
  14. },
  15. },
  16. reducers: {
  17. setMenu(state, { payload }) {
  18. return {
  19. ...state,
  20. menu: payload,
  21. };
  22. },
  23. },
  24. };

基础工作已经完成。就可以来构建MenuComponent组件。

  1. @connect(({auth}) => {
  2. return {
  3. menu: auth.menu,
  4. }
  5. })
  6. class MenuComponent extends React.Component {
  7. componentDidMount() {
  8. // 获取 menu 数据
  9. this.props.dispatch({
  10. type: 'auth/getMenu',
  11. })
  12. }
  13. link = (url) => {
  14. router.push(url);
  15. }
  16. renderMenu = (data) => {
  17. return data && data.map(d => {
  18. if (d.children && d.children.length > 0) {
  19. return <SubMenu
  20. key={d.id}
  21. title={<span><Icon type={d.icon} /><span>{d.name}</span></span>}
  22. >
  23. {this.renderMenu(d.children)}
  24. </SubMenu>
  25. }
  26. return (
  27. <Menu.Item
  28. key={d.id}
  29. onClick={() => {this.link(d.url)}}
  30. >
  31. <Icon type={d.icon} />
  32. <span>{d.name}</span>
  33. </Menu.Item>
  34. )
  35. });
  36. }
  37. render() {
  38. const { menu } = this.props;
  39. return (
  40. <Menu theme='dark'
  41. defaultSelectedKeys={['1']}
  42. mode='inline'>
  43. {
  44. this.renderMenu(menu)
  45. }
  46. </Menu>
  47. );
  48. }
  49. }
  50. export default MenuComponent;

总的来说,menu组件会访问会调用saga effect,发出异步请求获取数据,然后通过dva connect获取menu数据做渲染。

我们刷新浏览器看到菜单已经正确渲染了。

结束语

这是开始的第一步,也欢迎大家监督,接下来会逐步把上面提到的功能完善起来。代码已放到github上,大家可以自行查看umi-react

我建了一个QQ群,大家加进来,可以一起交流。群号 787846148

对上面有些内容不理解的同学参考如下内容

*umi 官网

*dva 官网

01 基于umi搭建React快速开发框架的更多相关文章

  1. 02 基于umi搭建React快速开发框架(国际化)

    前言 之前写过一篇关于React的国际化文章,主要是用react-intl库,雅虎开源的.react-intl是用高阶组件包装一层来做国际化. 基于组件化会有一些问题,比如在一些工具方法中需要国际化, ...

  2. 03 基于umi搭建React快速开发框架(封装列表增删改查)

    前言 大家在做业务系统的时候,很多地方都是列表增删改查,做这些功能占据了大家很长时间,如果我们有类似的业务,半个小时就能做出一套那是不是很爽呢. 这样我们就可以有更多的时间学习一些新的东西.我们这套框 ...

  3. ABP开发框架前后端开发系列---(14)基于Winform的ABP快速开发框架

    前面介绍了很多ABP系列的文章,一步一步的把我们日常开发中涉及到的Web API服务构建.登录日志和操作审计日志.字典管理模块.省份城市的信息维护.权限管理模块中的组织机构.用户.角色.权限.菜单等内 ...

  4. Mario是一个基于.NETCore的简单快速开发框架

    Mario .NET Core简单快速开发框架 Mario是一个基于.NET Core的简单快速开发框架 GitHub:https://github.com/deeround/Mario 技术特点 基 ...

  5. SpringCloud微服务实战——搭建企业级开发框架(四十六):【移动开发】整合uni-app搭建移动端快速开发框架-环境搭建

      近年来uni-app发展势头迅猛,只要会vue.js,就可以开发一套代码,发布移动应用到iOS.Android.Web(响应式).以及各种小程序(微信/支付宝/百度/头条/飞书/QQ/快手/钉钉/ ...

  6. 基于SpringBoot+Mybatis+AntDesign快速开发平台,Jeecg-Boot 1.1 版本发布

    Jeecg-Boot 1.1 版本发布,初成长稳定版本 导读     平台首页UI升级,精美的首页支持多模式 提供4套代码生成器模板(支持单表.一对多) 集成Excel简易工具类,支持单表.一对多导入 ...

  7. Known快速开发框架

    Known是一个基于.NET开发的快速开发框架,前后端分离,使用极少的第三方组件,开发简单快速,大部分代码可通过代码生成工具自动生成,非常适合单兵作战和小团队开发.前端UI是一个基于JQuery开发的 ...

  8. Reactjs-generator-cli 一款基于Ink构建用于快速搭建React应用的CLI scaffolding工具

    Reactjs-generator-cli 一款基于Ink构建用于快速搭建React应用的CLI scaffolding工具 A simple CLI for scaffolding React.js ...

  9. 基于SpringBoot搭建应用开发框架(二) —— 登录认证

    零.前言 本文基于<基于SpringBoot搭建应用开发框架(一)——基础架构>,通过该文,熟悉了SpringBoot的用法,完成了应用框架底层的搭建. 在开始本文之前,底层这块已经有了很 ...

随机推荐

  1. Objective-C GCD深入理解

    GCD(Grand Central Dispatch),主要用于多线程编程.它屏蔽了繁琐的线程实现及管理细节,将其交由系统处理.开发者只需要定义任务block(在底层被封装成dispatch_cont ...

  2. C#的抽象类别

    抽象类,有3个特点: 第1个,不能被实例化. 第2个,类中的抽象方法在继承的子类中必须重写. 第3个,类一旦有抽象方法出现,那这个类必须定义为抽象类. 现实开发中,发现有共同的代码,可以把这些共同的代 ...

  3. [转][南京米联ZYNQ深入浅出]第二季更新完毕课程共计16节课

    [南京米联]ZYNQ第二季更新完毕课程共计16节课 [第二季ZYNQ]                                                                  ...

  4. pandas:解决groupby().apply()方法打印两次

    对于以下dataframe执行dataframe.groupby(['name', 'course']).apply(lambda x: test(x)) 操作 其中test(x)函数为: def t ...

  5. 事务,acid,cap,paxos随笔

    事务ACID四个特性: A:原子性(Atomicity)C:一致性(Consistency)I:隔离性(Isolation)D:持久性(Durability) 原子性:语句要么全执行,要么全不执行,是 ...

  6. BugkuCTF 域名解析

    前言 写了这么久的web题,算是把它基础部分都刷完了一遍,以下的几天将持续更新BugkuCTF WEB部分的题解,为了不影响阅读,所以每道题的题解都以单独一篇文章的形式发表,感谢大家一直以来的支持和理 ...

  7. Linux下FastDFS分布式存储-总结及部署记录

    一.分布式文件系统介绍分布式文件系统:Distributed file system, DFS,又叫做网络文件系统:Network File System.一种允许文件通过网络在多台主机上分享的文件系 ...

  8. PHP从入门到精通(四)

    PHP数组中的常用函数汇总 为了更直观的讲解各函数的作用和用法,方便大家的理解,首先,我们来定义一个数组.下面各函数的操作将以本数组为例: $arr = array(1,2,3,4,5,6," ...

  9. PHP使用echo输出标签设置CSS样式问题

    使用php是可以输出HTML标签的,这为页面设计带来很大方便. 在此记录php输出标签设置CSS样式的问题: echo可使用''.""或你不用引号,如果想要输出带CSS样式的HTM ...

  10. GuiHelloWorld

    package com.home.test; import java.awt.Color; import java.awt.Cursor; import java.awt.Font; import j ...