react+ts+vite项目 路由的搭建 (route v6)

文章讲述了在React项目中如何配置和封装路由,包括使用`npminstall`安装`react-router`相关库,创建RouteConfig.tsx文件集中管理路由,使用typescript定义路由类型,以及在App.tsx中通过遍历数组动态生成Route,实现路由懒加载。同时提到了嵌套路由的Outlet用法,以及histroy和useNavigate在路由跳转中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

路由

一、配置路由

 npm install --save react-router react-router-dom

eg: 安装完成后会在package.json中出现安装包信息
在这里插入图片描述

二、封装路由

react中, 路由路径是由Routes 、 Route 搭配包裹生成的, 这就会出现下面的现象:
在这里插入图片描述
一层嵌套一层, 若页面多的话维护起来比较麻烦,所以需要自行处理一下。
1、 在src下建route文件夹下建RouteConfig.tsx 文件, 用来配置路由路径和组件, 变成下面这样
在这里插入图片描述
标红是ts报的错,没有给定类型,新建model.d.ts声明文件,用来定义路由的类型:
在这里插入图片描述
声明文件中定义一个命名空间,用来存放跟路由相关的接口。
接下来在RouteConfig.tsx文件中使用这个类型, 解决ts的报错:
在这里插入图片描述
需要注意, 路由最好使用懒加载,节省效率, 所以对以上代码改造一下,最终呈现如下
在这里插入图片描述
类型改为
在这里插入图片描述

2、 在app.tsx 文件中改造一下html结构, 本质上就是利用数组循环出Route,简化书写嵌套Route, 增减路由只需维护RouteConfig文件里的配置内容即可。
在这里插入图片描述
代码贴在这里

import { Suspense } from 'react';
import { BrowserRouter, Routes, Route } from 'react-router-dom';
import router from './route/RouteConfig';

function App() {
  // 由于路由组件是懒加载的,渲染页面可能会有延迟,使用Suspense 可优化交互
  const RouteEleMent = (route: IRouteType.IRouer): React.ReactNode => {
    if (!route.element) {
      return null;
    }
    return (
      <Suspense fallback={<div> Loading...</div>}>
        <route.element />
      </Suspense>
    );
  };
  // 通过每个路由对象渲染Route
  const RouteItem = (route: IRouteType.IRouer) => {
    return (
      <Route key={route.name} element={RouteEleMent(route)} path={route.path}>
        {RouteList(route.chileren ?? [])}
      </Route>
    );
  };
  // 根据配置的routeconfig 生成Route
  const RouteList = (list: IRouteType.IRouer[]) => {
    return list.map((item) => RouteItem(item));
  };

  return (
    <BrowserRouter>
      <div className="App">
        <Routes>
          {/* <Route element={Dashboard()} path="/">
            <Route element={MenuLeft()} path="menu"></Route>
          </Route>
          <Route element={Profile()} path="/profile"></Route> */}
          {RouteList(router)}
        </Routes>
      </div>
    </BrowserRouter>
  );
}

export default App;

关于 Outlet

嵌套路由用来占位的, 例如后台管理系统中,左侧是菜单,右侧区域用来切换页面, 这个时候就会用到 标签, 使页面渲染到正确的位置
例:
在这里插入图片描述

关于history

用来操作浏览器历史栈, 主要是可以用来封装路由前置守卫和后置守卫, vue有自己的路由守卫钩子, react是需要依赖history自己封装的, 关于路由守卫的封装另开一篇讲解。
https://juejin.cn/post/7065599937265795109
悄咪咪放个链接,讲history的,不了解的可以看看~

路由跳转 useNavigate

route v6对路由跳转做了优化,为我们提供了新的钩子 useNavigate
使用方法

import { useNavigate } from 'react-router-dom'

function App(){
	const navigate = useNavigate();
    //跳转
    navigate('/home');
    // 传参
    navigate('/home', {state: {name: 'zhangsan'}})
    //后退
    navigate(-2}

代码仓库

https://gitee.com/liuyue82/react_-ts_-vite.git

<think>嗯,用户想要找一个基于Vite前端基础框架项目,并且需要包含菜单功能的实现。首先,我需要理解Vite是什么,以及它在前端开发中的作用。Vite是一个现代化的前端构建工具,支持快速的冷启动和热模块替换,适合开发React、Vue、Svelte等项目。用户可能希望利用Vite的高效性能来搭建项目。 接下来,用户提到需要菜单功能,这可能指的是导航菜单,侧边栏菜单,或者动态路由菜单。不同的前端框架可能有不同的实现方式。比如,在Vue中,可以使用Vue Router来处理路由,结合UI库如Element Plus或Ant Design Vue来构建菜单组件。而在React中,可能会使用React Router,并搭配Ant Design或Material-UI等组件库。 用户可能是一个前端开发者,正在寻找一个现有的项目模板或脚手架,以便快速启动他们的项目,而不需要从零开始配置。因此,我需要考虑推荐一些流行的、社区支持的Vite模板,这些模板已经集成了路由和菜单功能。 首先,我应该检查官方文档是否有推荐的模板。例如,Vite的官方模板包括vanilla、vanilla-ts、vue、vue-ts等,但这些基础模板可能不包含菜单功能。因此,可能需要社区提供的模板或者第三方库。 对于Vue用户,可以考虑使用Vitesse,这是一个流行的Vite模板,集成了Vue 3、Vue Router、Pinia等,并且支持布局系统,包括导航菜单。另一个选项是Ant Design Vue的模板,可能已经配置好了侧边栏菜单。 对于React用户,可能需要推荐类似Vite + React + TypeScript的模板,并集成React Router和Ant Design的菜单组件。例如,用户可以使用create-vite-app选择react-ts模板,然后手动添加路由和菜单,或者寻找社区提供的模板。 此外,用户可能希望菜单是动态生成的,基于路由配置。这就需要项目中的路由与菜单组件联动,例如通过遍历路由配置来渲染菜单项。这通常需要结合路由库和状态管理,比如在Vue中使用Vue Router和Pinia,或在React中使用React Router和Context API。 还需要考虑UI组件库的选择,因为不同的库提供了不同的菜单组件样式和功能。Element Plus、Ant Design、PrimeVue等都是常见的选择,它们提供了可定制的菜单组件,支持嵌套、图标、权限控制等。 另外,用户可能需要菜单的响应式设计,适应不同屏幕尺寸。这可能需要结合CSS框架如Tailwind CSS或Flexbox/Grid布局来实现。 最后,我应该提供具体的步骤,指导用户如何从零开始创建一个带有菜单功能的Vite项目,或者推荐现有的模板,并说明如何集成菜单功能。同时,可能需要提供代码示例,比如配置路由、创建菜单组件,以及状态管理的部分,帮助用户理解实现过程。 在生成相关问题的时候,需要围绕用户可能进一步询问的点,比如如何动态生成菜单、如何与路由集成、推荐的UI库、权限控制等。这些问题可以帮助用户深入解决他们在实际开发中可能遇到的问题。</think>### 基于 Vite前端框架项目实现菜单功能指南 #### 一、技术选型建议 1. **基础框架选择**: - Vue 3 推荐:`Vitesse` 模板(集成路由/布局)[^1] - React 推荐:`vite-react-ts` 模板 + React Router $$ npm create vite@latest my-app -- --template react-ts $$ 2. **菜单实现方案**: ```mermaid graph TD A[路由配置] --> B[菜单数据源] B --> C[动态菜单组件] C --> D[权限控制] ``` #### 二、Vue 3 实现示例 1. 安装必要依赖: ```bash npm install vue-router@4 pinia element-plus ``` 2. 路由配置 (`src/router/index.ts`): ```typescript const routes = [ { path: '/', component: () => import('@/layouts/MainLayout.vue'), children: [ { path: '', name: 'Dashboard', meta: { menu: true, icon: 'dashboard' } }, { path: '/users', meta: { menu: true, title: '用户管理' }, component: () => import('@/views/Users.vue') } ] } ] ``` 3. 动态菜单组件 (`src/components/SideMenu.vue`): ```vue <template> <el-menu :router="true"> <template v-for="route in filteredRoutes"> <el-menu-item :index="route.path" :key="route.path"> <el-icon><component :is="route.meta.icon"/></el-icon> <span>{{ route.meta.title || route.name }}</span> </el-menu-item> </template> </el-menu> </template> ``` #### 三、React 实现方案 1. 使用 `react-router-dom` v6: ```tsx const routes = [ { path: '/', element: <Dashboard />, handle: { menu: true } }, { path: '/settings', element: <Settings />, handle: { menu: true, icon: <GearIcon /> } } ] function Menu() { const location = useLocation() return ( <nav> {routes.filter(r => r.handle?.menu).map(route => ( <NavLink to={route.path} key={route.path}> {route.handle.icon} <span>{route.handle.title}</span> </NavLink> ))} </nav> ) } ``` #### 四、进阶功能实现 1. **权限控制**:通过路由 meta 字段定义权限标识 ```typescript meta: { requiresAuth: true, permissions: ['admin'] } ``` 2. **多级菜单**:使用递归组件实现嵌套菜单 3. **状态保持**:使用 Pinia/Zustand 存储菜单展开状态
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值