• react-router-dom


    1概念

    单页应用:不刷新,界面局部刷新

    1.1 分类

    前端路由:path-component

    后端路由:path-function

    1.2 路由原理

    借助于BOM中的history,栈结构,默认为push。

    push:压栈,出栈

    repace:替换栈顶记录

    2基本使用

    2.1 v5.3.3

    路由组件(Home):this.props={history/location/match}

    一般组件(Header):this.props={ }

    1. import { withRouter } from 'react-router-dom'
    2. // 一般组件没有history属性等,用withRouter函数解决,返回值是一个新组件
    3. export default withRouter(Header)
    4. console.log(this.props.location.pathname)//地址栏路由
    5. console.log(this.props.match.path)
    6. console.log(this.props.match.url)

    e95ac8e4c2a848c05bcdde6213ac2bb0.png

    index.js

    BrowserRouter:使用H5的history;兼容性差一点;刷新后state参数还在;用的多

    HashRouter:url#后的内容不会发给服务器,兼容性好一点;刷新后state参数不在;解决路径错误问题

    1. import React from 'react';
    2. import ReactDOM from 'react-dom/client';
    3. import App from './App';
    4. // HashRouter带#
    5. import { BrowserRouter } from 'react-router-dom';
    6. const root = ReactDOM.createRoot(document.getElementById('root'));
    7. root.render(
    8. <React.StrictMode>
    9. <BrowserRouter>
    10. <App />
    11. </BrowserRouter>
    12. </React.StrictMode>
    13. );

    App.jsx

    1. import { Route, Link, NavLink, Switch, Redirect } from 'react-router-dom'
    2. export default class App extends Component {
    3. render () {
    4. return (
    5. <div>
    6. <div className="row">
    7. <div className="col-xs-offset-2 col-xs-8">
    8. <Header />
    9. </div>
    10. </div>
    11. <div className="row">
    12. {/* --------导航区-------- */}
    13. <div className="col-xs-2 col-xs-offset-2">
    14. <div className="list-group">
    15. {/* 1.原生html中,靠<a>跳转不同的页面 */}
    16. {/* <a className="list-group-item" href="./about.html">About</a> */}
    17. {/* 2.在React中靠路由链接实现切换组件--编写路由链接 */}
    18. {/*a. 测试模糊匹配(默认) */}
    19. <Link className="list-group-item" to="/about/a/b">About</Link>
    20. {/*b. NavLink点击追加高亮类名 */}
    21. {/* <NavLink activeClassName="demo" className="list-group-item" to="/home">Home</NavLink> */}
    22. {/*c.封装NavLink,标签体内容Home为children属性;默认为push */}
    23. <MyLink to="/home">Home</MyLink>
    24. {/*d.问题:to改为二级路由后刷新:找不到bootstrap文件 ;改为绝对路径:public(React)或者/(常用)*/}
    25. <MyLink to="/test/demo">测试样式丢失</MyLink>
    26. </div>
    27. </div>
    28. {/* --------展示区-------- */}
    29. <div className="col-xs-6">
    30. <div className="panel">
    31. <div className="panel-body">
    32. {/* 注册路由:<Switch>组件匹配成功后,不再匹配其他组件。包裹路由组件,提高路由匹配效率 */}
    33. <Switch>
    34. {/* exact开启精准匹配,需要再开启。 */}
    35. <Route path="/about" component={About} exact />
    36. <Route path="/home" component={Home} />
    37. <Route path="/home" component={Test} />
    38. <Route path="/test/demo" component={Test} />
    39. {/* 匹配不到显示,放到最下面 */}
    40. <Redirect to="/about" />
    41. </Switch>
    42. </div>
    43. </div>
    44. </div>
    45. </div>
    46. </div>
    47. )
    48. }
    49. }

    2.2 v6.3.0

    App.jsx

    1. import { NavLink, Routes, Route, Navigate, useRoutes } from 'react-router-dom'
    2. import routes from './routes'
    3. export default function App () {
    4. function computedClassName ({ isActive }) {
    5. return isActive ? 'list-group-item atguigu' : 'list-group-item'
    6. }
    7. //根据路由表生成对应的路由规则
    8. const element = useRoutes(routes)
    9. return (
    10. <div>
    11. <div className="row">
    12. <Header />
    13. </div>
    14. <div className="row">
    15. <div className="col-xs-2 col-xs-offset-2">
    16. <div className="list-group">
    17. {/* 路由链接:className={()=>{}}函数值可以全局定义实现复用*/}
    18. <NavLink className={computedClassName} to="/about">About</NavLink>
    19. {/* navLInk的end属性会去掉父级高亮 */}
    20. <NavLink className={computedClassName} to="/home" end>Home</NavLink>
    21. </div>
    22. </div>
    23. <div className="col-xs-6">
    24. <div className="panel">
    25. <div className="panel-body">
    26. {/* 1.注册路由:Routes包裹Route:path-element ;caseSensitive是否区分大小写 */}
    27. {/* <Routes>
    28. <Route path="/About" caseSensitive={false} element={<About />} />
    29. <Route path="/home" element={<Home />} />
    30. {/* navigate渲染引起视图切换,包含replace属性 */}
    31. <Route path="/" element={<Navigate to="/about" />} />
    32. </Routes> */}
    33. {/* 2.路由表 */}
    34. {element}
    35. </div>
    36. </div>
    37. </div>
    38. </div>
    39. </div>
    40. )
    41. }

    routes/index.js

    1. import { Navigate } from 'react-router-dom'
    2. const arr=[
    3. {
    4. path: '/about',
    5. element:<About/>
    6. },
    7. {
    8. path: '/home',
    9. element: <Home />,
    10. children: [//二级路由
    11. {
    12. path: 'news',
    13. element:<News/>
    14. },
    15. {
    16. path: 'message',
    17. element: <Message />,
    18. children: [
    19. //params参数
    20. // {
    21. // path: 'detail/:id/:title/:content',
    22. // element:<Detail/>
    23. // },
    24. //search参数
    25. // {
    26. // path: 'detail',
    27. // element:<Detail/>
    28. // },
    29. //state参数
    30. {
    31. path: 'detail',
    32. element:<Detail/>
    33. },
    34. ]
    35. }
    36. ]
    37. },
    38. {
    39. path: '/',
    40. element:<Navigate to="/about"/>
    41. },
    42. ]
    43. export default arr;

    3 嵌套路由

    3.1 v5.3.3

    1. <div>
    2. <h3>我是Home的内容</h3>
    3. {/* 二级路由页面 */}
    4. <div>
    5. <ul className="nav nav-tabs">
    6. <li>
    7. {/* home组件匹配到了; /home/news组件匹配到了 。 */}
    8. <MyNavLink to="/home/news">News</MyNavLink>
    9. </li>
    10. <li>
    11. <MyNavLink to="/home/message">Message</MyNavLink>
    12. </li>
    13. </ul>
    14. <Switch>
    15. <Route path="/home/news" component={News} />
    16. <Route path="/home/message" component={Message} />
    17. <Redirect to="/home/news" />
    18. </Switch>
    19. </div>
    20. </div>

    3.2 v6.3.0

    1. import { Outlet, NavLink } from 'react-router-dom'
    2. <div>
    3. <ul className="nav nav-tabs">
    4. <li>
    5. <NavLink className="list-group-item" to="news" >News</NavLink>
    6. </li>
    7. <li>
    8. <NavLink className="list-group-item" to="message">Message</NavLink>
    9. </li>
    10. </ul>
    11. {/* 指定路由组件呈现的位置 */}
    12. <Outlet />
    13. </div>

    4 路由传参

    刷新后参数不丢,清缓存丢。

    携带参数方式:query;params;body(json/urlencoded)

    03daaa22c9f219c0abf68e926ab04131.png

    4.1 v5.3.3

    4.1.1 params参数

    1. //路由链接
    2. <Link to={`/home/message/detail/${item.id}/${item.title}`}>{item.title}</Link>
    3. //注册路由
    4. <Route path="/home/message/detail/:id/:title" component={Detail} />
    5. //接收
    6. const { id, title } = this.props.match.params

    4.1.2 search参数

    1. import qs from 'querystring'
    2. <Link to={`/home/message/detail/?id=${item.id}&title=${item.title}`}>{item.title}</Link>
    3. <Route path="/home/message/detail" component={Detail} />
    4. //接收
    5. const { search } = this.props.location
    6. console.log(search, 'search参数')//?id=1&title=消息1
    7. const { id, title } = qs.parse(search.slice(1))
    8. //扩展
    9. let obj = { name: 'tom', age: 18 }
    10. console.log(qs.stringify(obj))//name=tom&age=18
    11. let str = 'name=ming&age=19'
    12. console.log(qs.parse(str))//{name: 'ming', age: '19'}

    4.1.3 state参数

    1. <Link to={{ pathname: '/home/message/detail', state: { id: item.id, title: item.title } }}>{item.title}</Link>
    2. <Route path="/home/message/detail" component={Detail} />
    3. //接收
    4. const { id, title } = this.props.location.state || {}

    4.2 v6.3.0

    4.2.1 params参数

    1. import { useParams, useMatch } from 'react-router-dom'
    2. <Link to={`detail/${item.id}/${item.title}/${item.content}`}>{item.title}</Link>
    3. // 方式一:
    4. const { id, title, content } = useParams()
    5. // 方式二:
    6. const x = useMatch('/home/message/detail/:id/:title/:content')
    7. console.log(x.params);//{id: '2', title: '消息2', content: '2222内容'}

    4.2.2 search参数

    1. import { useSearchParams, useLocation} from 'react-router-dom'
    2. <Link to={`detail?id=${item.id}&title=${item.title}&content=${item.content}`}>{item.title}</Link>
    3. // 方式一:
    4. const [search, setSearch] = useSearchParams();
    5. const id = search.get('id');
    6. const title = search.get('title');
    7. const content = search.get('content');
    8. {/* <button onClick={() => { setSearch('id=0&title=haha&content=xixi') }}>更新search参数</button> */}
    9. // 方式二:
    10. const x = useLocation()
    11. console.log(x.search)//?id=1&title=%E6%B6%88%E6%81%AF1&content=1111%E5%86%85%E5%AE%B9

    4.2.3 state参数

    1. import { useLocation } from 'react-router-dom'
    2. <Link to="detail" state={{ id: item.id, title: item.title, content: item.content }}>{item.title}</Link>
    3. // 方式一:
    4. const { state: { id, title, content } } = useLocation()

    5 编程式导航

    5.1 v5.3.3

    1. //push跳转+携带params参数
    2. this.props.history.push(`/home/message/detail/${id}/${title}`)
    3. //push跳转+携带search参数
    4. this.props.history.push(`/home/message/detail?id=${id}&title=${title}`)
    5. //push跳转+携带state参数
    6. this.props.history.push(`/home/message/detail/`, { id, title })
    7. this.props.history.replace(`/home/message/detail/`, { id, title })
    8. this.props.history.goBack()
    9. this.props.history.goForward()
    10. this.props.history.go(-1)

    5.2 v6.3.0

    1. import { useNavigate } from 'react-router-dom'
    2. const navigate = useNavigate()
    3. navigate(`detail/${item.id}/${item.title}/${item.content}`, {
    4. replace: false,
    5. })
    6. navigate(`detail?id=${item.id}&title=${item.title}&content=${item.content}`, {
    7. replace: false,
    8. })
    9. navigate('detail', {
    10. replace: false,
    11. state: {
    12. id: item.id, title: item.title, content: item.content
    13. }
    14. })
    15. navigate(-1)
    16. navigate(1)

    6 其他钩子

    1. import { useNavigationType, useResolvedPath,useInRouterContext,useOutlet } from 'react-router-dom'
    2. // push/replace/pop(怎么来的当前页面?刷新!)
    3. console.log(useNavigationType())
    4. // 给定一个 URL值,解析其中的:path、search、hash值。
    5. console.log(useResolvedPath('/user?id=001&name=tom#qwe'))//{pathname: '/user', search: '?id=001&name=tom', hash: '#qwe'}
    6. //被BrowserRouter包裹返回true
    7. const navigate = useInRouterContext()
    8. console.log(navigate)
    9. // 返回什么???
    10. console.log(useOutlet(), 'useOutlet')

  • 相关阅读:
    Java Math.asin()方法具有什么功能呢?
    软件测试面试会问哪些问题?
    提升效率:PostgreSQL准确且快速的数据对比方法
    基于全志T133-s3(Tina Linux)移植wifi(rtl8723d)驱动
    @Autowired与@Resource区别
    华为云大数据BI 为中小型企业智慧运营保驾护航
    一个漏测Bug能让你想到多少?
    深度学习基础知识数据 数据预处理transforms流程讲解
    ChatGPT第五讲
    GBase 8c使用DML更新和插入表数据(二)
  • 原文地址:https://blog.csdn.net/weixin_46151381/article/details/125421248