umi 部分使用介绍

摘要:
1.创建页面及路由umigpageindex//创建index首页,会创建一个pages文件夹,里面有index.js和index.cssumidev//启动项目到8000端口,localhost:8000会显示刚刚创建的indexumigpageabout//创建about页面,pages文件夹里面增加about.js和about.css,即可访问localhost:8000/about2.动态

1. 创建页面及路由

umi  g page index
// 创建index首页,会创建一个pages文件夹,里面有index.js 和index.css

umi dev
// 启动项目到8000端口,localhost:8000会显示刚刚创建的index

umi g page about 
// 创建about页面, pages文件夹里面增加about.js 和 about.css,即可访问localhost:8000/about

2. 动态路由添加

 pages文件夹里面创建users文件夹,users文件夹里面创建$id.js和$id.css

// $id.js
import styles from './$id.css';

export default function(props) {
  return (
    <div className={styles.normal}>
      <h1>Page {props.match.params.id} test</h1>
    </div>
  );
}

// url输入localhost:8000/users/1 显示 page 1 test
// url输入localhost:8000/users/2 显示 page 2 test

umi g page users/_layout
// 在users文件夹里面增加_layout.js 和 _layout.css

// url输入localhost:8000/users/1 显示 page layout
// url输入localhost:8000/users/2 显示 page layout

// 修改layout.js代码
import styles from './_layout.css';

export default function(props) {
  return (
    <div className={styles.normal}>
      <h1>Page _layout</h1>
      {props.children} // 显示子路由内容
    </div>
  );
}

// url输入localhost:8000/users/1 显示 page layout 和page 1 test

// url输入localhost:8000/users/1 显示 page layout 和page 2 test

3. 动态路由跳转

umi g page users/index

// users/index 代码
import Link from 'umi/link'
// umi 对props.history进行了封装
import router from 'umi/router'
import styles from './index.css';
const users = [
  {id: 1, name: 'Tom'},
  {id: 2, name: 'Jerry'},
  {id: 3, name: 'Bob'}
]

export default function(props) {
  return (
    <div className={styles.normal}>
      <h1>Page User List</h1>
      <ul>
        {users.map(user => 
            // 通过点击事件的方式跳转
          <li key={user.id} onClick={() =>
          // 也可使用router.push(`/users/${user.id}`)
          props.history.push(`/users/${user.id}`)}>
            {/* <Link to={`/users/${user.id}`}>{user.name}</Link> */} // 通过标签方式跳转
            {user.name}
          </li>
        )}
      </ul>
    </div>
  );
}

4. config/config.js 配置路由

export default{
    routes: [
        {path: "/", component: "./index"}, // 是相对于pages
        {path: "/about", component: "./about", Routes: [
            "./routes/PrivateRoute.js"  // 是相对于根目录的  
        ]}, // Routes  路由守卫
        {
            path: "/users",
            component: "./users/_layout"
            routes: [
                {path: "/users/", component: "./users/index"},
                {path: "users/:id", component: "./users/$id"}
            ]
        }
    ]
}

5. models/goods.js

export default {
    // "method url": (req, res) => {}
    "get /Api/goods": (req, res) => {
        setTimeout( () => {
            res.json({result: data})
        },300)
    }
}

6. umi models 示例

// goods.js

import axios from 'axios'

function getGoods(){
    return axios.get('/Api/goods')
}

export default{
    namespace: 'goods', // model的命名空间,若不定义则跟文件名同名
    // {title: 'WEB前端'},{title: 'WEB全栈'} 初始数据
    state: [], 
    effects: {// 异步操作
        *getList(action, {call, put}){
            const res = yield call(getGoods);
            yield put({type: 'initGoods', payload: res.data.result})
        }
    }, 
    reducers: {
        initGoods(state, action){
            return action.payload
        },
        // 更新状态
        addGood(state, action){
            return [...state, { title: action.payload.title }]
        }
    }
}

// gooods. js 中代码应用dva
import { connect } from 'dva'

@connect(
    state => ({
        goodsList: state.goods // 获取指定命名空间的模型状态
    }),
    {
        addGood: title => ({
            type: 'goods/addGood', // 命名空间+reducer组成名字
            payload: { title }
        }),
        getList: () => ({
            type: 'goods/getList' // 命名空间+effects组成名字
        })
    }
)

export default class extends React.Component{

    componentDidMount(){
        this.props.goodList()
    }

    render(){
        return (
            <div>
                <h2>Page Goods</h2>
                <ul>
                    { 
                        this.props.goodList.map(good =>
                            <li key={good.title}>
                                { good.title }
                            </li>
                    }
                </ul>
                <button onClick={() => this.props.addGood('商品'+ new Date().getTime())}>添加商品</button>
            </div>
        )
    }
}

7. umi 中使用antd

// config/config.js
export default{
    plugins: [
        "umi-plugin-react",
        {
            antd: true, // true为启用
            dva: true
        }
    ]
}

8. 拦截器在全局下的应用——global.js

9. src/app.js——修改dva的配置

export default dva = {
    config: {
        onStateChange(state){
            if (localstorage) {
                localStorage.setItem('cart', JSON.stringify(state.cart))
            }
        }        
    }
}

免责声明:文章转载自《umi 部分使用介绍》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇ASP.NET Core 之 Identity 入门【转】使用Apple Configurator 2提取商店ipa or app文件下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

weblogic的集群与配置图文方法

一、Weblogic的集群 还记得我们在第五天教程中讲到的关于Tomcat的集群吗? 两个tomcat做node即tomcat1, tomcat2,使用Apache HttpServer做请求派发。 现在看看WebLogic的集群吧,其实也差不多。 区别在于: Tomcat的集群的实现为两个物理上不同的tomcat,分别就是两个node,没有总控端,...

android模拟器访问localhost或127.0.0.1报错

 在一般的Java Web程序开发中,我们通常使用localhost或者127.0.0.1来访问本机的Web服务,但是如果我们在Android模拟器中也采用同样的地址来访问,Android模拟器将无法正常访问到我们的服务,这是为什么呢?我们可以这样来理解:Android的底层是Linux kernel,包括Android本身就是一个操作系统,因此,这时我们...

rabbitmq队列

使用MQ 以常见的订单系统为例,用户点击【下单】按钮之后的业务逻辑可能包括:扣减库存、生成相应单据、发红包、发短信通知。在业务发展初期这些逻辑可能放在一起同步执行,随着业务的发展订单量增长,需要提升系统服务的性能,这时可以将一些不需要立即生效的操作拆分出来异步执行,比如发放红包、发短信通知等。这种场景下就可以用 MQ ,在下单的主流程(比如扣减库存、生成相...

prometheus学习笔记(1)-mac单机版环境搭建

注:以下所有环境均为mac笔记本 一、安装prometheus brew install prometheus 安装完后,默认的安装路径为: /usr/local/Cellar/prometheus/2.16.0/ 同时还会生成一个默认配置文件:/usr/local/etc/prometheus.yml global: scrape_interva...

spring boot常见get 、post请求参数处理

spring boot 常见http get ,post请求参数处理   在定义一个Rest接口时通常会利用GET、POST、PUT、DELETE来实现数据的增删改查;这几种方式有的需要传递参数,后台开发人员必须对接收到的参数进行参数验证来确保程序的健壮性GET一般用于查询数据,采用明文进行传输,一般用来获取一些无关用户信息的数据POST一般用于插入数据P...

(二)文档请求不同源之window.name跨域

一、基本原理 window.name不是一个普通的全局变量,而是当前窗口的名字。这里要注意的是每个iframe都有包裹它的window,而这个window 是top window的子窗口,而它自然也有window.name的属性,window.name在不同的页面(甚至不同域名)加载后依旧存在(如果没修改则值不会变化),并且可以支持非常长的name值(2M...