React - 路由的基本使用
import React, { Component } from 'react' import ReactDOM from 'react-dom/client' import { nanoid } from 'nanoid' import { // 🤴🏻🟨 推荐使用as将路由重命名为Router HashRouter, BrowserRouter as Router, Route, Link, NavLink, Switch, Redirect, } from 'react-router-dom' const root = ReactDOM.createRoot(document.getElementById('root')) // 🍅 Link组件的使用说明 // Link和NavLink的区别 // NavLink如何自定义高亮类名 // 精准匹配:url路径和to属性的值,一摸一样 // 模糊匹配:url路径和to属性的值,是包含关系 💥url路径包含to属性 class MyApp01 extends React.Component { // 🥩NavLink自带高亮类名active // 🥩activeClassName自定义激活时的类名 // 🥩exact 开启精准匹配: exact={true} => 省略值 render() { return ( <> <Router> <div> <h1>App组件</h1> <NavLink activeClassName="xxx" to="/home"> 跳转到Home </NavLink> <NavLink exact to="/my"> 跳转到音乐 </NavLink> <NavLink to="/friend">跳转到朋友</NavLink> <div className="box"> <Route path="/home" component={HomeCom} /> </div> <Route path="/my" component={MusicCom} /> <Route path="/friend" component={FriendCom} /> </div> </Router> </> ) } } // Route组件的使用说明 class MyApp02 extends React.Component { render() { // 🍄 Route时规则对象和挂载点二合一,匹配的时候,渲染组件,不匹配的时候原地返回一个null // 🍄 Route默认是模糊匹配,exact开启精确匹配,类似Link组件 // 🍄 React组件默认自上向下,一次匹配,默认不会停止 return ( <> <Router> <div> <h1>App组件</h1> <NavLink activeClassName="xxx" to="/home"> 跳转到Home </NavLink> <NavLink activeClassName="xxx" to="/friend"> 跳转到Friend </NavLink> <Route path="/home" component={HomeCom} /> <Route path="/home" component={HomeCom} /> <Route path="/home" component={HomeCom} /> <Route path="/home" component={HomeCom} /> <Route path="/home" component={HomeCom} /> <Route path="/my" component={MusicCom} /> {/* // 🍚 表示匹配任意路径的两种方式 // 1. 不写path,等价于Vue中的* // 2. path="/",可以和任意路径进行模糊匹配 */} <Route exact path="/" component={FriendCom} /> <Route // 不写path时, exact无效 component={MusicCom} /> </div> </Router> </> ) } } // Switch \ 404 \ 重定向 class MyApp03 extends React.Component { render() { return ( <Router> <div> <h1>App组件</h1> <NavLink activeClassName="xxx" to="/home"> 跳转到Home </NavLink> <br /> <NavLink exact to="/my"> 跳转到我的音乐 </NavLink> <br /> <NavLink to="/friend">跳转到朋友</NavLink> {/* 一般Route都包含在Switch之内 */} <Switch> <Redirect from="/" to="/home" exact /> <Route path="/home" component={HomeCom} /> <Route path="/my" component={MusicCom} /> <Route path="/friend" component={MyFriendCom} /> {/* 404 不写path,一般放在Swtich最后一个 */} <Route component={NotFoundCom} /> </Switch> </div> </Router> ) } } // 桥套路由 function NotFoundCom(params) { return <h1>404页面</h1> } function HomeCom() { return ( <> <h1>我是首页组件</h1> </> ) } function MusicCom() { return ( <> <h1>我是音乐组件</h1> </> ) } function FriendCom() { return ( <> <h1>我是朋友组件</h1> </> ) } function MyFriendCom() { return ( <> <h1>我是朋友组件</h1> <Link to="/friend">朋友01</Link> <br /> <Link to="/friend/friend2">朋友02</Link> <br /> <Link to="/friend/friend3">朋友03</Link> {/* 在父组件内,再次使用Switch包裹Route,设置二级路由的匹配规则和挂在带你 🍧 1. 二级路由, path的值, 从"/父级/子路由路径" 🍧 2. 父级路由Route不能使用exact 🍧 3. 父级path可以同名,互不影响 🍧 4. to属性跳转二级路由,to的值需要从"一级路径/二级路径" */} <Switch> <Route path="/friend/friend2" component={FriendCom02}></Route> <Route path="/friend/friend3" component={FriendCom03}></Route> <Route path="/friend" component={FriendCom01}></Route> </Switch> </> ) } function FriendCom01() { return <h1>我是朋友01组件</h1> } function FriendCom02() { return <h1>我是朋友02组件</h1> } function FriendCom03() { return <h1>我是朋友03组件</h1> } class MyApp04 extends React.PureComponent { render() { return ( <Router> <div> <h1>App组件</h1> <NavLink activeClassName="xxx" to="/home"> 跳转到Home </NavLink> <br /> <NavLink exact to="/my"> 跳转到音乐 </NavLink> <br /> <NavLink to="/friend">跳转到朋友</NavLink> <br /> <Switch> <Redirect from="/" to="/home" exact /> <Route path="/home" component={MyHomeCom} /> {/* 设置path为动态路由,path="/路径/:自定义属性名" */} <Route path="/my/:xxx" component={MyMusicCom} /> </Switch> </div> </Router> ) } } function MyHomeCom({ history }) { return ( <> <h1>我是首页组件</h1> <button onClick={() => { history.goBack() // 等价于 go(-1); 回退异步 }} > 点我跳转到音乐 </button> </> ) } function MyMusicCom({ match }) { // 通过props.match.params自定义属性名接收数据 return ( <> <h1>我是音乐组件 - {match.params.xxx}</h1> </> ) } const divNode = ( <div> <MyApp04 /> </div> ) root.render(divNode)
学而不思则罔,思而不学则殆!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具