UmiJS基础+UmiUI安装使用+Mock使用示例+DvaJS案例

2023-11-07


title: UmiJS基础
date: 2022-09-12 19:20:27
tags:

  • React
  • 框架
  • UmiJS
    categories:
  • 框架

UmiJS

介绍

官方文档

  • 可扩展

    Umi 实现了完整的生命周期,并使其插件化,Umi 内部功能也全由插件完成。此外还支持插件和插件集,以满足功能和垂直域的分层需求。

  • 开箱即用

    Umi 内置了路由、构建、部署、测试等,仅需一个依赖即可上手开发。并且还提供针对 React 的集成插件集,内涵丰富的功能,可满足日常 80% 的开发需求。

  • 企业级

    经蚂蚁内部 3000+ 项目以及阿里、优酷、网易、飞猪、口碑等公司项目的验证,值得信赖。

  • 大量自研

    包含微前端、组件打包、文档工具、请求库、hooks 库、数据流等,满足日常项目的周边需求。

  • 完备路由

    同时支持配置式路由和约定式路由,同时保持功能的完备性,比如动态路由、嵌套路由、权限路由等等。

  • 面向未来

    在满足需求的同时,我们也不会停止对新技术的探索。比如 modern mode、webpack@5、自动化 external、bundler less 等等。

快速上手

安装

创建空目录

kdir myapp && cd myapp

使用官方提供脚手架

yarn create @umijs/umi-app

安装依赖

yarn start

img

部署发布-----打包好的文件生成在dist文件下

yarn build

项目目录

image-20220912192655885

- .editorconfig     // 对编辑器的默认配置
- .gitignore        // git忽略文件配置
- .prettierignore   // 代码格式化忽略的文件
- .prettierrc       // 代码格式化的配置
- .umirc.ts         // umijs核心配置文件
- package.json      // 依赖管理
- README.md         // 项目介绍
- tsconfig.json     // ts配置文件
- typings.d.ts      // ts类型文件

配置

Umi 在 .umirc.tsconfig/config.ts 中配置项目和插件,支持 es6。一份常见的配置如下官方配置文档

export default {
  base: '/docs/',
  publicPath: '/static/',
  hash: true,
  history: {
    type: 'hash',
  },
}

路由配置

  routes: [
    {
      path: '/',
      component:'@/pages/index', // 路由模板
      title:'首页'
    },
    {
      path:'/list',
      redirect:'user/one' // 重定向
    },
    {
      path:'/user',
      component:'@/layouts/index', // 公共路由模板,子路由也会在其中通过{props.children}
      routes:[
        {path:'/user/one',component:'@/pages/index'},
        {path:'/user/two',component:'@/pages/user'}
      ]
    }
  ],
// jsx部分,公共路由模板,存放进layouts文件下
 return (
    <div>
      <h1>Header</h1>
        {props.children}
      <h1>Footer</h1>
    </div>
  )

拦截

路由跳转可以进行拦截操作,当要跳转的时候拦截跳转至另一个组件

{
  path:'/user',
  component:'@/layouts/index', // 公共路由模板,子路由也会在其中通过{props.children}
  wrappers:[
    '@/wrappers/auth' // 拦截路由
  ],
  routes:[
    {path:'/user/one',component:'@/pages/index'},
    {path:'/user/two',component:'@/pages/user'}
  ]
}
// wrappers/auth.jsx

import React from 'react';
import { Redirect } from 'umi';

const auth = (props:any) => {
  const isLoadin = false;
  if (isLoadin) { // 这部分功能可以实现当登陆状态为false强制跳转到首页
      return <div>{props.children}</div>
  }else{
      return <Redirect to="/"/>
  }
}

export default auth

未知路径

当路径查找不到,可以设置默认路径

  routes: [
    {
      path: '/',
      component:'@/pages/index', // 路由模板
      title:'首页'
    },

    {
      path:'/list',
      redirect:'user/one' // 重定向
    },

    {
      path:'/user',
      component:'@/layouts/index', // 公共路由模板,子路由也会在其中通过{props.children}
      wrappers:[
        '@/wrappers/auth'
      ],
      routes:[
        {path:'/user/one',component:'@/pages/index'},
        {path:'/user/two',component:'@/pages/user'},
        {component:'@/pages/404'} // 当查找不到上方路径的时候,页面就会跳转到该组件路径
      ]
    },
    {component:'@/pages/404'}// 当查找不到上方路径的时候,页面就会跳转到该组件路径
  ],

传递参数

 { path:'/user/one/:id?',component:'@/pages/index' },

以上都是配置式路由,而如果没有routes配置,则自动进入约定式路由,跟Next的page路由规则类似。src下的文件目录就是路由表,

Mock数据

新建文件mock/index.ts

export default {
    // 请求+路径
    'GET /api/index':{
        id:1,
        name:'Tom',
        age:12
    },
    'GET /api/person':{
        id:2,
        name:'LiLi',
        age:22
    },
}

获取数据

// 点击触发的函数
const getData = async()=>{
    // 请求数据
    // 1.写法一
    // request('/api/index').then(res=>{
    //   console.log(res);
    // })
    // 2.写法二
    const data = await request('/api/person');
    console.log(data); 
  }

Mockjs使用

官方文档:Mockjs文档

import mockjs from 'mockjs'; // 引入第三方库mockjs

export default {
    'GET /api/index':{
        id:1,
        name:'Tom',
        age:12
    },
    'GET /api/person':{
        id:2,
        name:'LiLi',
        age:22
    },
    'GET /api/tags':mockjs.mock({
        'list|100': [{ name: '@city', 'value|1-100': 50, 'type|0-2': 1 }],
    })
}

关闭Mock

  1. 打开文件\Umijs\.umirc.ts,修改配置文件:
import { defineConfig } from 'umi';

export default defineConfig({
  ...
    
  mock:false,  // 关闭mock
   
  ...
});

  1. 使用环境变量方式关闭
  "scripts": {
    ...
    "start:nomock":"MOCK=none umi dev",
    ...
  },

配合DvaJS

官网

新建\pages\dva.tsx组件

// 1.创建一个UI组件
// 2.创建 model
// 3.将UI组件和model进行链接

import React from 'react';

import { connect } from 'umi';
import { Button } from 'antd';

const dva = (props) => {
  console.log(props);
  const {dispatch} = props;
  const getData = ()=>{
    // 使用model更新获取数据
    dispatch({
        type:'tags/fetchTags',  // model的命名空间 / 方法
        payload:null
    })
  }
  return (
    <div>
      <h1>Dva组件</h1>
      <Button onClick={getData}>获取列表数据</Button>
    </div>
  )
}

export default connect(( {tags} )=>({tags}))(dva);

新建\src\models\tags.ts文件

import { request } from "umi"
// 获取标签数据
const getTags = ()=>{
    return request('/api/tags')
}

export default {
    // 效用model的时候,通过命名空间调用,不要和其他model同名
    namespace: 'tags',
    // 状态,跟react中的state类似,和redux中保存的state一样
    state: {
        tagsList:[]
    },
    // 调用服务端接口,获取数据
    effects: {
        // payload:UI调用model传递的参数
        // callback:回调函数,执行其他操作就可以使用这个回调函数
        // put:将数据传递给reducers
        // call:访问外部的方法
        *fetchTags({payload,callback},{put,call}){
            // 获取tags数据
            const response = yield call(getTags)

            // 调用reducers,传递数据
            yield put({
                type:'setTagList', // 类似于redux中action的type
                payload:response
            })
        }
    },
    // 更新 state
    reducers: {
        setTagList(state,action){
            return {...state,tagsList:action.payload}
        }
    },
}

运行时配置

runtime-config 和 config 之间的区别在于执行时间,runtime-config 是在您的应用程序在浏览器中运行时评估的。因此,function可以使用jsximport和其他浏览器可运行的片段。

新建文件src/app.tsx

代码示例(不代表所有功能):

import {history} from 'umi';
// 定义额外路由变量
let extraRoutes;

// 动态添加路由
export function patchRoutes({ routes, routeComponents }) {
    console.log('patchRoutes', routes, routeComponents);
    routes.unshift({
        path:'/foo',
        component:require('@/pages/user1').default
    })

    // 合并服务端返回的路由
    extraRoutes.map(item=>{
        routes.unshift({
            path:item.path,
            component:require(`@/pages${item.component}`).default
        })
    })
}

// 复写 render 会在patchRoutes之前执行
export function render(oldRender) {
    // 模拟从服务端请求获得的 路由

    extraRoutes = [
        {
            path:'/server',
            component:'/user2'
        }
    ]

    // 在渲染之前 进行权限校验
    const isLoading = true; // 模拟 登录/未登录 状态
    if(!isLoading){
        history.push('/login')
    }
    oldRender();
    
}

// 在初始加载和路由切换时做一些事情,在patchRoutes之后执行
export function onRouteChange({ location, clientRoutes, routes, action }) {
    console.log(location,'01');
    console.log(clientRoutes,'02');
    console.log(routes,'03');
    console.log(action,'04');
    // console.log(location.pathname);
    
  }

使用Umi UI

安装:

yarn add @umijs/preset-ui -D

启动:

yarn start

image-20220919223546391

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UmiJS基础+UmiUI安装使用+Mock使用示例+DvaJS案例 的相关文章

随机推荐

  • ajax请求和普通请求的区别

    当浏览器按照window location href index html 进行定期请求时 会清除当前窗口并将服务器响应加载到窗口中 使用ajax请求 当前窗口 文档不受影响 JavaScript代码可以检查请求的结果 并使用这些结果执行所
  • 一些黑科技接口钩子 钉钉,禅道,gitlab,jenkins等

    日常工作中需要做流程的串联 这个时候就需要掌握一些黑科技接口 这些接口甚至是官方文档上并没有提供的 但是我们确实可以使用 进行内部工具开发的一定要记得提供钩子 没有钩子 做不了朋友 钉钉相关 钉钉群中的自定义机器人 curl https o
  • C/C++在线编译器

    一直以来都喜欢用手机看书 尤其是在上班时 看的最多的是编程一类的书 主要是C 看着就想写写代码 可是电脑用不能用 怎么办 于是想到用UC浏览器找找看网上有没有在线的编译器 想什么时候写代码都可以验证 于是就找了几个 各有千秋吧 中文的我没找
  • 在地址栏中输入一段内容,接下来都发生了些什么

    用户发出 URL 请求到页面开始解析的这个过程 就叫做导航 用以定位到新资源 并且将老的资源从页面卸载 一 用户输入 地址栏首先判断输入的内容是搜索内容还是符合url规则的url 如果是搜索内容的话 浏览器会拼接上该搜索内容形成一个新的ur
  • mybatis-plus

    mybatis plus的sql拼接规则 实体对象参数属性有值 那么该属性名会拼接sql语句中 实体对象参数属性为基本属性时 会有默认值 mybatis plus认为是有值 参与sql拼接 mybatis plus与mybatis的对比 m
  • 3d指向检测 ros_3d_pointing_detection

    Introduction The workflow of this project is Detect 2D human joints from color image by Openpose Compute 3D human joints
  • stopPropagation, preventDefault 和 return false 的区别

    http blog csdn net bkq421511585 article details 14166789
  • 使用Docker拉起ES容器和Kibana容器并设置密码Demo

    1 准备条件 安装好docker 在同一台服务器上安装es和kibana 安装docker命令参考 可以按顺序执行如下命令安装 1 sudo yum install y yum utils 2 sudo yum config manager
  • 做擦边网站 服务器放在狗爹,在GoDaddy搭建Prosper202服务器

    记录一下我在GoDaddy搭建Prosper202服务器的过程 1 首先 我购买的是Liunx Deluxe共享虚拟主机 狗爹这个类型的产品可以建多个网站 我有一个域名 www网站已经上线 虽然还没有什么内容 2 为你的Prosper202
  • add_library使用 $<TARGET_OBJECTS:name>

    一 背景 前面介绍了add library的两种格式 今天分享一个实例 Cmake分别生成静态链接库 OBJ链接库 并使用
  • 人人商城小程序消息服务器配置,人人商城小程序订阅消息设置方法和几个坑!...

    操作步骤 第一步 开通订阅消息功能 登录微信小程序官网后台 mp weixin qq com 开通订阅消息 第二步 服务类目 新增 商家自营 gt 服装 鞋 箱包 第三步 添加订阅消息 4个 订阅消息 公共模板库 搜索 订单支付成功通知 编
  • Android仿小米商城底部导航栏(基于BottomNavigationBar)

    简介 现在大多数App都会用到底部导航栏 比如QQ 微信和购物App等等 有了底部导航栏 用户可以随时切换界面 查看不同的内容 Android底部导航栏的实现方式特别多 例如TabHost TabLayout 或者TextView等 都可以
  • 机器学习-支持向量机算法实现与实例程序

    一 SMO算法基础 支持向量就是离分隔超平面最近的那些点 分隔超平面是将数据集分开来的决策边界 支持向量机将向量映射到一个更高维的空间里 在这个空间里建立有一个最大间隔超平面 在分开数据的超平面的两边建有两个互相平行的超平面 建立方向合适的
  • 剑指offer总结

    时间复杂度一般比空间复杂度更重要 因为改进时间对算法的要求更高 是空间换时间 还是时间换空间 一般要看具体的应用 对于普通的应用 一般是空间换时间 因为普通用户更关心速度 而且一般有足够的存储空间允许这样操作 对于嵌入式的软件 一般我们会用
  • 简说C++学习-第一章C++语言概述

    简说C 学习 第一章C 语言概述 1 C 语言的发展 1972年 贝尔实验室在B语言的基础上 做了进一步的充实和完善 设计出了C语言 C语言的优点 语言简洁 使用灵活 方便 具有丰富的运算符和数据类型 可以进行低级操作 适合开发系统软件 程
  • Java jdbc实现多表查询

    数据库中的一张表对应Java中的一个类 我这里示例的是学生类 老师类 成绩类 还有一个用于存储多表查询结果后的SelectAll类 public class Student 学生表 private Integer id 学生编号 priva
  • sublime text 3下载与安装详细教程

    一 下载 打开官网下载链接http www sublimetext com 3 下载Sublime Text 3 portable version 下载下来为 Sublime Text Build 3083 x64 zip 编辑器的包 解压
  • Linux 中统计指定目录下同一类文件总的大小

    root PC1 test ls a map a ped a txt b ped b txt root PC1 test ll h total 1 4G rw r r 1 root root 200M Dec 1 19 42 a map r
  • Tensorflow-2-Tensorboard使用

    一 概述 机器学习如此复杂 训练模型的时候 摸不清背后到底是如何运行的 自己设置的参数和关键变量 如果能看到在训练时的变化情况 可以为后面的参数调优阶段提供很大的便利 Tensorboard就是这样一个工具 它刻意将模型抽象成图像 tens
  • UmiJS基础+UmiUI安装使用+Mock使用示例+DvaJS案例

    title UmiJS基础 date 2022 09 12 19 20 27 tags React 框架 UmiJS categories 框架 UmiJS 介绍 官方文档 可扩展 Umi 实现了完整的生命周期 并使其插件化 Umi 内部功