使用creat-react-app创建的React项目并没有自带Router,需要自行去React Router官网安装。
Get Start
yarn add react-router-dom //注意使用typescript时还要安装支持typescript的
yarn add --dev @types/react-router-dom
官方例子展示:
import React from "react";
import {
BrowserRouter as Router,
Switch,
Route,
Link
} from "react-router-dom";
export default function App() {
return (
<Router>
<div>
<nav>
<ul>
<li>
<Link to="/">Home</Link>
</li>
<li>
<Link to="/about">About</Link>
</li>
<li>
<Link to="/users">Users</Link>
</li>
</ul>
</nav>
{/* A <Switch> looks through its children <Route>s and
renders the first one that matches the current URL. */}
<Switch>
<Route path="/about">
<About />
</Route>
<Route path="/users">
<Users />
</Route>
<Route path="/">
<Home />
</Route>
</Switch>
</div>
</Router>
);
}
function Home() {
return <h2>Home</h2>;
}
function About() {
return <h2>About</h2>;
}
function Users() {
return <h2>Users</h2>;
}
React路由
Hash路由与history路由
React路由支持Hash模式和History模式,History模式需要后端支持。
import BrowserRouter as Router from "react-router-dom"; //History模式
import HashRouter as Router from "react-router-dom"; //Hash模式
匹配顺序
React Router路由是自上而下逐一匹配,即先看上面的地址发现不匹配匹配下一个。由此,如果需要制作一个404页面路由就可以在最底部添加路由,即404路由:
<Route path="*"> //匹配所有,即匹配除上述路由以外的所有路由
<NoMatch/>
</Route>
function NoMatch() {
return <h2>该页面不存在</h2>;
}v
匹配精度
默认路由是模糊匹配,即路由/tag能匹配到/home,/home/1,/home/2…,当你输入的地址为/home/1时,Router所展示的界面是/home的。
要解决这个问题,需要引入精准匹配。
<Route path="/about" exact={true}> //开启精准匹配,可简写为exact
<About />
</Route>
default Router
import {Redirect} from 'react-router-dom';
<Redirect exact from="/" to="/home"/> //默认页面跳转至/home页面
useParams
当需要获取url后的参数就需要使用该功能。官方介绍
import React from "react";
import ReactDOM from "react-dom";
import {
BrowserRouter as Router,
Switch,
Route,
useParams
} from "react-router-dom";
function BlogPost() {
let { slug } = useParams(); //获取到url后面的参数
return <div>Now showing post {slug}</div>;
}
ReactDOM.render(
<Router>
<Switch>
<Route exact path="/">
<HomePage />
</Route>
<Route path="/blog/:slug"> //匹配任意非/内容,名字为slug
<BlogPost />
</Route>
</Switch>
</Router>,
node
);
的一个特殊版本,当呈现元素与当前URL匹配时,它将向呈现元素添加样式属性。并不支持
//给选中的元素添加ClassName="selected",然后通过CSS添加样式
<NavLink to="/faq" activeClassName="selected">
FAQs
</NavLink>