:::tips 原理:不同的路径对应不同的单文件组件,当路径发生变化的时候,我们需要切换对应的组件。
react-router-dom使用的组件

  • HashRouter-hash的路由模式 底层原理是监听hashchange事件 实现组件的切换。
  • BrowserRouter-history的路由模式 路由的底层原理是不一样的。
  • Link组件-路由跳转的组件。
  • NavLink组件-路由跳转的组件,可以自定义相关的样式。
  • Route组件-组件的占位符。
  • Switch组件-排他思想,在Switch组件中只匹配最开始的组件,其余的组件不再进行匹配。
  • WithRouter高阶组件-使用路由将应用的组件进行包裹,并且可以将路由的相关参数传递过来。 :::

1 使用路由传递参数

:::info 传递参数的三种形式:

  • “/detail/:id”对应的就是Detail组件,id就是传递的参数。”/detail/123”或者”/detail/abc”都可匹配上述的路径。
  • search查询模式。”/detain?name=coderweiwei&age=19”,也是可以传递参数的。
  • to属性可以传递一个对象,我们可以将参数放在这个对象中,在路由之间进行传递。 :::

2 路由表的使用

:::info 路由表与组件是一一对应的关系,我们可以将这个关系单独提出来,使用一个配置文件的形式,这样的话,更加实用的话更加简洁、方便。 :::

2.1 原始嵌套路由的使用

  1. index.js文件
  2. // 需要使用BrowserRouter或者hashRouter对整个应用程序进行包裹,方便react-router将路由相关的属性传递都我们任意组件中去。
  3. import React from 'react';
  4. import ReactDOM from 'react-dom';
  5. import App from './App';
  6. import "./App.css";
  7. import { BrowserRouter } from "react-router-dom";
  8. ReactDOM.render(
  9. <BrowserRouter>
  10. <App />
  11. </BrowserRouter>,
  12. document.getElementById('root')
  13. );
  1. // App组件
  2. // 引入路由相关的组件 HashRouter
  3. // import { HashRouter, Link, Route } from "react-router-dom";
  4. // 使用history模式
  5. import { Link, Route, Switch, withRouter } from "react-router-dom";
  6. import Home from "./views/Home";
  7. import About from "./views/About";
  8. import Profile from "./views/Profile";
  9. import Product from "./views/Product";
  10. function App(props) {
  11. const handleClick = () => {
  12. console.log(props)
  13. // 手动跳转路由
  14. props.history.push("/product")
  15. }
  16. // 渲染函数
  17. return (
  18. <div className="App">
  19. {/* 路由切换区域 */}
  20. <Link to="/">首页</Link>
  21. <Link to="/about">关于</Link>
  22. <Link to="/profile">我的</Link>
  23. <button onClick={handleClick}>商品展示</button>
  24. {/* 路由展示区域 */}
  25. <Switch>
  26. <Route exact path='/' component={Home} />
  27. <Route path="/about" component={About} />
  28. <Route path='/profile' component={Profile} />
  29. <Route path='/product' component={Product} />
  30. </Switch>
  31. </div>
  32. );
  33. }
  34. export default withRouter(App);
  1. // About嵌套子组件
  2. import React, { PureComponent } from 'react'
  3. import { NavLink, Route, Switch } from 'react-router-dom'
  4. // 子组件
  5. function Resume() {
  6. return <h2>简历投递</h2>
  7. }
  8. // 子组件
  9. function Culture() {
  10. return <h2>文化建设</h2>
  11. }
  12. // 子组件
  13. function Contract() {
  14. return <h2>联系我们</h2>
  15. }
  16. // 子组件
  17. function Join() {
  18. return <h2>加入我们</h2>
  19. }
  20. export default class About extends PureComponent {
  21. // 处理事件
  22. joinUs() {
  23. // 在子组件中 路由的相关属性通过组件的props传递过来了
  24. console.log(this.props)
  25. // 从属性中获取history对象
  26. const { history } = this.props;
  27. // 手动实现路由跳转
  28. history.push("/about/join")
  29. }
  30. render() {
  31. return (
  32. <>
  33. <h2>About组件</h2>
  34. <hr />
  35. {/* 导航的菜单 */}
  36. <NavLink exact to="/about">简历投递</NavLink>
  37. <NavLink to="/about/culture">文化建设</NavLink>
  38. <NavLink to="/about/contract">联系我们</NavLink>
  39. <button onClick={() => this.joinUs()}>加入我们</button>
  40. <hr />
  41. {/* 导航组件的占位符 */}
  42. <Switch>
  43. <Route exact path="/about" component={Resume} />
  44. <Route path="/about/culture" component={Culture} />
  45. <Route path="/about/contract" component={Contract} />
  46. <Route path="/about/join" component={Join}/>
  47. </Switch>
  48. </>
  49. )
  50. }
  51. }

2.2 使用路由表(统一路由配置)来展示路由

  1. // 安装插件 新的路由表统一在单独的js文件中进行配置 然后统一导出
  2. yarn add react-router-config
  3. // 路由映射表
  4. // 引入对应的组件
  5. import About, { Contract, Culture, Join, Resume } from "../views/About";
  6. import Home from "../views/Home"
  7. import Product from "../views/Product";
  8. import Profile from "../views/Profile";
  9. const routes = [
  10. {
  11. path: '/',
  12. exact: true,
  13. component: Home
  14. },
  15. {
  16. path: '/about',
  17. component: About,
  18. routes: [
  19. {
  20. path: '/about',
  21. exact: true,
  22. component: Resume
  23. },
  24. {
  25. path: '/about/culture',
  26. component: Culture
  27. },
  28. {
  29. path: '/about/contract',
  30. component: Contract
  31. },
  32. {
  33. path: '/about/join',
  34. component: Join
  35. }
  36. ]
  37. },
  38. {
  39. path: "/profile",
  40. component: Profile
  41. },
  42. {
  43. path: "/product",
  44. component: Product
  45. }
  46. ]
  47. export default routes;

3 一级路由的配置

  1. // 引入路由相关的组件 HashRouter
  2. // import { HashRouter, Link, Route } from "react-router-dom";
  3. // 使用history模式
  4. import { Link, withRouter } from "react-router-dom";
  5. // 使用react-router-config插件
  6. import { renderRoutes } from "react-router-config";
  7. // 引入需要渲染的路由表
  8. import routes from "./router";
  9. // import Home from "./views/Home";
  10. // import About from "./views/About";
  11. // import Profile from "./views/Profile";
  12. // import Product from "./views/Product";
  13. function App(props) {
  14. console.log(props)
  15. const handleClick = () => {
  16. // 手动跳转路由
  17. props.history.push("/product")
  18. }
  19. // 渲染函数
  20. return (
  21. <div className="App">
  22. {/* 路由切换区域 */}
  23. <Link to="/">首页</Link>
  24. <Link to="/about">关于</Link>
  25. <Link to="/profile">我的</Link>
  26. <button onClick={handleClick}>商品展示</button>
  27. {/* 路由展示区域 */}
  28. {/* <Switch>
  29. <Route exact path='/' component={Home} />
  30. <Route path="/about" component={About} />
  31. <Route path='/profile' component={Profile} />
  32. <Route path='/product' component={Product} />
  33. </Switch> */}
  34. {/* 路由展示区域 使用react-router-config */}
  35. {renderRoutes(routes)}
  36. </div>
  37. );
  38. }
  39. export default withRouter(App);

4 嵌套路由的配置

  1. import React, { PureComponent } from 'react'
  2. import { NavLink } from 'react-router-dom'
  3. // 使用react-router-config
  4. import { renderRoutes } from 'react-router-config'
  5. // 引入需要渲染的路由表 已经在组件的属性上了 不需要引入了
  6. // import routes from "../router";
  7. // 子组件
  8. export function Resume() {
  9. return <h2>简历投递</h2>
  10. }
  11. // 子组件
  12. export function Culture() {
  13. return <h2>文化建设</h2>
  14. }
  15. // 子组件
  16. export function Contract() {
  17. return <h2>联系我们</h2>
  18. }
  19. // 子组件
  20. export function Join() {
  21. return <h2>加入我们</h2>
  22. }
  23. export default class About extends PureComponent {
  24. // 处理事件
  25. joinUs() {
  26. // 在子组件中 路由的相关属性通过组件的props传递过来了
  27. console.log(this.props)
  28. // 从属性中获取history对象
  29. const { history } = this.props;
  30. // 手动实现路由跳转
  31. history.push("/about/join")
  32. }
  33. render() {
  34. // 获取react-router-config传递过来的路由映射表
  35. console.log(this.props)
  36. const routes = this.props.route.routes;
  37. return (
  38. <>
  39. <h2>About组件</h2>
  40. <hr />
  41. {/* 导航的菜单 */}
  42. <NavLink exact to="/about">简历投递</NavLink>
  43. <NavLink to="/about/culture">文化建设</NavLink>
  44. <NavLink to="/about/contract">联系我们</NavLink>
  45. <button onClick={() => this.joinUs()}>加入我们</button>
  46. <hr />
  47. {/* 导航组件的占位符 */}
  48. {/* <Switch>
  49. <Route exact path="/about" component={Resume} />
  50. <Route path="/about/culture" component={Culture} />
  51. <Route path="/about/contract" component={Contract} />
  52. <Route path="/about/join" component={Join}/>
  53. </Switch> */}
  54. {/* 使用react-router-config提供的函数来渲染路由表 */}
  55. { renderRoutes(routes) }
  56. </>
  57. )
  58. }
  59. }