React中使用路由
安装
安装Route
组件:
npm i react-router-dom
Route组件介绍
BrowserRouter
:所有需要路由的组件,都要包裹在BrowserRouter
组件内Link
:跳转到某个链接,to
属性表示跳转到的链接Routes
:类似于C++中的switch
,匹配第一个路径Route
:路由,path
属性表示路径,element
属性表示路由到的内容useParams
和useSearchParams
获取路径参数Navigate
:和Route
组件组合使用来实现重定向
使用
BrowserRouter
引入
import { BrowserRouter } from 'react-router-dom';
使用BrowserRouter
在root.render()中用<BrowserRouter></BrowserRouter>
将App组件(或者自己定义的其他有使用路由的组件)括起来。
例如
<BrowserRouter>
<App />
</BrowserRouter>
Link
引入
import { Link } from 'react-router-dom';
使用
将页面内部跳转所用到的<a href="..."></a>
改为 <Link to="..."></Link>
,其他保持不变
Routes和Route
引入
import {Routes, Route} from 'react-router-dom';
使用
先写一个<Routes></Routes>
标签,然后在里面写<Route />
标签
其中<Route />
标签中有两个参数一个是path
另外一个是element
,path中放匹配的路径,element中放要渲染的标签
例如
<Routes>
<Route path='/' element={<Home />}/>
<Route path='like' element={<Like />}/>
<Route path='about' element={<About />}/>
<Route path='issues' element={<Issues />}/>
</Routes>
element中不仅可以放组件的标签,正常的html标签也可以放
例如:
<Routes>
<Route path='/' element={<h1>Hello world</h1>}/>
</Routes>
嵌套路由
<Route path="/web" element={<Web />}>
<Route index path="a" element={<h1>a</h1>} />
<Route index path="b" element={<h1>b</h1>} />
<Route index path="c" element={<h1>c</h1>} />
</Route>
注意:需要在父组件中添加<Outlet />
组件,用来填充子组件的内容。(即<Outlet />
会根据路由的不同动态的渲染不同的子标签,假如当前的路由为/web/a
则<Outlet />
等效于<h1>a</h1>
)
useParams 和 useSearchParams
URL中传递参数
解析URL:
<Route path="/linux/:chapter_id/:section_id/" element={<Linux />} />
获取参数,类组件写法:
import React, { Component } from 'react';
import { useParams } from 'react-router-dom';
class Linux extends Component {
state = { }
render() {
console.log(this.props.params);
return <h1>Linux</h1>;
}
}
export default (props) => (
<Linux
{...props}
params={useParams()}
/>
)
函数组件写法:
import React, { Component } from 'react';
import { useParams } from 'react-router-dom';
const Linux = () => {
console.log(useParams());
return (<h1>Linux</h1>);
}
export default Linux;
Search Params传递参数
类组件写法:
import React, { Component } from 'react';
import { useSearchParams } from 'react-router-dom';
class Django extends Component {
state = {
searchParams: this.props.params[0], // 获取某个参数
setSearchParams: this.props.params[1], // 设置链接中的参数,然后重新渲染当前页面
}
handleClick = () => {
this.state.setSearchParams({
name: "abc",
age: 20,
})
}
render() {
console.log(this.state.searchParams.get('age'));
return <h1 onClick={this.handleClick}>Django</h1>;
}
}
export default (props) => (
<Django
{...props}
params={useSearchParams()}
/>
);
函数组件写法:
import React, { Component } from 'react';
import { useSearchParams } from 'react-router-dom';
const Django = () => {
let [searchParams, setSearchParams] = useSearchParams();
console.log(searchParams.get('age'));
return (<h1>Django</h1>);
}
export default Django;
Navigate
引入
import {Routes, Route, Navigate} from 'react-router-dom';
使用
<Route path="*" element={ <Navigate replace to="/404" /> } />