title: React 路由 date: 2020-05-10 13:59:49
tags: React
安装 react-router-dom
可以使用<Link>,<NavLink>
标签
1
| npm install react-router-dom --save
|
创建路由模式
- hash 模式
- history 模式
1 2 3 4
| import { BrowserRouter as Router, Link, Route } from "react-router-dom";
import { Link, Route, HashRouter as Router } from "react-router-dom";
|
as
类似于起别名,方便简化名称.
创建路由
需要通过使Route
进行对组件的声明配置,才能被Link
找到.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| import React from "react";
import { BrowserRouter as Router, Link, Route, Switch } from "react-router-dom";
function Page1() { return <h1>我是Page1</h1>; }
function Page2() { return <h1>我是Page2</h1>; }
function Page3() { return <h1>我是Page3</h1>; }
class App extends React.Component { constructor(props) { super(props); this.state = {}; }
render() { return ( <div className="App"> <Router> <ul> <li> <Link to="page1">Page1</Link> </li> <li> <Link to="page2">Page2</Link> </li> <li> <Link to="page3">Page3</Link> </li> </ul> <Route exact path="/page1" component={Page1}></Route> <Route exact path="/page2" component={Page2}></Route> <Route exact path="/page3" component={Page3}></Route> </Router> </div> ); } } export default App;
|
函数式(带组件)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| import React from "react"; import { BrowserRouter as Router, Route, Switch, Link } from "react-router-dom"; import Login from "./pages/login"; import Home from "./pages/home"; import App from "./pages/app";
export default function ARouter() { return ( <Router> <Switch> <Route exact path="/" component={App}></Route> <Route path="/home" component={Home}></Route> <Route path="/login" component={Login}></Route> </Switch> </Router> ); }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| import React from "react";
import { Link } from "react-router-dom";
function App() { return ( <div className="App"> <Link to="/home">去首页</Link> <Link to="/login">去登陆</Link> </div> ); }
class App extends React.Component { handleJump = () => { this.props.histroy.push("/login"); }; render() { return ( <div className="container"> <Link to="/login"></Link> <Link to="/home"></Link> <Button onClick={handleJump}>点击去登陆</Button> </div> ); } }
export default App;
|
如果用Switch
,浏览器输入/home
也只会加载 App 页,因为/home
先匹配了/
加上 exact
可以精准匹配
如果导入的是HashRouter
,会自动加上#
如 http://localhost:3000/login#/
手动跳转
当你使用 History 路由的时候,某些时候需要主动的跳转道某个路由,
这时又不能去触发节点行为,所以这个时候就可以通过 API 的方式,进行跳转.
1 2 3 4 5 6
| this.props.history.push(参数和to的内容相似); this.props.history.push("page1");
this.props.history.replace("page2");
|
当然还有 hash 的 go 方法。
动态路由
路由传值
路由传参(传值)一般使用params
和query
.
通过给to
传递一个对象的方式进行数据传递.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| <div className="App"> <Router> <ul> <li> <Link to={{ pathname: "/page1/10", search: "?roles=[10, 20]", state: { name: "Tom" }, }} > Page1 </Link> </li> <li> <Link to="page2">Page2</Link> </li> <li> <Link to="page3">Page3</Link> </li> </ul> <Route exact path="/page1/:id" component={Page1}></Route> <Route exact path="/page2" component={Page2}></Route> <Route exact path="/page3" component={Page3}></Route> </Router> </div>
|
可以看到,向page1
的路由上添加了一个:id
表示需要传递param
的id
的值,
同时声明了search
的文本和state
对象多种方式传递了参数。以便根据不同的场景使用。
路由 Hooks
useParams: 获取参数(内部封装)
如果在有状态组件(也就是 class 声明的类中)获取参数,需要通过this.props.match.parmas.id
.
而在函数式组件(无状态组件)中获取,需要通过useParams()
useHistory: 通过 JS Api 操作路由跳转
函数式组件没有作用域,this 为 undefined.所以需要使用 useHistory 进行跳转.
如果在有状态组件中,需要this.props.history.push('/')
进行跳转.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| function Detail() { const params = useParams(); const history = useHistory(); return ( <div> <p>当前的参数值为: {params.goodId}</p> <button onClick={() => { history.push("/"); }} > 跳转 </button> </div> ); }
|