目前前端流行的三大框架,都有自己的路由实现:
React Router在最近两年版本更新的较快,并且在最新的React Router6.x版本中发生了较大的变化。
安装React Router:
npm install react-router-dom
react-router最主要的API是给我们提供的一些组件:
口 BrowserRouter或HashRouter
口 Router中包含了对路径改变的监听,并且会将相应的路径传递给子组件;
口 BrowserRouter使用history模式; HashRouter使用hash模式;
<React.StrictMode>
<HashRouter>
<App />
</HashRouter>
</React.StrictMode>
<Routes>
<Route path="/" element={<Home />}></Route>
<Route path="/home" element={<Home />}></Route>
<Route path="/about" element={<About />}></Route>
</Routes>
<div className="nav">
{/* 映射关系: path ---> component */}
<Link to="/home">首页</Link>
<Link to="/about">关于</Link>
</div>
需求:路径选择时,对应的a元素变为红色
这个时候,使用NavLink组件来替代Link组件:
默认的activeClassName:
当然,如果你担心这个class在其他地方被使用了,出现样式的层叠,也可以自定义class
isLogin
用于记录用户是否登录:
<Routes>
<Route path="/" element={<Home />}></Route>
<Route path="/home" element={<Home />}></Route>
<Route path="/about" element={<About />}></Route>
<Route path="/login" element={<Login />}></Route>
<Route path="*" element={<NotFound />}></Route>
</Routes>
组件用于在父路由元素中作为子路由的占位元素。<Routes>
<Route path="/" element={<Home />}></Route>
<Route path="/home" element={<Home />}>
<Route path="/home" element={<Navigate to="/home/recommend" />}></Route>
<Route path="/home/recommend" element={<HomeRecommend />}></Route>
<Route path="/home/ranking" element={<HomeRanking />}></Route>
</Route>
<Route path="/about" element={<About />}></Route>
<Route path="/login" element={<Login />}></Route>
<Route path="*" element={<NotFound />}></Route>
</Routes>
<div className="subnav">
<Link to="/home/recommend">推荐</Link>
<Link to="/home/ranking">排行</Link>
</div>
<Outlet></Outlet>
import { useNavigate } from 'react-router-dom';
// 高阶组件 : 函数
function withRouter(WrapperComponent) {
return function (props) {
const navigate = useNavigate();
const router = { navigate };
return <WrapperComponent {...props} router={router} />;
};
}
export default withRouter;
/detail/:id
,那么 /detail/abc, /detail/123都可以匹配到该Route,并进行显示;import { useNavigate, useParams, useSearchParams } from 'react-router-dom';
// 高阶组件 : 函数
function withRouter(WrapperComponent) {
return function (props) {
// 导航
const navigate = useNavigate();
// 动态路由参数
const params = useParams();
// 搜索字符串
const [searchParams] = useSearchParams();
const query = Object.fromEntries(searchParams);
const router = { navigate, params, query };
return <WrapperComponent {...props} router={router} />;
};
}
export default withRouter;
<Route path="/detail/:id" element={<Detail />}></Route>
<Link to="/user?name=why&age=18">用户</Link>
目前我们所有的路由定义都是直接使用Route组件,并且添加属性来完成的。
但是这样的方式会让路由变得非常混乱,我们希望将所有的路由配置放到一个地方进行集中管理:
口 在早期的时候,Router并且没有提供相关的API,我们需要借助于react-router-config完成;
口 在Router6.x中,为我们提供了useRoutes API可以完成相关的配置:
<div> { useRoutes(routes) } </div>
const routes = [
{
path:"/",
element:<Navigate to="/home" />
},
{
path:'/home',
element:<Home />,
children:[
{
path:'home/recommend',
element:<HomeRecommend />
}
...
]
}
]
const About = React.lazy(()=> import("../../pages/About"))
<React.StrictMode>
<HashRouter>
<Suspense fallback={<h3>Loading....</h3>}>
<App />
</Suspense>
</HashRouter>
</React.StrictMode>,