1. 创建项目 npx create-react-app react-router-demo
  2. 安装 cnpm i react-router-dom —save

**

  1. import {BrowserRouter as Router, Switch, Route, Link} from 'react-router-dom'
  2. // hash路由
  3. import {HashRouter as Router, Switch, Route, Link} from 'react-router-dom'
  4. function App() {
  5. return (
  6. <div className="App">
  7. 123
  8. // 用Router 最外层包裹
  9. <Router>
  10. // 组件大写 路由小写
  11. <Route path='/home' component={ Home }></Route>
  12. <Route path='/mine' component={ Mine }></Route>
  13. </Router>
  14. </div>
  15. );
  16. }
  • 组件分开归类
  1. // import {BrowserRouter as Router, Switch, Route, Link} from 'react-router-dom'
  2. import {HashRouter as Router, Route} from 'react-router-dom'
  3. import Nav from './components/nav'
  4. /**
  5. * HashRouter 锚点链接
  6. * BrowserRouter h5新特性 history.push(), 上线后需要后台做一些处理, 重定向处理,404bug
  7. */
  8. function App() {
  9. return (
  10. <div className="App">
  11. 123
  12. <Router>
  13. <Nav />
  14. <Route path='/home' component={ Home }></Route>
  15. <Route path='/mine' component={ Mine }></Route>
  16. </Router>
  17. </div>
  18. );
  19. }
  20. export default App;
  21. ---------------------------------
  22. import React from 'react';
  23. import {Link} from 'react-router-dom'
  24. export default class Nav extends React.Component{
  25. render() {
  26. return (
  27. <ul>
  28. <li>
  29. <Link to='/home'>首页</Link>
  30. </li>
  31. <li>
  32. <Link to='/mine'>我的</Link>
  33. </li>
  34. </ul>
  35. )
  36. }
  37. }
  • 精确匹配 exact
  1. // 路由包含字段就会显示, 要用精确匹配
  2. <Route exact path='/mine' component={ Mine }></Route>
  3. <Route path='/mine/ucenter' component={ UCenter }></Route>
  • 精准匹配 strict 和 exact同时使用, /mine可以访问,/mine/ 不可以访问
  1. <Route strict exact path='/mine/ucenter' component={ UCenter }></Route>
  • Switch 只显示一个页面 , 包裹Route
  1. function App() {
  2. return (
  3. <div className="App">
  4. 123
  5. <Router>
  6. <Nav />
  7. <Switch>
  8. <Route strict exact path='/' component={ Home }></Route>
  9. <Route exact path='/mine' component={ Mine }></Route>
  10. <Route strict exact path='/mine/ucenter' component={ UCenter }></Route>
  11. <Route component={ NotFound }></Route>
  12. </Switch>
  13. </Router>
  14. </div>
  15. );
  16. }

render渲染方式

  1. <Route exact path='/demo' component={ () => <div>hello demo</div> }></Route>
  2. // 引入 传参,不会在 url中显示参数
  3. <Route exact path='/demo1' component={ (props) => <Demo {...props} name='你好'/> }></Route>
  1. import React from 'react';
  2. const Demo = (props) => {
  3. console.log(props)
  4. return (
  5. <div>
  6. demo {props.name}
  7. </div>
  8. )
  9. }
  10. // 或者 解构赋值
  11. const Demo = ({name}) => {
  12. return (
  13. <div>
  14. demo {props.name}
  15. </div>
  16. )
  17. }
  18. export default Demo

选中的路由高亮

-activeClassName 修改 激活的 类名
-activeStyle 双大括号, 行内 样式
-exact精确匹配

  1. import React from 'react';
  2. import {Link, NavLink} from 'react-router-dom'
  3. import './style.css'
  4. export default class Nav extends React.Component{
  5. render() {
  6. return (
  7. <ul>
  8. <li>
  9. <NavLink exact className="NavLink" activeClassName="active" to='/'>首页</NavLink>
  10. </li>
  11. <li>
  12. <NavLink exact className="NavLink" activeStyle={{color:'orange'}} to='/mine'>我的</NavLink>
  13. </li>
  14. <li>
  15. <NavLink exact className="NavLink" to='/mine/ucenter'>center</NavLink>
  16. </li>
  17. </ul>
  18. )
  19. }
  20. }
  • 选中的样式
    1. .NavLink.active {
    2. color: red;
    3. }

路由跳转 path 传参

  • 参数后面 问号? 代表这个参数可有可无 ```javascript

// 接收 const UCenter = (props) => { return (

你好center {props.match.params.id}
) }

  1. <a name="VpRBg"></a>
  2. ### url ? 传参
  3. - [http://localhost:3000/#/mine?name=啦啦啦&sex=male](http://localhost:3000/#/mine?name=我那个&age=male)
  4. 两种获取参数的方式
  5. ```javascript
  6. import React from 'react';
  7. import querystring from 'querystring'
  8. /**
  9. * 正常是 先问号 再 hash
  10. * 注意 ?参数 在 哈希中 还是正常的url中 localtion.search 会拿不到
  11. */
  12. const Mine = (props) => {
  13. // 第一种方式
  14. // const params = new URLSearchParams(props.location.search)
  15. // console.log(params.get('name'))
  16. // 第二种方式
  17. const value = querystring.parse(props.location.search.slice(1))
  18. console.log(value)
  19. return (
  20. <div>
  21. mineminemine
  22. </div>
  23. )
  24. }
  25. export default Mine
  • 对象传值
  1. <NavLink
  2. to={{
  3. pathname: '/mine',
  4. search: '?sort=name',
  5. hase: '#hash',
  6. state: { flag: 'flag' } // 隐式传参,url不显示
  7. }}
  8. >我的</NavLink>

页面权限

  • 怎么不用每个页面都引入 全局公共的 ? vue有 路由拦截, 一次就好 ```javascript import React from ‘react’; import {Redirect} from ‘react-router-dom’

const Shop = () => {

let isLogin = true

return (

{ isLogin ?
商品页面
: }
) }

  1. <a name="Luz1U"></a>
  2. #### 页面点击跳转 ,
  3. - 函数型 直接可以使用props
  4. ```javascript
  5. const Mine = (props) => {
  6. /**
  7. * push 铁架的上一次的页面依然存在内存中
  8. * replace 是替换, 上一次的页面不存在了
  9. */
  10. const routerHome = () => {
  11. props.history.push('/')
  12. }
  13. return (
  14. <div>
  15. mineminemine
  16. <button onClick={ routerHome }>回到Home</button>
  17. </div>
  18. )
  19. }
  • 类 需要使用 withRouter 包裹
  1. import React from 'react';
  2. import { withRouter } from 'react-router-dom'
  3. class MineDemo extends React.Component {
  4. handleBack = () => {
  5. console.log(this.props) // 不用withRouter, 空对象
  6. this.props.history.push('/')
  7. }
  8. // 当前组件没有直接被路由管理,所以没有对象
  9. // withRouter
  10. render() {
  11. return (
  12. <div>
  13. <button onClick={ this.handleBack }>回到homedemo</button>
  14. </div>
  15. )
  16. }
  17. }
  18. // 高阶组件
  19. export default withRouter(MineDemo)

页面离开前判断 (Prompt)

  1. import React from 'react';
  2. import { Prompt } from 'react-router-dom'
  3. export default class BeforeLeave extends React.Component {
  4. state = {
  5. val: ''
  6. }
  7. render() {
  8. return (
  9. <div>
  10. <input type="text" value={ this.state.val } onChange={ (e) => {this.setState({val: e.target.value})}}/>
  11. <Prompt
  12. when={ !!this.state.val } //转为boolean 值, false 随便跳转, true 弹出提示
  13. message={ '确认离开么' }
  14. />
  15. </div>
  16. )
  17. }
  18. }

路由嵌套

  1. function App() {
  2. return (
  3. <div className="App">
  4. 123
  5. <Router>
  6. <Nav />
  7. <Switch>
  8. {/* <Route strict exact path='/book' component={ Book }></Route> */}
  9. <Book>
  10. <Switch>
  11. <Route path='/book/web' component={ WebBook } />
  12. <Route path='/book/java' component={ JavaBook } />
  13. </Switch>
  14. </Book>
  15. <Route component={ NotFound }></Route>
  16. </Switch>
  17. </Router>
  18. </div>
  19. );
  20. }
  • book 组件中需要使用this.props.children 才能显示子路由
  1. import React from 'react';
  2. export default class Book extends React.Component {
  3. render() {
  4. return (
  5. <div>
  6. 我是 book
  7. {
  8. this.props.children
  9. }
  10. </div>
  11. )
  12. }
  13. }