Umi + AntD Pro 项目搭建
一、Umi 介绍
umi 是可扩展的企业级前端应用框架,Umi 以路由为基础的,同时支持配置式路由和约定式路由,保证路由的功能完备,并以此进行功能扩展。
create-react-app 对比:
create-react-app 是基于 webpack 的打包层方案,包含 build、dev、lint 等,他在打包层把体验做到了极致,但是不包含路由,不是框架,也不支持配置。所以,如果大家想基于他修改部分配置,或者希望在打包层之外也做技术收敛时,就会遇到困难。与nextJs 对比:
next.js 是个很好的选择,Umi 很多功能是参考 next.js 做的。要说有哪些地方不如 Umi,我觉得可能是不够贴近业务,不够接地气。比如 antd、dva 的深度整合,比如国际化、权限、数据流、配置式路由、补丁方案、自动化 external 方面等等一线开发者才会遇到的问题。官网链接:https://umijs.org/zh-CN/docs
二、项目创建
- 创建一个空文件夹作为项目的根目录:/umi
- 在目录终端创建项目
1、yarn create @umijs/umi-app 2、npx @umijs/create-umi
- 下载安装包
1、yarn 2、npm install
- 启动项目
yarn start
项目启动成功界面
二、简单使用
umi创建后已经帮我们配置好了一些插件,其中最主要的是 @umijs/preset-react,它包含了很多插件
所以项目可以直接使用antd 组件
import styles from './index.less';
import { Pagination } from 'antd';export default function IndexPage() {return (<div><h1 className={styles.title}>Page index</h1><Pagination defaultCurrent={1} total={50} /></div>);
}
页面效果
三、项目结构
其中 public 与 config 为新建文件,用来存放静态文件及 核心配置
四、修改配置目录
五、配置路由
- 简单路由
export default [{ path: '/',component: '@/pages/index'},{ path: '/hello',component: '@/pages/hello' // 也可以写作 'hello' 相对路径,会在 src/page 下找} ]
- 嵌套路由
export default [{ path: '/',component: '@/pages/index'},{ path: '/hello',component: '@/pages/hello' // 也可以写作 'hello' 相对路径,会在 src/page 下找},{path: '/user',routes: [{path: '/user/add',component: '@/pages/user/add'}]} ]
- 公共模版
创建公共页头和页脚 header footer 模块
在pages 同级创建 components/Header/index.tsx 文件import React from 'react';const Header = (props: any) => {return (<div><h3>主页/菜单项</h3>{props.children}</div>); };export default Header;
路由部分引入模版组件
export default [{ path: '/',component: '@/pages/index'},{ path: '/hello',component: '@/pages/hello' // 也可以写作 'hello' 相对路径,会在 src/page 下找},{path: '/user',component: '@/components/Header',routes: [{path: '/user/login',component: '@/pages/user/login'},{path: '/user/quit',component: '@/pages/user/quit'}]} ]
六、跳转方法
- 声明式跳转 <link to=""> 为 umi 自带的声明式跳转路由方法
import React from 'react'; import { Link } from 'umi'const Header = (props: any) => {return (<div><h3>主页/菜单项</h3><Link to='/user/login'>登录</Link>/<Link to='/user/quit'>退出</Link>{props.children}</div>); };export default Header;
- <NavLink to=""> 专门用于导航栏,点击导航栏时,标签会默认添加 active class类,可以通过此类添加样式
- 命令式跳转 (使用 umi 的 history 函数)
import React from 'react'; import { NavLink, history} from 'umi' import './index.less' import { Space, Button } from 'antd'const Header = (props: any) => {const gotoLogin = () => {history.push('/user/login')}const gotoQuit = () => {history.push('/user/quit')}return (<div><h3>主页/菜单项</h3>{/* <NavLink to='/user/login'>登录</NavLink>/<NavLink to='/user/quit'>退出</NavLink> */}<Space><Button onClick={gotoLogin}>去登陆</Button><Button onClick={gotoQuit}>退出</Button></Space>{props.children}</div>); };export default Header;
七、mock 数据与接口请求
- mock 在umi 中是默认启动的,用来模拟api 数据
- 添加 mock 文件,只要在 外层 mock 目录中的文件 都会被拆解成 mock 文件 ,新建文件mock/mock.ts
export default {'GET /mock/list': [{id: 1,name: '张三'},{id: 1,name: '李四'}] }
// 同步请求 const mockTest = () => {request('/mock/list').then(res => {console.log(res)}) }// 异步请求 const mockTest = async () => {const res = await request('/mock/list')console.log(res) }
MockJs 工具使用, 可以通过代码随机生成数据
引入 Mockjs 包yarn add mockjs
import mockjs from 'mockjs'export default {'GET /mock/citys': mockjs.mock({'list|100': [{name: '@city', 'value|1-100': 50, 'type|0-2': 1}]}) }
八、Dva的使用
- dva 其实就是个管理数据流的框架,可以更好的在组件之间共用数据,避免了层层 props 传参,也就是dva 是一个数据管理中心
- 符合以下规则的被认为是一个model 数据站
(1)src/models 下的文件
(2)src/pages 下,子目录中 models 目录下的文件
(3)src/pages 下,所有的 model.ts 文件(不区分大小写) - Model 的结构
在src 目录下创建一个 models 文件夹,内部创建一个 msg.ts 文件,结构如下export default {namespace: "dva", // 命名空间,确保唯一state: {}, // 存放数据effects: {}, // 接口调用 -- 请求数据reducers: {} // 更新状态 -- 修改数据}
通过指令识别 是否创建成功: umi dva list model
namespace:当前model的命名空间,同时也是全局 state 上的一个属性
state:数据初始值
effects:effect 要点如下(难点)
(1)处理异步操作
(2)需要通过 put 调用 reducers 更新 state
(3)只能是 generator 函数,有 action 和 effects 两个参数。其中 effects 包含put、 call、 sellect 三个字段,put 用于触发 action, call 用于异步处理逻辑 - dva 连接, 在 pages 下创建一个 msg.tsx 文件
import React from 'react'; import {connect} from 'umi'const Msg = () => {return (<div><h1>Dva 测试</h1></div>) }export default connect(({msg}) => ({msg}))(Msg)
connect 的作用是 将数据绑定到组件上
- dva 数据使用步骤
(1)src 目录下创建 services/api.ts 文件import { request } from 'umi'export async function getCitys() {return request('/mock/citys') }
(2) models/msg.ts dva 文件调用上面接口保存数据
import { getCitys } from '@/services/api'export default {namespace: "msg", // 命名空间,确保唯一state: {cityList: [],}, // 存放数据effects: { // 接口调用 -- 请求数据//payload 获取组件中参数,例如表单提交获得到的数据//callback 回调函数,例如提交成功后跳出一个提示框//put 触发action//call 访问外部方法,获取外部数据 call(方法,方法传参)* queryCityList({payload, callback}, {put, call}) {//获取tags数据,yield实现异步const res = yield call(getCitys)//调用reducers,更新stateyield put({type: 'setCityList', // 类似于 redux 中 action 的 typepayload: res})}}, // 是一个纯函数,用于处理同步操作,是唯一可以修改 state 的地方,由 action 触发,有 state 和 action 两个参数reducers: { // 更新状态 -- 修改数据setCityList(state, action) {return {...state, cityList: action.payload}}} }
(3)页面内部使用dva
import React from 'react'; import {connect} from 'umi' import { Button } from 'antd'const Msg = (props: any) => {const {dispatch} = props;const list = props.msg.cityList.list || []const getData = () => {// 使用 model 获取数据dispatch({type: 'msg/queryCityList',payload: null})}return (<div><h1>Dva 测试</h1><Button onClick={getData}>获取列表数据</Button><table><tr><th>城市名</th><th>数量</th><th>城市类型</th></tr>{list.map((item, index) => {return <tr key={index}><td>{item.name}</td><td>{item.value}</td><td>{item.type}</td></tr>})}</table></div>) }export default connect(({msg}) => ({msg}))(Msg)
因为 export default connect(({msg})=>({msg}))(Msg); 把数据都传到了Msg里面的props.msg, 通过其中的 dispatch 发送action获取我们的数据,通过 type: 'msg/queryCityList' 调用 effect 中的 generator 函数
Umi + AntD Pro 项目搭建相关推荐
- react + antd pro 项目搭建及发布流程
#antd Pro 项目环境搭建 ##一.搭建项目 参考网址:https://pro.ant.design/docs/deploy-cn ###1.安装 从 GitHub 仓库中直接安装最新的脚手架代 ...
- umi+antd+dva项目搭建
记录项目搭建的大致流程,详细的可以查看 Ant Design 实战教程(beta 版),或者Umi文档及Dva文档 1. 项目初始化 全局安装umi yarn global add umi 新建项目文 ...
- Antd Pro项目接入qiankun微前端
在开始之前,请先提前了解微前端相关概念 场景: antd pro项目中接入qiankun,抽离其中某个模块作为子应用 一.项目技术 Ant Design Pro UmiJS webpack ts 其他 ...
- antd pro项目中 antd Upload组件 基于 lrz 在上传前做图片压缩
lrz npm和参数文档可供参考 import { Upload,Button} from 'antd'; import lrz from 'lrz';//处理函数 function compress ...
- Error: Module “xxx“ does not exist in container. / antd pro v5启用qiankun报错 / 同时使用mfsu和qiankun报错
一.问题描述 我们用antd pro v5搭建前端项目,启用qiankun微前端模式,终端报错如下: Uncaught (in promise) Error: Module "xxx&quo ...
- antd.pro中表格的国际化处理
antd.pro最近更新额V5版本,于是使用了最新的版本.V5版本抛弃了dva的数据流配置方式(狗头:原因就是配置太繁琐了,你要为每个module配置module文件,并且使用generator的方式 ...
- antd pro学习入门笔记+todolist实例
AntD Pro零散笔记 antd pro 4.0是一个集成了前后端服务.mock模拟接口.dva容器.typescript.less的一个解决方案,有助于快速的二次开发(不过感觉脚手架真的很大) 文 ...
- antd pro(V5) 实现多tab
官方默认不支持多tab,所以需要自己去处理根据以往的经验这个不是很复杂. 主要的技术点如下: 1.样式(抄的vue-element-admin) 2.antd pro项目干预点app.tsx impo ...
- Antd Pro食用笔记(一)——基本使用
Antd Pro官方文档地址: Antd Pro 文档 此篇涉及到的配套技术文档: ProLayout UmiJS 一.初始化一个antd pro项目(官网步骤) 1.1 安装 官网的安装步骤: 新建 ...
最新文章
- python错误解决方案之关于报urllib2.HTTPError: HTTP Error 401: Unauthorized错误问题
- 30分钟用Restful ABAP Programming模型开发一个支持增删改查的Fiori应用
- BZOJ3434 [Wc2014]时空穿梭
- 一种基于AliOS Things的uData感知设备软件框架
- tfidf关键词提取_基于TextRank提取关键词、关键短语、摘要,文章排序
- 爬虫-05-http常见的请求方式与状态码
- su、sudo、sudo su、sudo -i的用法和区别
- SVO: Fast Semi-Direct Monocular Visual Odometry
- 部署Lync监控报告
- 一天一个小技巧(5)——CSDN编译器的图片位置、大小调节
- Linux下输入法切换快捷键设置
- Java cms 孔浩老师 完整视频加源码 共131集 百度网盘永久链接 无需密码解压
- GB28181 PTZCmd控制指令笔记
- Java 垃圾回收机制(GC)简述
- linux系统开启端口命令
- 在百度实习的100天
- 穿孔发光字/外露发光字制作流程步骤
- 为wpf中的DataGrid控件添加鼠标单击事件
- Wmware虚拟机装黑苹果时,镜像格式转换的方法
- Android 呼吸灯流程分析(一)
热门文章
- 云服务器的开始配置连接数据库的安装步骤
- CC00019.python——|HadoopPython.v19|——|Arithmetic.v19|语法:进阶函数.V1|
- 基于PaddleGAN精准唇形合成模型实现光棍节美女表白视频
- 【TOTP】TOTP算法(基于时间的一次性动态密码)原理介绍 简要逻辑实现说明
- 华为机试——小球落地
- IE、FF、Chrome浏览器中的JS差异介绍
- Raspberry Pi Zero 单板配置手记(三)使用 NetworkManager 管理网络连接
- 极米科技的高光与暗影
- android plurals用法(单复数)
- flex解决微信小程序ScrollView等组件高度自适应