1.子路由

  1. import { defineConfig } from 'umi';
  2. export default defineConfig({
  3. nodeModulesTransform: {
  4. type: 'none',
  5. },
  6. routes: [
  7. { path: '/', component: '@/pages/index' },
  8. { path: '/user',routes:[
  9. {
  10. path:"/user/one",component:'@/pages/user',
  11. },
  12. {
  13. path:"/user/two",component:'@/pages/index'
  14. }
  15. ] },
  16. ],
  17. fastRefresh: {},
  18. });

2.严格模式

  1. import { defineConfig } from 'umi';
  2. export default defineConfig({
  3. nodeModulesTransform: {
  4. type: 'none',
  5. },
  6. routes: [
  7. { path: '/', component: '@/pages/index' },
  8. //这里访问/user/one就无法匹配到页面
  9. { path: '/user',exact:true,component:'@/pages/user',routes:[
  10. {
  11. path:"/user/one"
  12. }
  13. ] },
  14. ],
  15. fastRefresh: {}
  16. });

3.layouts

模板文件,子路由使用共同的模板
在src下新建layouts文件

  1. import React from 'react'
  2. const Index = (props:any) => {
  3. return (
  4. <div>
  5. <h1>header</h1>
  6. //这里可以拿到内容插进来的内容,类似于vue的插槽
  7. {props.children}
  8. <h2>Footer</h2>
  9. </div>
  10. )
  11. }
  12. export default Index
  1. import { defineConfig } from 'umi';
  2. export default defineConfig({
  3. nodeModulesTransform: {
  4. type: 'none',
  5. },
  6. routes: [
  7. { path: '/', component: '@/pages/index' },
  8. { path: '/user',
  9. //这里配置公共部分
  10. component:'@/layouts/index',
  11. routes:[
  12. {
  13. path:"/user/one",component:'@/pages/user',
  14. },
  15. {
  16. path:"/user/two",component:'@/pages/index'
  17. }
  18. ] },
  19. ],
  20. fastRefresh: {},
  21. });

4.重定向

  • Type:string

    配置路由跳转。 比如: export default { routes: [ { exact: true, path: ‘/‘, redirect: ‘/list’ }, { exact: true, path: ‘/list’, component: ‘list’ }, ],} 访问/会跳转到/list,并由src/pages/list文件进行渲染。

  1. import { defineConfig } from 'umi';
  2. export default defineConfig({
  3. nodeModulesTransform: {
  4. type: 'none',
  5. },
  6. routes: [
  7. { path: '/', component: '@/pages/index' },
  8. //重定向到一个连接,这里的属性值都是路由地址
  9. {
  10. path:"/list",redirect:'/listem',
  11. },
  12. //这里有一个页面
  13. {
  14. path:"/listem",component:'@/pages/question',
  15. },
  16. { path: '/user',
  17. //这里配置公共部分
  18. component:'@/layouts/index',
  19. routes:[
  20. {
  21. path:"/user/one",component:'@/pages/user',
  22. },
  23. {
  24. path:"/user/two",component:'@/pages/index'
  25. }
  26. ] },
  27. ],
  28. fastRefresh: {},
  29. });

5.wrappers

Type:string[]
配置路由的高阶组件封装。
比如,可以用于路由级别的权限校验:
wrapper可以拦截路由

5.1新建文件

在src目录下新建一个wrappers文件

  1. //auth.tsx
  2. import { Redirect } from 'umi'
  3. export default (props:any) => {
  4. const isLogin = false;
  5. if (isLogin) {
  6. return <div>{ props.children }</div>;
  7. } else {
  8. return <Redirect to="/login" />;
  9. }
  10. }

5.2配置文件

  1. //.umirc.ts
  2. import { defineConfig } from 'umi';
  3. export default defineConfig({
  4. nodeModulesTransform: {
  5. type: 'none',
  6. },
  7. routes: [
  8. { path: '/', component: '@/pages/index' },
  9. //重定向到一个连接,这里的属性值都是路由地址
  10. {
  11. path:"/list",redirect:'/listem',
  12. },
  13. //这里有一个页面
  14. {
  15. path:"/listem",component:'@/pages/question',
  16. },
  17. {
  18. path:"/login",component:'@/pages/login',
  19. },
  20. { path: '/user',
  21. //这里配置公共部分
  22. component:'@/layouts/index',
  23. //这里会先进入wrappers下的文件,做一个中间件,在这个中间件中可以做路由拦截
  24. wrappers: [
  25. '@/wrappers/auth',
  26. ],
  27. routes:[
  28. {
  29. path:"/user/one",component:'@/pages/user',
  30. },
  31. {
  32. path:"/user/two",component:'@/pages/index'
  33. }
  34. ] },
  35. ],
  36. fastRefresh: {},
  37. });
  1. //login.tsx
  2. import React from 'react'
  3. export default function login() {
  4. return (
  5. <div>
  6. 这是一个登录组件
  7. </div>
  8. )
  9. }

这里可以做登录状态的判断

6.404异常处理

  1. import { defineConfig } from 'umi';
  2. export default defineConfig({
  3. nodeModulesTransform: {
  4. type: 'none',
  5. },
  6. routes: [
  7. { path: '/', component: '@/pages/index' },
  8. //重定向到一个连接,这里的属性值都是路由地址
  9. {
  10. path:"/list",redirect:'/listem',
  11. },
  12. //这里有一个页面
  13. {
  14. path:"/listem",component:'@/pages/question',
  15. },
  16. {
  17. path:"/login",component:'@/pages/login',
  18. },
  19. //这里配置找不到路径返回404页面
  20. {
  21. component:'@/pages/404'
  22. },
  23. { path: '/user',
  24. //这里配置公共部分
  25. routes:[
  26. {
  27. path:"/user/one",component:'@/pages/user',
  28. },
  29. {
  30. path:"/user/two",component:'@/pages/index'
  31. },
  32. //这里配置找不到路径返回404页面
  33. {
  34. component:'@/pages/404'
  35. }
  36. ] },
  37. ],
  38. fastRefresh: {},
  39. });
  1. //404.tsx
  2. import React from 'react'
  3. export default function NotFound() {
  4. return (
  5. <div>
  6. <h1>这是个404</h1>
  7. </div>
  8. )
  9. }

7.动态路由参数

  1. import { defineConfig } from 'umi';
  2. export default defineConfig({
  3. nodeModulesTransform: {
  4. type: 'none',
  5. },
  6. routes: [
  7. { path: '/', component: '@/pages/index' },
  8. //重定向到一个连接,这里的属性值都是路由地址
  9. {
  10. path:"/list",redirect:'/listem',
  11. },
  12. //这里有一个页面
  13. {
  14. path:"/listem",component:'@/pages/question',
  15. },
  16. {
  17. path:"/login",component:'@/pages/login',
  18. },
  19. //这里配置找不到路径返回404页面
  20. { path: '/user',
  21. //这里配置公共部分
  22. routes:[
  23. {
  24. path:"/user/one",component:'@/pages/user',
  25. },
  26. //这里的id是动态的路由参数,加个?号表示可选的
  27. {
  28. path:"/user/two/:id?",component:'@/pages/index'
  29. },
  30. //这里配置找不到路径返回404页面
  31. {
  32. component:'@/pages/404'
  33. }
  34. ] },
  35. ],
  36. fastRefresh: {},
  37. });

这里访问http://localhost:8000/user/two无效,后面需要加动态的一个id 例如:http://localhost:8000/user/two/1

在index.tsx中可以拿到这个参数,通过props.match.params

  1. import styles from './index.less';
  2. export default function IndexPage(props:any) {
  3. {
  4. console.log(props.match.params);
  5. }
  6. return (
  7. <div>
  8. </div>
  9. );
  10. }

8.约定式路由

假设route下没有任何配置,它就会使用约定式路由,范文哪个页面直接就是目录加路径即可

除配置式路由外,Umi 也支持约定式路由。约定式路由也叫文件路由,就是不需要手写配置,文件系统即路由,通过目录和文件及其命名分析出路由配置。

如果没有 routes 配置,Umi 会进入约定式路由模式,然后分析src/pages目录拿到路由配置。
比如以下文件结构:
. └── pages ├── index.tsx └── users.tsx
会得到以下路由配置,

  1. [ { exact: true, path: '/', component: '@/pages/index' }, { exact: true, path: '/users', component: '@/pages/users' },]

需要注意的是,满足以下任意规则的文件不会被注册为路由,

  • 以.或_开头的文件或目录
  • 以d.ts结尾的类型定义文件
  • 以test.ts、spec.ts、e2e.ts结尾的测试文件(适用于.js、.jsx和.tsx文件)
  • components和component目录
  • utils和util目录
  • 不是.js、.jsx、.ts或.tsx文件
  • 文件内容不包含 JSX 元素