umi运行时配置


umi约定,src/app.jssrc/app.tsx文件为运行时配置,运行时配置和配置的区别是他跑在浏览器端,无需引用他们,应用启动时执行。其实就是几个封装好的函数,使用他们可以做特定的事情,不可以自定义函数

+ src
  - app.js      # 运行时配置文件
- package.json

运行时配置,是在浏览器运行时的配置,因此这个配置文件不能引入node依赖包(node依赖包是前端发布时引用的,运行时配置不参与发布)。

主要有以下几个函数

  • onRouteChange 监听路由改变
  • getInitialState 初始化状态
  • render 重新渲染
  • patchRoutes 修改路由
  • modifyRouteProps 修改传给路由组件的 props
  • rootContainer 用于封装 root container
  • onRouteChange({ routes, matchedRoutes, location, action })

在初始加载和路由切换时做一些事情。比如用于做埋点统计

export function onRouteChange({ location, routes, action }) {

     bacon(location.pathname);

}

做登录拦截

监听路由改变
一个参数:路由对象
import { history } from 'umi'

export function onRouteChange({ location, routes }) {
    const nowPath = routes[0].routes.filter(item => item.path === location.pathname)
    const isLogin = localStorage.getItem('username')

    //如果数组有值,有auth属性,并且没有登陆,就让它跳转到login页,并且附带跳转参数
    if (nowPath.length === 1 && nowPath[0].auth && !isLogin) {
        history.push({
            pathname: '/login',
            query: {
                form: location.pathname
            }
        })
    }
}
  • patchRoutes({ routes })

修改路由。比如在最前面添加一个 /foo 路由

export function patchRoutes({ routes }) {

     routes.unshift({

     path: '/foo',

     exact: true,

     component: require('@/extraRoutes/foo').default,

 });

}

比如和 render 配置配合使用,请求服务端根据响应动态更新路由,注意:直接修改routes,不需要返回

let extraRoutes;

export function patchRoutes({ routes }) {

 merge(routes, extraRoutes);

}

export function render(oldRender) {

 fetch('/api/routes').then(res=>res.json()).then((res) => { 

     extraRoutes = res.routes;

     oldRender();

 })

}
  • render(oldRender: Function)、

覆写 render。比如用于渲染之前做权限校验

import { history } from 'umi';

export function render(oldRender) {

 fetch('/api/auth').then(auth => {

     if (auth.isLogin) { oldRender() }

     else { 

         history.push('/login'); 

         oldRender()

     }

 });

}
  • modifyRouteProps(props, { route })

修改传给路由组件的 props。

export function modifyRouteProps(props, { route }) {
  return { ...props, foo: 'bar' };
}
  • rootContainer(container)

用于封装 root container,可以取一部分,或者外面套一层,等等。比如dva、intl 等需要在外层有个 Provider 的场景

export function rootContainer(container) {
  const DvaContainer = require('@tmp/DvaContainer').default;
  return React.createElement(DvaContainer, null, container);
}

Author: 顺坚
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source 顺坚 !
评论
 Previous
关于A股特点和博弈逻辑 关于A股特点和博弈逻辑
证券是商品经济发展到一定阶段的必然产物,证券和证券市场是随着资本主义的发展。从信用制度和金融市场中派生并发展起来的。证券作为一种金融资产,不仅是颇受社会公众欢迎的投资对象,亦是广泛运用的筹资手段,并日益渗透于社会经济生活之中。实践证明,证券
2021-11-27
Next 
囚徒困境 囚徒困境
博弈论里面有一个著名的问题,就是囚徒困境。也是行为金融学中最为大众熟知的理论,在短线投资中以行为金融学为指导,在长线投资中以价值投资基本面宏观经济分析作为指导,而我的投资策略是以基本面分析与行为金融学相结合作为投资指导,首先来介绍一下囚徒困
2021-11-22
  TOC