首页 > 其他分享 >UmiJS3基础

UmiJS3基础

时间:2024-09-13 19:19:57浏览次数:12  
标签:基础 Component js react export UmiJS3 import umi

UmiJS3基础

https://umijs.org/

UmiJS

  • UmiJS 是一个类 Next.JS 的 react 开发框架。
  • 他基于一个约定,即 pages 目录下的文件即路由,而文件则导出 react 组件
  • 然后打通从源码到产物的每个阶段,并配以完善的插件体系,让我们能把 umi 的产物部署到各种场景里。

image-20240908200729800

安装

$ cnpm install -g umi
$ yarn global add umi
$ umi -v
[email protected]
$ yarn global bin
$ npm root -g

目录约定

.
├── dist/                          // 默认的 build 输出目录
├── mock/                          // mock 文件所在目录,基于 express
├── config/
    ├── config.js                  // umi 配置,同 .umirc.js,二选一
└── src/                           // 源码目录,可选
    ├── layouts/index.js           // 全局布局
    ├── pages/                     // 页面目录,里面的文件即路由
        ├── .umi/                  // dev 临时目录,需添加到 .gitignore
        ├── .umi-production/       // build 临时目录,会自动删除
        ├── document.ejs           // HTML 模板
        ├── 404.js                 // 404 页面
        ├── page1.js               // 页面 1,任意命名,导出 react 组件
        ├── page1.test.js          // 用例文件,umi test 会匹配所有 .test.js 和 .e2e.js 结尾的文件
        └── page2.js               // 页面 2,任意命名
    ├── global.css                 // 约定的全局样式文件,自动引入,也可以用 global.less
    ├── global.js                  // 可以在这里加入 polyfill
├── .umirc.js                      // umi 配置,同 config/config.js,二选一
├── .env                           // 环境变量
└── package.json

新建项目

新建项目目录

mkdir hs-umi
cd hs-umi
cnpm init -y

新建pages目录

mkdir src/pages

新建页面

Home组件
umi g page index

pages\index.js

import React, { Component } from 'react'
import { Link } from 'umi';
import styles from './index.css';
export default class componentName extends Component {
  render() {
    return (
      <div>
        <h1 className={styles.title}>首页</h1>
        <Link to="/profile">个人中心</Link>
      </div>
    )
  }
}
用户管理
// 用命令创建user页面
umi g page user
import React from 'react';
import styles from './user.css';

export default () => {
  return (
    <div>
      <h1 className={styles.title}>Page user</h1>
    </div>
  );
}
个人中心
umi g page profile

pages\profile.js

import React, { Component } from 'react'
import { history } from 'umi';
import styles from './profile.css';
export default class componentName extends Component {
  render() {
    return (
      <div>
        <h1 className={styles.title}>个人中心</h1>
        <button onClick={()=>history.goBack()}>返回</button>
      </div>
    )
  }
}
启动服务器
启动配置
  "scripts": {
    "dev": "umi dev",
    "build": "umi build"
  }
启动项目
npm run dev
部署发布
  • npm run build
    

全局 layout

  • 约定 src/layouts/index.js 为全局路由,返回一个 React 组件,通过 props.children 渲染子组件

src/layouts/index.js

import React,{Component} from 'react';
import {Link} from 'umi';
export default class Layout extends Component{
    render() {
        return (
            <div>
                <ul>
          <li><Link to="/" >首页</Link></li>
          <li><Link to="/user">用户管理</Link></li>
                    <li><Link to="/profile">个人设置</Link></li>
                </ul>
                <div>
            {this.props.children}
                </div>
            </div>
        )
    }
}

用户管理

嵌套路由

  • umi 里约定目录下有 _layout.js 时会生成嵌套路由,以 _layout.js 为该目录的 layout pages/user/_layout.js
import React,{Component,Fragment} from 'react';
import {Link} from 'umi';
export default class User extends Component{
    render() {
        return (
            <div >
                <ul>
                    <li><Link to="/user/list">用户列表</Link></li>
                    <li><Link to="/user/add">新增用户</Link></li>
                </ul>
                <div>
                    {this.props.children}
                </div>
            </div>
        )
    }
}

user/list.js

/pages/user/list.js

import React,{Component,Fragment} from 'react';
import {Link} from 'umi';
export default class List extends Component{
    render() {
        return (
            <ul>
        <li><Link to="/user/detail/1">张三</Link></li>
        <li><Link to="/user/detail/2">李四</Link></li>
            </ul>
        )
    }
}

pages/user/add.js

pages/user/add.js

import React,{Component} from 'react';
export default class Add extends Component{
    render() {
        return (
            <form >
                 <input/>
         <input type="submit" />
            </form>
        )
    }
}

动态路由

  • 约定 [] 包裹的文件或文件夹为动态路由

src\pages\user\detail[id].js

import React,{Component} from 'react';
export default class  extends Component{
    render() {
        console.log(this.props);
        return (
            <table>
                <thead>
                    <tr>
                        <td>字段</td>
                        <td>值</td>
                    </tr>
                </thead>
                <tbody>
                    <tr>
                        <td>1</td>
                        <td>张三</td>
                    </tr>
                </tbody>
            </table>
        )
    }
}

权限路由

  • 通过指定高阶组件 wrappers 达成效果
  • 页面放在wrappers目录下面

profile.js

import React, { Component } from 'react'
import { history } from 'umi';
import styles from './profile.css';
class Profile extends Component {
  render() {
    return (
      <div>
        <h1 className={styles.title}>个人中心</h1>
        <button onClick={()=>history.goBack()}>返回</button>
      </div>
    )
  }
}

+Profile.wrappers = ['@/wrappers/auth']
+export default Profile;

auth.js

src\wrappers\auth.js

import { Redirect } from 'umi';

export default (props) => {
  const isLogin = localStorage.getItem('isLogin');
  if (isLogin) {
    return <div>{ props.children }</div>;
  } else {
    return <Redirect to={{pathname:"/login",state:{from:'/profile'}}} />;
  }
}

pages/login.js

pages/login.js

import React from 'react';
import styles from './login.css';
import { history } from 'umi';
export default (props) => {
  return (
    <div>
      <h1 className={styles.title}>Page login</h1>
      <button onClick={()=>{
        localStorage.setItem('isLogin','true');
        if(props.location.state&&props.location.state.from){
          history.push(props.location.state.from);
        }
      }}>登录</button>
    </div>
  );
}

动态路由

前台运行时

src\app.js

export function patchRoutes({ routes }) {
    routes.unshift({
        path: '/foo',
        exact: true,
        component: require('./Foo').default,
    });
}

src\Foo.js

import React, { Component } from 'react'
export default class componentName extends Component {
  render() {
    return (
      <div>
      Foo
      </div>
    )
  }
}

接口返回

src\app.js

let extraRoutes;
export  function modifyClientRenderOpts(memo) {
    memo.routes.unshift(...extraRoutes);
    return memo;
}
export function render(oldRender) {
    fetch('/api/routes').then(res => res.json()).then((res) => { 
        extraRoutes = res.map(item=>{
            let component = item.component;
            component = require(`./components/${component}`).default;
            return { ...item, component};
        });
        oldRender();
    })
}

mock\routes.js

export default {
    'GET /api/routes': [
        {
            path:'/foo',
            component:'Foo.js'
        }
    ]
}

标签:基础,Component,js,react,export,UmiJS3,import,umi
From: https://blog.csdn.net/qq_40588441/article/details/142218369

相关文章

  • Web安全入门到精通(完全0基础)持续更新
    Web安全大纲目录Web安全大纲前言一、Web安全基础1.计算机网络基础前言       亲爱的小伙伴,很高兴在这个CSDN平台上与你相遇,在这里,兔兔我呀为大家准备一个简单易懂的Web安全教程,让即使是零基础的朋友也可以轻松掌握喔。       之所以写这......
  • 数据库设计基础
    数据库的三级模式是指数据库系统中数据的三个不同层次的抽象模型,主要包括:内部模式:这是数据库的物理存储结构,描述了数据在存储介质上的具体存储方式。它包括数据的存储格式、数据的压缩和加密方式、索引的使用等。内部模式是数据库的最底层,通常由数据库管理系统负责管理。概念模......
  • 2024Mysql And Redis基础与进阶操作系列(7)作者——LJS[含MySQL 聚合、数学、字符创、日
    目录MySQL函数1.聚合函数 格式补充 示例将所有员工的名字合并成一行指定分隔符合并指定排序方式和分隔符2.数学函数(即用即查,重在融会贯通与运用)3.字符串函数(即用即查,重在融会贯通与运用)4.日期函数(即用即查,重在融会贯通与运用)5.控制流函数(即用即查,重在融会贯通与运用)if逻辑判......
  • MongoDB与Pymongo深度实践:从基础概念到无限级评论应用示例
    文章目录前言一、MongoDB1.基本介绍2.概念解析3.常见的数据类型4.Docker安装5.常用命令二、Pymongo1.基本操作(连接、数据库、集合)2.基本操作(增删改查)三、MongoDB应用示例:无限级评论1.MongoDB工具类2.实现无限级评论逻辑3.Vue树形结构展示无限级评论前言  ......
  • 2024Mysql And Redis基础与进阶操作系列(1)作者——LJS[含MySQL的下载、安装、配置详解
    目录1.数据库与数据库管理系统1.1数据库的相关概念1.2数据库与数据库管理系统的关系 1.3 常见的数据库简介Oracle1. 核心功能2. 架构和组件3. 数据存储和管理4. 高可用性和性能优化5. 安全性6. 版本和产品7. 工具和接口 SQLServer1. 核心功能2. 架构和组件3. 数据......
  • 第一章 网页制作的基础知识
    1.1认识网页和网站1.1.1网页、网站网页和网站(Web站点)的区别:网页是一页两页,网站是可跳转,多网页,网页和网站不是总分关系,网页只是网站的基本信息单位,超链接将站点中的一个或多个网页连接成为一个便于浏览的有机整体。eg.网站除了网页还有其他东西,如:服务器、域名...常用术语......
  • java基础之继承
     1.一个子类只能有一个直接父类(一个父类可以多个子类)2.private修饰符和void不能继承、不同包不能继承代码如下: 父类packagebegan;//定义一个父类publicclassPet01{//属性publicStringname;//方法publicvoidrun(Stringname){Sy......
  • matlab基础之脚本与函数
    脚本与函数MATLAB命令的两种执行方式:交互式命令执行方式程序执行要充分利用MATLAB数据结构的特点(矩阵运算、矢量化编程),充分利用MATLAB自带的函数M文件:是一个文本文件,拓展名为.m可以用任何编辑程序来建立和编辑,默认matlabM文件就是将处理问题的各种命令融合到一个文件中......
  • 黑客零基础入门教程,从入门到精通学习路线&规划,看完这篇就够了。
    很多人上来就说想学习黑客,但是连方向都没搞清楚就开始学习,最终也只是会无疾而终!黑客是一个大的概念,里面包含了许多方向,不同的方向需要学习的内容也不一样。想要成为黑客,却苦于没有方向,不知道从何学起,下面这篇黑客入门教程可以帮你实现自己的黑客梦想,如果想学,可以继续看下去......
  • 一文通透——Kali Linux基础入门_kali linux 新手教程
    ......