umijs 4.0学习 - 路由

1.umijs路由 - 配置路由

.umirc.ts 中配置路由router

复制代码
import { defineConfig } from '@umijs/max';
export default defineConfig({
  antd: {},
  access: {},
  model: {},
  initialState: {},
  request: {},
  layout: {
    title: 'xxxxxx',
  },
  routes: [
    {
      path: '/',
      redirect: '/home',
      keepQuery: true //参数带过去
    },
    {
      name: '首页',
      path: '/home',
      component: './Home',
    },
    {
      name: '权限演示',
      path: '/access',
      component: './Access',
    },
    {
      name: '测试',
      path: '/ceshi',
      component: './Ceshi',
    },
    {
      name: ' CRUD 示例',
      path: '/table',
      component: './Table',
    },
  ],
  npmClient: 'pnpm',
});

component: './Table', =====>

可以是绝对路径,也可以是相对路径。如果是相对路径,会从 src/pages 开始寻找。

如果指向 src 目录的文件,可以用 @,比如 component: '@/layouts/basic',推荐使用 @ 组织路由文件位置。

这里配置的文件会在layout 导航中自动增加

2.path的支持种类

复制代码
/groups
/groups/admin
/users/:id
/users/:id/messages
/files/*
/files/:id/*

3.子路由配置

复制代码
routes: [
    { path: '/login', component: 'login' },
    {
      name: ' Father 示例',
      path: '/Father',
      component: '@/pages/Father/index.tsx',
      routes: [{ path: 'ceshi', component: './Ceshi' }],
    },
  ],

father
import { Outlet } from 'umi';

const Father: React.FC = () => {
  return (
    <div style={{ padding: 20 }}>
      <div>22222</div>
      <Outlet />
    </div>
  );
};

export default Father;

4.页面权限配置 wrappers

复制代码
{
      name: ' CRUD 示例',
      path: '/table',
      component: './Table',
      wrappers: ['@/wrappers/auth'],
    },

auth.tsx

复制代码
import { Navigate, Outlet } from 'umi';

export default (props) => {
  //   const { isLogin } = useAuth();
  if (true) {
    return <Outlet />;
  } else {
    return <Navigate to="/login" />;
  }
};

wrappers 中的每个组件会给当前的路由组件增加一层嵌套路由,如果你希望路由结构不发生变化,推荐使用高阶组件。先在高阶组件中实现 wrapper 中的逻辑,然后使用该高阶组件装饰对应的路由组件。

复制代码
import { Navigate } from 'umi'

const withAuth = (Component) => ()=>{
  const { isLogin } = useAuth();
  if (isLogin) {
    return <Component />;
  } else{
    return <Navigate to="/login" />;
  }
}

5.关闭layout layout: false,

复制代码
 {
      name: ' Father1',
      path: '/Father1',
      layout: false,
      component: '@/pages/Father1/index.tsx',
    },

6.约定式路由

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

如果没有 routes 配置,Umi 会进入约定式路由模式,然后分析 src/pages 目录拿到路由配置。

7.动态路由

8.在src下创建layouts 自定义导航

复制代码
import { Outlet } from 'umi'

export default function Layout() {
  return <Outlet />
}

9.404 路由

10.路由跳转以及参数传参

Link

复制代码
<Link to="/users">Users Page</Link> 跳外链 用a标签
// 带参数
<Link to={{
  pathname: '/user',
  query: { id: 123, name: 'test' } // 会被转为 ?id=123&name=test
}}>
  用户页
</Link>

useNavigate

复制代码
import { useNavigate } from 'umi';

function MyComponent() {
  const navigate = useNavigate();

  const goToHome = () => {
    // 基本用法
    navigate('/home');
    
    // 带参数
    navigate('/user?id=123&name=test');
    
    // 或使用对象形式
    navigate({
      pathname: '/user',
      query: { id: 123 }
    });
    
    // 后退
    navigate(-1);
    
    // 前进
    navigate(1);
  };

  return <button onClick={goToHome}>去首页</button>;
}

useHistory 常用

复制代码
import { useHistory } from 'umi';

function MyComponent() {
  const history = useHistory();

  const goToAbout = () => {
    // 跳转到指定路由
    history.push('/about');
	history.push({
      pathname: '/user',
      query: { id: 123 }
    });
    
    // 替换当前路由(不会加入历史记录)
    history.replace('/about');
    
    // 后退
    history.goBack();
    
    // 前进
    history.goForward();
  };

  return <button onClick={goToAbout}>去关于页</button>;
}

获取参数

复制代码
import { useSearchParams, useParams } from 'umi';

function UserPage() {
  // 获取query参数
  const [searchParams] = useSearchParams();
  const id = searchParams.get('id'); // 适用于 ?id=123 形式
  
  // 获取动态路由参数
  const params = useParams();
  const userId = params.id; // 适用于 /user/:id 形式

  return <div>用户ID: {userId}</div>;
}


// 导航时传递状态
navigate('/detail', { state: { from: 'list', data: { id: 1 } } });

// 在目标页面接收状态
import { useLocation } from 'umi';

function DetailPage() {
  const location = useLocation();
  const { from, data } = location.state || {};
  
  return <div>来自: {from}</div>;
}
相关推荐
Want5958 小时前
HTML炫酷烟花⑨
前端·html
艾小码8 小时前
90%前端面试必问的12个JS核心,搞懂这些直接起飞!
前端·javascript
qq_54702617914 小时前
Flowable 工作流引擎
java·服务器·前端
刘逸潇200514 小时前
CSS基础语法
前端·css
容器( ु⁎ᴗ_ᴗ⁎)ु.。oO15 小时前
Magentic-ui 学习
学习
吃饺子不吃馅15 小时前
[开源] 从零到一打造在线 PPT 编辑器:React + Zustand + Zundo
前端·svg·图形学
_李小白15 小时前
【OPENGL ES 3.0 学习笔记】延伸阅读:VAO与VBO
笔记·学习·elasticsearch
小马哥编程16 小时前
【软考架构】案例分析-Web应用设计(应用服务器概念)
前端·架构
鱼与宇16 小时前
苍穹外卖-VUE
前端·javascript·vue.js
啃火龙果的兔子16 小时前
前端直接渲染Markdown
前端