# react-question-v5
**Repository Path**: qing-icon/react-question-v5
## Basic Information
- **Project Name**: react-question-v5
- **Description**: 框架:react、
路由:react-router-dom v5 版本、
主要内容:calss 类 编写
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: router-v5
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2022-03-09
- **Last Updated**: 2023-03-13
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
1.项目是由 **npx create-react-app my-app** 脚手架搭建
2.进入项目 **cd my-react-first**
3.下载相关依赖 **yarn** or **npm install**
4.运行项目
#### **`yarn start`**
Runs the app in the development mode.
Open [http://localhost:3000](http://localhost:3000) to view it in the browser.
5.安装 **react-router-dom** 如果不了解可以[戳这里:react-router 官网](https://reactrouter.com/)
- ps:不要有疑惑 react-router-dom 只不过是 react-router的一个分支
6.路由配置 (ps:看起来很简单,摸索起来确实挺困谈)
```
import React from 'react';
import ReactDOM from 'react-dom';
import { BrowserRouter, Routes, Route } from 'react-router-dom'
import App from './App.jsx'
import Home from './pages/Home'
import Mine from './pages/tabbar/mine'
import Class from './pages/tabbar/class'
ReactDOM.render(
} >
} /> //索引路由
} />
} />
/>
,
document.getElementById('root')
);
```
- `` 和 `` 都行,只不过前端展示形式不一样而已
- `` 组件里面嵌套路由,` `和`` 先要显示 必须在 `` 里面挖个坑(和vue中的 ``)类似 ,React-router 中叫做 ``
```
import { Link, Outlet } from 'react-router-dom'
render() {
return (
)
}
```
###5 router.js 单独抽出router
##### router.js 代码
```
import React from 'react';
import Home from '../pages/home'
import Detail from '../pages/detail'
import Text from '../pages/text/index'
import TextOne from '../pages/text/children/textOne'
import TextToo from '../pages/text/children/textToo'
export const whiteRoutes = [
{
path: '/home',
component:
},
{
path: '/detail',
component:
},
{
path: '/text',
component: ,
redirect:,
children: [
{
path: 'textOne',
component: ,
},
{
path: 'textToo',
component: ,
},
]
}
]
```
#### index.js 文件如下:
```
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App.jsx'
import { BrowserRouter, Routes, Route } from 'react-router-dom'
import { whiteRoutes } from './router/index'
ReactDOM.render(
} >
{
whiteRoutes.map(route => (
route.children ?
{
route.redirect
?
:
}
{
route.children.forEach(val => )
}
:
))
}
,
document.getElementById('root')
);
```
- 这种写法本质上和全部写在index.js中没有什么区别,只是定义的更像vue 更加统一而已
- 并且还能做更加详细的拆分
#### index.js 将路由进行封装
- 上面的代码,未进行封装,路由只能增加到第二层,所以对路由进行封装
```
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App.jsx'
import { BrowserRouter, Routes, Route } from 'react-router-dom'
import { whiteRoutes } from './router/index'
ReactDOM.render(
} >
{rouerDom(whiteRoutes)}
,
document.getElementById('root')
);
function rouerDom(items) {
return items.map(route =>
route.children ?
{
route.redirect
?
:
}
{rouerDom(route.children)}
:
)
}
```
#### 未找到 线路
当没有其他路由与 URL 匹配时,您可以使用path="*". 此路由将匹配任何 URL,但具有最弱的优先级,因此路由器仅在没有其他路由匹配时才会选择它。
```
function App() {
return (
} />
} />
} />
);
}
```
#### 全局定义
```
//index.js
React.Component.prototype.$http = 'www.baidu.com'
```
#### [链路式导航](https://reactrouter.com/docs/en/v6/getting-started/tutorial#navigating-programmatically)
- 目前react-router-map v6 版本只支持 Hook 链路式导航,我也是很悲催了 ,所以链路导航就只更新到了 /text/textToo 路由。
- 我将复制代码更换版本库,降低react-router 的版本继续更新,至于这个,就先放在这里吧 。
- 在当前的基础上创建了一个新的分支 router-v5 用来承载降低版本后的代码
- 降低 react-router-dom 版本到v5
### router-v5 分支
>在react-router-dom 降低到v5版本之后, 就不能像v6版本一样在js统一的地方定义路由,而是在同一级别下的路由可以定义到一起。想要嵌套路由,则在嵌套路由的页面再增加路由,
这无疑是将页面路由分开来写了 。
index.js 如下:
```
//index.js
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App.jsx'
import { BrowserRouter, Switch, Route } from 'react-router-dom'
import Text from './pages/text/index'
ReactDOM.render(
,
document.getElementById('root')
);
```
text/index.jsx 如下
```
//text/index.jsx
import React from 'react';
import { Switch, Route } from 'react-router-dom'
import textOne from './children/textOne'
import textToo from './children/textToo'
export default class Text extends React.Component {
componentDidMount() {
console.log(this);
}
render() {
return (
我是text文件
{/* */}
)
}
}
```
**注意:** `` ,必须写在路由的最后面,因为js是从上向下执行,当先执行它时后面的路由就无法跳转了,
问题2:当进入未定的路由的时候怎么办(路由守卫)
解决办法:用`Redirect` , 它和v6版本区别很大,必须这样写
```
```
**注意:** 应该先定义路由,再确定重定向所需要的路由
One" component={textOne}>
)
}
}
```
- 同样我们可以在每个需要嵌套路由的页面都增加一个router.js 用以存放当前路由
- 这样写路由诚然也是一种新的思路
- 但由于想要要实现vue那样统一管理路由就没了办法
- 所以我发现了一个能够将路由统一管理的插件 react-router-config
#### 问题1:当路由到 '/text' 的时候,嵌套的两个组件没有出现
解决办法 :
```
import React from 'react';
import { Switch, Route } from 'react-router-dom'
import textOne from './children/textOne'
import textToo from './children/textToo'
export default class Text extends React.Component {
componentDidMount() {
console.log(this);
}
render() {
return (
我是text文件
{/* */}
)
}
}
```
**注意:** `` ,必须写在路由的最后面,因为js是从上向下执行,当先执行它时后面的路由就无法跳转了,
#### 问题2:当进入未定的路由的时候怎么办(路由守卫)
解决办法:用`Redirect` , 它和v6版本区别很大,必须这样写
```
```
**注意:** 应该先定义路由,再确定重定向所需要的路由
#### 问题3:当在最外层路由不匹配的时候能重定向到 '/NotFound' 页面。但是当在/text嵌套路由下的时候,不能进行重定向,且不匹配的路由都进入到默认中的路由中了 ,就比如 /text/222 => /text/textToo
解决办法:
## router-v5 分支下
### 我将再创建一个分支,名字为react-router-config分支
### router -v5-001:仿照config思路封装路由