# vite-react
**Repository Path**: leigong421/vite-react
## Basic Information
- **Project Name**: vite-react
- **Description**: vite react 后台管理项目
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2023-11-08
- **Last Updated**: 2024-10-16
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# vite react
## 安装路由
- npm i react-router-dom
- 路由版本 V>=16
- 路由懒加载 React.lazy
```jsx
import { Suspense, lazy } from 'react';
//懒加载页面
const Home = lazy(() => import('@/views/home/index'));
const Home = React.lazy(() => import('@/views/home/index'));
//包裹异步加载组件的加载动画
Loading..1111111.}>
;
// BrowserRouter历史模式
```
## Routes 和 Route 是 react-router-dom 包提供的两个组件,用于在 React 应用程序中进行路由
- Routes 组件是一个容器,用于定义一组 Route 组件。它内部可以包含零个或多个 - Route 组件,并根据 URL 匹配其中的一个 Route 组件来渲染。
- Route 组件用于定义路由。它包括一个路径(path)和一个组件(element)。当 URL 匹配该路径时,该组件将被渲染到页面上。可以在 Route 组件中定义其他属性和方法,以根据需要实现更高级的路由功能。
## 路由重定向 Navigate
- 因为,这个时候没有“/”没有对应任何路由组件。我们可以使页面处于跟路由“/”时,让他重定向到 about 组件,解决这个问题。
- Navigate 是 react-router-dom 4.0+ 版本中的一个组件,它可以通过编程方式导航到一个特定的路由。它的用法有些类似于 Link 组件和 history.push 方法,但它可以根据一些条件来激活导航
- Navigate 只要一渲染,就会引起视图变化。
- replace 是 Navigate 组件的一个属性,用于在导航时替换当前的路由历史记录而不是添加新的记录。(在 React Router 中,导航时会将新的路由历史记录添加到栈顶,这会增加浏览器的回退次数和前进次数。但是,在某些情况下,这不是我们想要的行为,因为某些路由可能不应该添加到历史记录中。这时就可以通过设置 replace 属性来解决这个问题。)
```jsx
}>
}>
import { Navigate } from 'react-router-dom';
function App({ isAuth }) {
//我们使用了 Navigate 组件来导航到登录页面(即 to=”/login”),当 isAuth 的值为 false 时,会自动触发导航。当 isAuth 的值为 true 时,将会显示 组件和对应子路由。
// https://www.pipipi.net/27853.html
// https://zhuanlan.zhihu.com/p/518339176
return (
//Navigate 可以根据一些条件来激活导航
{isAuth ? : }
);
}
function Home() {
const [sum, setSum] = useState(1);
return (
我是Home的内容
{sum === 2 ? : 当前sum的值是:{sum}
}
);
}
```
## 路由注册的写法(复杂的写法)
- 缺点: 当组件很多时,这样写非常累赘(可以通过 useRoutes 解决这一问题)
```jsx
}>
}>
}>
```
### useRoutes 配置路由
> useRoutes 是 React Router v6 中的一个 Hook,用于定义和渲染路由。它接受一个配置对象作为参数,该对象用于定义路由规则和对应的组件。
```jsx
import { NavLink, useRoutes } from 'react-router-dom';
const routes = [
{ path: '/', element: },
{ path: '/home', element: },
{ path: '/not-find', element: }
];
const ele = useRoutes(routes);
```
## 嵌套路由
- 页面中要配套 Outlet 一起使用
```jsx
{
path: '/project-list',
element: ,
children: [
{ path: 'add', element: },
{ path: 'edit', element: }
]
},
// 页面中
function ProjectList() {
return (
<>
项目列表页
>
);
}
```
#### 嵌套路由 to 的三种写法(其余写法都会出错)
```jsx
News
News
News
```
## 路由跳转
> NavLink 和 Link 都是 React Router 库中的组件,用于实现页面路由导航,让用户可以在单页应用中自由地切换页面视图。
- Link 组件是最简单的路由导航器,它可以通过设置 to 属性来导航到指定的路由路径
```jsx
About
```
- NavLink 的高亮效果
> NavLink 组件在实现路由导航功能的同时,还提供了一些额外的样式控制功能,例如可以为当前活跃路由添加自定义样式或类名。使用时,将 className 的返回值写成一个函数即可
```jsx
(isActive ? "list-group-item myCustomClassName" : "list-group-item")} to="/about">
About
Home
```
## 路由传参和接收参数
- Params 参数的传递与接受(useParams)
```jsx
// 传递参数
{m.title}
//路由配置
{
path: "message",
element: ,
children: [
{
path: "detail/:id",
element:
}
]
},
//接收参数
import { useParams } from "react-router-dom";
const { id } = useParams();
```
- Search 参数的传递与接受(useSearchParams)
- useSearchParams 来获取当前 URL 中的查询参数。useSearchParams 返回一个元组,包含当前的查询参数对象和一个可以设置新的查询参数对象的函数 setSearchParams。
- setSearch 可以更改 search 参数,也可以更新视图
```jsx
// 传递参数
{m.title}
//路由配置
{
path: "message",
element: ,
children: [
{
path: "detail",
element:
}
]
},
//接收参数
import { useSearchParams } from "react-router-dom";
const [search, setSearch] = useSearchParams();
const id = search.get("id");
```
- state 参数传递和接收(useLocation)
> state 参数不会使路由 url 发生变化
```jsx
//state参数的传递非常简单,标签内定义state属性即可
{m.title}
;
import { useLocation } from 'react-router-dom';
const { state } = useLocation();
console.log(state.id);
```
## 编程式导航
- react-router-dom v4 可以使 withRouter (函数组件里可以用这个方法), class组件里可以直接 this.props.history.push
- react-router-dom v5 是使用 useHistory
- react-router-dom v6开始 useNavigate取代了原先版本中的useHistory
> 我们通过 Link 组件或者 NavLink 组件实现跳转,某些情况下,我们可能需要其他形式实现跳转,比如通过一个按钮实现路由跳转。这个时候,我们就需要编程式导航。
- 通过 useNavigate 这个 hook 函数实现
- navigate 可以接受两个参数,第二个参数一个可选项,包含以下选项:
- replace:当为 true 时,将当前导航记录替换为新路径,而不是在历史记录中创建一个新的导航记录。
- state:一个任意类型的值,将其作为状态传递给新页面。
- 注意: navigate 内我们定义的是 state 参数,因此,路由的接受也需要使用类似形式
```jsx
import { useNavigate } from 'react-router-dom';
const navigate = useNavigate();
//跳转页面,传递参数
function goDetail(m) {
navigate('detail', {
replace: false,
state: {
id: m.id
}
});
}
//获取参数
const { state } = useLocation();
console.log(state.id);
```
## useInRouterContext 可以判断当前组件是否被组件包裹。
```jsx
import React from 'react';
import ReactDOM from 'react-dom/client';
import { BrowserRouter } from 'react-router-dom';
import App from './App';
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
);
import { NavLink, useRoutes, useInRouterContext } from 'react-router-dom';
console.log(useInRouterContext()); // true
```