React — 路由
<p><span style="font-size: 18px"><strong>一、路由的使用</strong></span></p><p>1.安装react-router-dom</p>
<div class="cnblogs_code">
<pre>npm i react-router-dom </pre>
</div>
<p>2.配置</p>
<p>(1)创建router实例对象并且配置路由对应关系</p>
<p>(2)路由绑定</p>
<div class="cnblogs_code">
<pre>import {createBrowserRouter,RouterProvider} <span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">react-router-dom</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">(1)创建router实例对象并且配置路由对应关系</span>
<span style="color: rgba(0, 0, 255, 1)">const</span> router =<span style="color: rgba(0, 0, 0, 1)"> createBrowserRouter([
{
path : </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/login</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
element:</span><div>我是登录页面</div><span style="color: rgba(0, 0, 0, 1)">
},
{
path : </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/article</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
element:</span><div>我是文章页面</div><span style="color: rgba(0, 0, 0, 1)">
},
])
</span><span style="color: rgba(0, 0, 255, 1)">const</span> root = ReactDOM.createRoot(document.getElementById(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">root</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">));
root.render(
</span><React.StrictMode><span style="color: rgba(0, 0, 0, 1)">
{</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)"> 路由绑定 </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">}
</span><RouterProvider router={router}>
</RouterProvider>
</React.StrictMode><span style="color: rgba(0, 0, 0, 1)">
);</span></pre>
</div>
<p><span style="font-size: 18px"><strong>二、路由模块封装</strong></span></p>
<p><img src="https://img2024.cnblogs.com/blog/1483877/202403/1483877-20240312151647368-1221332900.png"></p>
<p>1.创建page文件夹</p>
<p><img src="https://img2024.cnblogs.com/blog/1483877/202403/1483877-20240312152602453-680303083.png"></p>
<p>2.创建router文件夹</p>
<div class="cnblogs_code">
<pre>import Login <span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">../page/Login</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
import Article </span><span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">../page/Article</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
import { createBrowserRouter } </span><span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">react-router-dom</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">const</span> router =<span style="color: rgba(0, 0, 0, 1)"> createBrowserRouter([
{
path : </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/login</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
element : </span><Login></Login><span style="color: rgba(0, 0, 0, 1)">
},
{
path : </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/article</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
element : </span><Article></Article><span style="color: rgba(0, 0, 0, 1)">
}
])
export </span><span style="color: rgba(0, 0, 255, 1)">default</span> router</pre>
</div>
<p>3.应用入口文件渲染</p>
<div class="cnblogs_code">
<pre>import {createBrowserRouter,RouterProvider} <span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">react-router-dom</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
import router </span><span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">./router</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">const</span> root = ReactDOM.createRoot(document.getElementById(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">root</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">));
root.render(
</span><React.StrictMode>
<RouterProvider router={router}>
</RouterProvider>
</React.StrictMode><span style="color: rgba(0, 0, 0, 1)">
);</span></pre>
</div>
<p><span style="font-size: 18px"><strong>三、路由导航</strong></span></p>
<p>1.声明式导航</p>
<p>说明:声明式导航是指在模板中通过<Link/>组件描述要跳转到哪里</p>
<p>语法:<Link to=''/article''>跳转</Link></p>
<p>使用场景:菜单</p>
<div class="cnblogs_code">
<pre>import { Link } <span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">react-router-dom</span><span style="color: rgba(128, 0, 0, 1)">"</span>
<span style="color: rgba(0, 0, 255, 1)">const</span> Login = ()=><span style="color: rgba(0, 0, 0, 1)">{
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <>
<div><span style="color: rgba(0, 0, 0, 1)">
Login页面
</span><Link to=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">/article</span><span style="color: rgba(128, 0, 0, 1)">"</span>>跳转文章</Link>
</div>
</><span style="color: rgba(0, 0, 0, 1)">
}
export </span><span style="color: rgba(0, 0, 255, 1)">default</span> Login</pre>
</div>
<p>2.编程式导航</p>
<p>说明:编程式导航是指通过‘useNavigate’钩子得到导航方法,然后通过调用方法以命令的形式进行路由跳转</p>
<p>语法:const navigate=uaeNavigate() navigate('/article')</p>
<p>使用场景:登录后跳转</p>
<div class="cnblogs_code">
<pre>import { Link,useNavigate } <span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">react-router-dom</span><span style="color: rgba(128, 0, 0, 1)">"</span>
<span style="color: rgba(0, 0, 255, 1)">const</span> Login = ()=><span style="color: rgba(0, 0, 0, 1)">{
</span><span style="color: rgba(0, 0, 255, 1)">const</span> navigate =<span style="color: rgba(0, 0, 0, 1)"> useNavigate()
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <>
<div>
<button onClick={()=>navigate(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/article</span><span style="color: rgba(128, 0, 0, 1)">'</span>)}>命令式跳转2</button>
</div>
</><span style="color: rgba(0, 0, 0, 1)">
}
export </span><span style="color: rgba(0, 0, 255, 1)">default</span> Login</pre>
</div>
<p><span style="font-size: 18px"><strong>四、导航传参</strong></span></p>
<p>1.searchParams传参</p>
<div class="cnblogs_code">
<pre> <div>
<button onClick={()=>navigate(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/article?id=1001&name=jack哈啊哈</span><span style="color: rgba(128, 0, 0, 1)">'</span>)}>传参</button>
</div>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">传参方:?分割参数 参数用&连接多个参数</span></pre>
</div>
<div class="cnblogs_code">
<pre>import { useSearchParams } <span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">react-router-dom</span><span style="color: rgba(128, 0, 0, 1)">"</span>
<span style="color: rgba(0, 0, 255, 1)">const</span> Article = ()=><span style="color: rgba(0, 0, 0, 1)">{
</span><span style="color: rgba(0, 0, 255, 1)">const</span> [<span style="color: rgba(0, 0, 255, 1)">params</span>] =<span style="color: rgba(0, 0, 0, 1)"> useSearchParams()
</span><span style="color: rgba(0, 0, 255, 1)">const</span> id= <span style="color: rgba(0, 0, 255, 1)">params</span>.<span style="color: rgba(0, 0, 255, 1)">get</span>(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">id</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">const</span> name= <span style="color: rgba(0, 0, 255, 1)">params</span>.<span style="color: rgba(0, 0, 255, 1)">get</span>(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">name</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <>
<div><span style="color: rgba(0, 0, 0, 1)">
{id} </span>+<span style="color: rgba(0, 0, 0, 1)"> {name}
</span></div>
</><span style="color: rgba(0, 0, 0, 1)">
}
export </span><span style="color: rgba(0, 0, 255, 1)">default</span> Article</pre>
</div>
<p>2.params传参</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">const</span> router =<span style="color: rgba(0, 0, 0, 1)"> createBrowserRouter([
{
path : </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/login</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
element : </span><Login></Login><span style="color: rgba(0, 0, 0, 1)">
},
{
path : </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/article/:id/:name</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">添加参数占位符</span>
element : <Article></Article><span style="color: rgba(0, 0, 0, 1)">
}
])</span></pre>
</div>
<div class="cnblogs_code">
<pre> <button onClick={()=>navigate(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/article/1001/jack</span><span style="color: rgba(128, 0, 0, 1)">'</span>)}>params传参</button> //直接/+参数值</pre>
</div>
<div class="cnblogs_code">
<pre>import { useParams, useSearchParams } <span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">react-router-dom</span><span style="color: rgba(128, 0, 0, 1)">"</span>
<span style="color: rgba(0, 0, 255, 1)">const</span> Article = ()=><span style="color: rgba(0, 0, 0, 1)">{
</span><span style="color: rgba(0, 0, 255, 1)">const</span> <span style="color: rgba(0, 0, 255, 1)">params</span> =<span style="color: rgba(0, 0, 0, 1)"> useParams()
</span><span style="color: rgba(0, 0, 255, 1)">const</span> id = <span style="color: rgba(0, 0, 255, 1)">params</span><span style="color: rgba(0, 0, 0, 1)">.id
</span><span style="color: rgba(0, 0, 255, 1)">const</span> name = <span style="color: rgba(0, 0, 255, 1)">params</span><span style="color: rgba(0, 0, 0, 1)">.name
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <>
<div><span style="color: rgba(0, 0, 0, 1)">
{id} </span>+<span style="color: rgba(0, 0, 0, 1)"> {name}
</span></div>
</><span style="color: rgba(0, 0, 0, 1)">
}</span></pre>
</div>
<p><span style="font-size: 18px"><strong>五、嵌套式路由</strong></span></p>
<p>1.实现步骤</p>
<p>(1)使用children属性配置路由嵌套关系</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">const</span> router =<span style="color: rgba(0, 0, 0, 1)"> createBrowserRouter([
{
path : </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
element : </span><Layout></Layout><span style="color: rgba(0, 0, 0, 1)">,
children :[{
path : </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/board</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
element : </span><Board></Board><span style="color: rgba(0, 0, 0, 1)">
},
{
path : </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/about</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
element : </span><About></About><span style="color: rgba(0, 0, 0, 1)">
}]
},
{
path : </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/login</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
element : </span><Login></Login><span style="color: rgba(0, 0, 0, 1)">
},
{
path : </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/article/:id/:name</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
element : </span><Article></Article><span style="color: rgba(0, 0, 0, 1)">
}
])</span></pre>
</div>
<p>(2)使用<Outlet/>组件配置二级路由渲染位置</p>
<div class="cnblogs_code">
<pre>import { Link,Outlet } <span style="color: rgba(0, 0, 255, 1)">from</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">react-router-dom</span><span style="color: rgba(128, 0, 0, 1)">"</span>
<span style="color: rgba(0, 0, 255, 1)">const</span> Layout= ()=><span style="color: rgba(0, 0, 0, 1)">{
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <>
<div><span style="color: rgba(0, 0, 0, 1)">
我是一级组件Layout
</span></div>
<div>
<Link to=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/board</span><span style="color: rgba(128, 0, 0, 1)">'</span>> 面板</Link>
<Link to=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/about</span><span style="color: rgba(128, 0, 0, 1)">'</span>> 关于</Link>
</div><span style="color: rgba(0, 0, 0, 1)">
{</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)"> 配置二级路由的出口 </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">}
</span><Outlet></Outlet>
</><span style="color: rgba(0, 0, 0, 1)">
}
export </span><span style="color: rgba(0, 0, 255, 1)">default</span> Layout</pre>
</div>
<p>2.默认二级路由</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">{
path : </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
element : </span><Layout></Layout><span style="color: rgba(0, 0, 0, 1)">,
children :[{
index:</span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">, //1.加index:true
element : </span><Board></Board><span style="color: rgba(0, 0, 0, 1)">
},
{
path : </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/about</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
element : </span><About></About><span style="color: rgba(0, 0, 0, 1)">
}]
},</span></pre>
</div>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">const</span> Layout= ()=><span style="color: rgba(0, 0, 0, 1)">{
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <>
<div><span style="color: rgba(0, 0, 0, 1)">
我是一级组件Layout
</span></div>
<div>
<Link to=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/</span><span style="color: rgba(128, 0, 0, 1)">'</span>> 面板</Link> //2.路径修改/
<Link to=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/about</span><span style="color: rgba(128, 0, 0, 1)">'</span>> 关于</Link>
</div><span style="color: rgba(0, 0, 0, 1)">
{</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)"> 配置二级路由的出口 </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">}
</span><Outlet></Outlet>
</><span style="color: rgba(0, 0, 0, 1)">
}</span></pre>
</div>
<p><span style="font-size: 18px"><strong>六、404路由配置</strong></span></p>
<p>说明:当浏览器输入url路径在整个路由配置中都找不到对应的path,为了用户体验,展示404进行渲染</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">const</span> router =<span style="color: rgba(0, 0, 0, 1)"> createBrowserRouter([
{
path : </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
element : </span><Layout></Layout><span style="color: rgba(0, 0, 0, 1)">,
children :[{
index:</span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">,
element : </span><Board></Board><span style="color: rgba(0, 0, 0, 1)">
},
{
path : </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/about</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
element : </span><About></About><span style="color: rgba(0, 0, 0, 1)">
}]
},
{
path : </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">*</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
element: </span><NotFound></NotFound><span style="color: rgba(0, 0, 0, 1)">
} //添加</span>NotFound组件 使用*配置</pre>
<pre><span style="color: rgba(0, 0, 0, 1)">])</span></pre>
</div>
<p><span style="font-size: 18px"><strong>七、路由模式</strong></span></p>
<p>1.hash :由react-dom中 createHashRouter创建(底层:监听hashChange事件)</p>
<p>2.history:使用react-dom中 createBrowerRouter创建(底层:history对象+pushState事件)需要后端支持</p>
<p><img src="https://img2024.cnblogs.com/blog/1483877/202403/1483877-20240312164632733-70142261.png"></p>
<p> </p><br><br>
来源:https://www.cnblogs.com/qinlinkun/p/18068683
頁:
[1]