1.约定式路由
即文件路由,根据文件名自动配置;
1.1 基础路由
即自动生成的路由配置
例如pages目录如下:
1 | // 基础路由 |
1.2 动态路由
即带有$前缀的目录或文件生成的路由配置
例如pages如下:
1 | pages |
1.3 可选的动态路由
umi 里约定动态路由如果带 $ 后缀,则为可选动态路由。对象路由里面可选路由用?
表示
例如pages如下:
1 | pages |
1.4 嵌套路由
umi 里约定目录下有 _layout.js 时会生成嵌套路由,以 _layout.js 为该目录的 layout。对象路由里面嵌套路由写在routes
里面
1 | pages |
2. 编译时配置式路由
编译时配置式路由,可以配置 .umirc.(ts|js) 或者config/config.(ts|js) 配置文件中的 routes 属性;如果配置了这个文件,则会使约定式路由无效,即不会对 src/pages 目录做约定式的解析
2.1 config.js路由配置
<1>path参数: 这个就为一个路由路径。默认情况下,访问子路由的时候,会把父路由的所有组件也同时加载出来。 类型:string
如,一个路由{ path: ‘/‘, component: ‘@/layouts/basic’,routes:[{path: ‘/user’,component:’./content/content’}] }
这时候如果输入路由 /user, 页面中会同时加载组件basic和组件content
<2>component参数: 这个是和前面的路由路径对应的组件路径,即切换到对应的路由,就会显示这个对应的组件。component 默认是相对于 src/pages 目录的。但是也可以用@来进行指定,@目录依然代表src目录。 类型:string
<3>routes参数: 表示子路由的所有配置,里面的依然是所有的路由对象
<4>redirect参数: 表示重定向路由。值为一个path路径。即,访问该路由的时候,重定向到指定路由
{ exact: true, path: ‘/‘, redirect: ‘/list’ }。即访问路由/的时候,重定向到路由/list
<5>exact参数: 表示是否精准匹配。加了这个属性,访问子路由的时候,就不会把父路由的组件也同时加载出来了,而只会加载子路由的组件。 类型:boolean,默认值:false
如,一个路由{ path: ‘/‘, component: ‘@/layouts/basic’,routes:[{path: ‘/user’,component:’./content/content’,exact: true}] }
这时候如果输入路由 /user, 页面中只会加载content组件
<6>title参数:配置路由的标题
2.2 路由组件参数
在组件的props上面可以获取到的参数
match,当前路由和 url match 后的对象,包含 params(这个params就是动态路由的时候,获取传入的那个值)、path、url 和 isExact 属性
location,表示应用当前出于哪个位置,包含 pathname、search、query 等属性。这个参数没用,直接用window.location,就和这个是一样的了
history,同 api#history 接口
route,当前路由配置,包含 path、exact、component、routes 等
2.3 权限路由
umi 的权限路由是通过编译时配置式路由的 Routes 属性来实现,在routes下的对象里设置authority属性即可;
umi默认使用的是Browser History, 使用hash需要在config.js里配置
1 | export default {history: 'hash',} |
3.运行时配置式路由
运行时配置式路由,就是指src 目录下的 app.js 中的路由配置。这个就相当于是在配置vue中的全局的钩子函数。即组件里面在执行一些操作的时候,就会先触发这里面的一些函数****
3.1 patchRoutes函数
作用: 修改路由当前页面中的路由
- routes:
Array
,config/config.js
中的全部路由配置,修改了这个routes参数,就相当于修改了全局的路由配置, - 使用场景:<1>和 render 配合使用,请求服务端根据响应动态更新路由。<2>修改全部路由,加上某个前缀
1 | export function patchRoutes(routes) { |
3.2 render函数
作用: render生命周期执行前调用此函数,可在渲染应用前做权限校验
1 | import router from 'umi/router' // umi2 |
3.3 onRouterChange函数
作用: 在初始加载和路由切换时触发
参数如下:
- location:
Object
,history 提供的 location 对象 - routes:
Array
,路由配置 - action:
PUSH|POP|REPLACE|undefined
,初次加载时为 undefined
使用场景:埋点统计。初次加载时也会执行,但 action 为 undefined
3.4 rootContainer函数
用于封装 root container,可以取一部分,或者外面套一层,等等,参数如下
- container:
ReactComponent
,React 应用最上层的根组件 - 使用场景:dva、intl 等需要在外层有个 Provider 的场景
3.4 modifyRouteProps函数
用于修改传给路由组件的 props,参数如下
- props:
Object
,原始 props - Object:
里面有个route属性
,表示当前路由配置 - 使用场景:需返回新的 props
4. 路由跳转
4.1 标签跳转
基于 umi/link
,通常作为 React 组件使用。就是说用<link>
标签进行跳转
1 | import Link from 'umi/link'; |
4.2 函数跳转
基于 umi/router,通常在事件处理中被调用。就是说函数式跳转,一般不用这个,在umi 3.0中已经被废弃,而是用下面那个history跳转。更多跳转方法,见 https://umijs.org/zh/api/#umi-router。但是**使用这个history的时候,有时候会报错 history为undefined,所以这个时候需要用withRouter()()
这个高阶组件来包裹当前组件**
4.3 props.history.push(params):
这个push()函数的params参数,可以为一个字符串也可以为一个对象。
参数为字符串:为字符串的时候,就代表要跳转的目标路由路径
参数为对象:为对象的时候,就可以 给目标路由传参了
参数如下:
pathname属性:表示要跳转的目标路由路径。 类型:string
query属性:表示要传给目标路由的参数。不过参数会被放到地址栏。 类型:object
state属性:也是传给目标路由的参数。参数是加密的,不会放到地址栏。 类型:object
组件中获取传过来的路由参数:如果是query传过来的对象参数,就用this.props.location.query(默认为{}); 如果是state传过来的对象参数,就用this.props.location.state(默认为undefined);
注: window的location对象改变路由实现跳转:location.pathname = '/user/list'
,这种方法可以是可以,不过就是切换路由的速度太慢了。在可以用上面方法的情况下,不推荐使用
5 Module Processor
1 | .js, .jsx, .mjs, .jsx, .json: 由 babel-loader 处理 |
————————————————
转载至:https://blog.csdn.net/rocktanga/article/details/122907867