前端学习之 React-router

495 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第15天,点击查看活动详情

捕获路由出错

比如当某个路由下发生错误的时候,可以捕获路由错误 可以捕获路由错误,通过errorElement获取捕获错误 比如 可以使用useRouteError获取到发生的错误

import { useRouteError } from "react-router-dom";export default function ErrorPage() {  const error = useRouteError();  console.error(error);  return (    <div id="error-page">      <h1>Oops!</h1>      <p>Sorry, an unexpected error has occurred.</p>      <p>        <i>{error.statusText || error.message}</i>      </p>    </div>  );}

路由出错也会有冒泡性,也就是如果在子路由出错,如果子路由没有设置errorElement,就会冒泡到父路由上。

如何设置路由渲染到指定的区域

可以使用react-router-dom 提供的Outlet

// import React from "react";import { Outlet } from "react-router-dom";<div id="detail">  <Outlet /></div>

然后配置路由如下:

const router = createBrowserRouter([  {    path: "/",    element: <Root/>,    errorElement: <ErrorPage />,    children: [      {        // 这里的路由就会渲染到Outlet里边        path: "contacts/:contactId",        element: <Contact />,      },    ],  },]);

切换路由的时候,加载数据

使用loader和useLoaderData 这两个api来实现

使用loader 加载数据;

使用useLoaderData在组件中获取到加载过来的数据;

但是感觉这个没什么实际落地场景

然后再结合action,同步loader里边的数据。

感觉没什么用处,不是使用redux 管理状态吗? 怎么react-router-dom这里也要插一脚,完全没搞懂😭

获取路由url的参数

[  {    path: "contacts/:contactId",    element: <Contact />,  },];

比如像这里的:contactId,在loader里边获取的方式就是通过使用

export async function loader({ params }) {  return getContact(params.contactId);}

这里可以看到contactId直接通过params穿到了loader函数里边

使用NavLink来展示当前所在的路由

使用NavLink可以获取当前路由是否是active的,比如如下代码,通过传入的isActive和isPending判断当前是否是active的状态

<NavLink  to={`contacts/${contact.id}`}  className={({ isActive, isPending }) =>    isActive ? "active" : isPending ? "pending" : ""  }>

路由跳转添加loading 效果

可以使用useNavigation,获取到当前的路由状态,是否是loading状态,比如 在Outlet外边添加loading状态

const navigation = useNavigation(); <div        id="detail"        className={          navigation.state === "loading" ? "loading" : ""        }      >        <Outlet />      </div>