Router
说明
React 的声明式路由react-router
官方文档 教程
安装
shell
pnpm i react-router-dom
Browser Router 配置
使用 createBrowserRouter 创建路由,使用 RouterProvider 传入路由配置的返回值
tsx
import React from 'react'
import ReadDom from 'react-dom/client'
import { createBrowserRouter, RouterProvider } from 'react-router-dom'
const router = createBrowserRouter([{ path: '/', element: <h1>首页</h1> }])
ReadDom.createRoot(document.getElementById('root')!).render(
<React.StrictMode>
<RouterProvider router={router} />
</React.StrictMode>
)
嵌套路由
使用 children
可以配置字路由,在需要路由经过的路口使用 组件实现嵌套
ts
import { Outlet } from 'react-router-dom'
tsx
const router = createBrowserRouter([
{
path: '/',
element: <Root />,
errorElement: <ErrorPage />,
children: [
{
path: '/contacts/:id',
element: <Contact />,
errorElement: <ErrorPage />
}
]
}
])
路由跳转
使用 Link 组件可以实现跳转
tsx
import { Link } from 'react-router-dom'
tsx
<Link to="/contacts/1">Your Name</Link>
也可以使用 useNavigate 通过 js 跳转
tsx
import { useNavigate } from 'react-router-dom'
const navigater = useNavigate()
const goPage = () => {
navigater('/home')
}
第二关参数 state 可以传递路由 query 参数,并且使用 useLocation 获取参数
tsx
const goPage = () => {
navigater('/contacts/1', { state: { id: 123 } })
}
tsx
import { useLocation } from 'react-router-dom'
const location = useLocation()
console.log(location.state.id)
路由 Loader
在路由执行前做点什么,loader 必须要有返回值,返回值不能是 undefined,可以是 null
tsx
export const loader = () => {
console.log('load')
return null
}
const router = createBrowserRouter([
{
path: '/',
element: <Root />,
errorElement: <ErrorPage />,
loader: RootLoader,
children: [
{
path: 'contacts/:id',
element: <Contact />,
errorElement: <ErrorPage />
}
]
}
])
想要在组件中获取到路由 loader 的返回值,可以使用 useLoaderData 来获取到
tsx
import { useLoaderData } from 'react-router-dom'
export function Root() {
const data = useLoaderData()
console.log(data)
return (
);
}
export const loader = () => {
return { name: '张三', age: 12 }
}