React-Router基础使用,包学会的

348 阅读3分钟

几种路由模式

BrowserRouter

后台需要配置,其主要的实现原理是使用 window.history。内部实现是通过createBrowserHistory创建了浏览器的历史实例,该实例通过调用HTML5历史API管理浏览器的历史状态。

  • 通过监听popstate触发浏览器的前进与后退
  • 通过监听pushstate实现跳转链接切换页面
  • 采用hashchange作为备用方案
root.render( 
<BrowserRouter basename='pc'> //会给当前组件下所有的路径前面加上,/pc,/pc/user。 
<Routes>
    <Route path="/app" element={<App />}/>
    {/* The rest of your app goes here */}
</Routes>
</BrowserRouter> );

HashRouter

主要用于不支持HTML5历史API的浏览器和后退需要兼容的问题。

  1. URL 多了 # 前缀,变得不美观。
  2. 服务端渲染比较复杂,服务端只能看到路径部分,无法识别哈希部分,导致无法正确解析路由。

memoryRouter

内存型路由:提供了一个在内存中的历史记录来控制路由。

用于在没有真正的浏览器环境的情况下模拟路由行为。它主要用于测试环境和服务端渲染(SSR)中,因为它不需要真实的 window 对象和浏览器历史 API。

staticRouter

一般用于 nodejs 进行服务端渲染使用

node 没有 window 环境,用不了 BrowserRouter,staticRouter 只关心当前匹配的路由的内容,与其他路由无关,一定程度上提升了性能。

nativeRouter

ios,android 端使用,用于react-native。

react-router和react-router-dom区别

react-router-dom浏览器专用,采用react-router库

BrowserRouter在配置的时候有没有什么问题

  1. 需要后台配合,否则出现404。
  2. 前端什么时候需要页面数据,什么时候是接口请求,服务端需要通过匹配通配符来作出响应。

useLocation

可以获取一些 navigate,link 的信息。 我这里

//一个Bpp的组件
function Bpp() {
  const location = useLocation();
  console.log(location, "Bpp");
  return <h1>bpp</h1>;
}
//一个按钮,点击进入Bpp页面
<button
    onClick={() =>
       navigate("bpp", { state: { name: "我是需要传给Bpp页面的数据" } })
    }
>
    去到Bpp
</button>

//Link标签
<button>
    <Link
      to="/user"
      state={{ id: 123232424 }}
    >去到user</Link>
</button>

Bpp: 截屏2024-08-15 15.21.53.png User: 截屏2024-08-15 15.24.28.png

动态路由

需要完全匹配,当你使用后,URL就需要变成user/xxx,否则没有页面。

<Route
    path="/user/:id" //将动态参数通过:拼接
    element={<User />}
/>

通过useParams获取xxx,键名取决于你喜欢。

截屏2024-08-15 15.31.03.png

useSearchParams

获取到 URL的 ?拼接的路由参数通过 useSearchParams,多个参数 & 拼接,通过 setSearch 修改增加参数 比如URL拼接了?name=123

const [search, setSearch] = useSearchParams();
console.log(search.get("name")); //打印123


<button onClick={() => setSearch({ name: 123, age: 18 })}>
   修改URL参数
</button>

useMatch

当与当前路由匹配时,返回当前匹配的路由信息

  const params = useParams(); //获取动态参数
  const match = useMatch(`/user/${params.id}`);//路径匹配
  console.log("match", match);

截屏2024-08-15 15.45.37.png

数据路由

数据路由是react-router v6.4 最大的升级,

官方所说v6.4 是我们迄今为止最激动人心的版本,它具有用于读取、写入和导航挂钩的新数据抽象,可轻松让您的 UI 与数据保持同步。

传统路由:初始化 -> 路由切换,加载页面 -> 分包加载 -> 生命周期,拉取数据 -> 页面渲染

数据路由:初始化 -> 路由切换,加载页面 && 分包加载 && 生命周期,拉取数据 -> 页面渲染

并发加载,加快了页面渲染的速度

Router v6.4 解决的核心问题

它是为了解决瀑布流问题而生的

可以实现并行加载(核心)

  1. 路由对应的 UI 页面 /app ->App 组件
  2. 分包组件的 js,传统路由会先发送请求,拿到数据后再发请求去拿js,数据路由这两步会同时进行。
  3. 拉取组件或页面需要的数据

数据路由写起来比较复杂

  1. 将数据耦合到 UI 中,增加了项目的耦合性,维护成本升高
  2. 带来了直观的性能提升