使用 React Router 实现 SPA 应用时如何防止路由跳转时页面抖动?

阅读时长 7 分钟读完

随着前端技术的发展,单页面应用(SPA)越来越流行,而 React Router 是用于构建 SPA 的常用库之一。然而,对于使用 React Router 实现的 SPA 应用,我们常常会遇到一个问题:路由跳转时页面会发生抖动,影响用户体验。本文将介绍这种抖动的原因,并提供一些有效的解决方案。

路由跳转时为什么会出现页面抖动?

在 SPA 应用中,页面上所有的组件都是由 JavaScript 动态生成的。当我们使用 React Router 进行路由跳转时,新的组件会在页面上被加载。这个过程中,新组件的 CSS 样式可能还未完全加载或解析,所以渲染出来的效果会出现抖动。

例如,假设我们有一个包含导航栏和内容区域的简单应用,导航栏和内容区域的高度和样式会根据所选路由不同而改变。以下是一个实现这个应用的简单代码示例:

-- -------------------- ---- -------
------ ----- ---- -------
------ - ------------- -- ------- ------ ---- - ---- ------------------
------ ---- ---- --------
------ ----- ---- ---------
------ ------- ---- -----------

----- --- - -- -- -
  --------
    -----
      -----
        ----
          --------- -----------------------
          --------- -----------------------------
          --------- ---------------------------------
        -----
      ------

      ------ ----- -------- ---------------- --
      ------ ------------- ----------------- --
      ------ --------------- ------------------- --
    ------
  ---------
-

------ ------- ---

在这个应用中,当用户点击不同的导航链接时,应用会自动切换到相应的路由。不过,当两个不同路由之间的组件高度和样式不同时,页面就会出现抖动。这是因为当组件的高度和样式未完全加载时,页面会出现调整,导致呈现不连贯。

如何避免页面抖动?

1. 为页面添加样式

为页面添加样式可以防止页面抖动。当页面跳转到一个新的路由,新的组件被加载之前,我们可以在页面上添加一些占位样式。这些样式可以确保在新的组件到来之前,页面保持稳定。可以考虑为导航栏和内容区域添加统一的样式来避免抖动。

以下是一个例子,假设我们将导航栏固定在页面顶部,内容区域以 80 像素的间距显示在导航栏下方。则我们可以为导航条和内容区域添加一个固定高度,并为其设置一个相同的背景色和样式,例如:

-- -------------------- ---- -------
---- -
  ----------------- --------
  ------- ----- -- -------- ---- --
-

-------- -
  ----------- ----- -- ------------ ---- --- --
  ----------------- -----
  ----------- ------ -- ----------- ----- --
-

这两个样式的高度和背景色都是固定的,所以在加载新的组件之前,它们会作为占位样式而存在。

2. 使用 React Transition Group

React Transition Group 是一个强大的动画库,可以很好地解决页面抖动问题。它提供了一个<CSSTransition>组件,可以在组件进入和离开时添加 CSS 动画。在使用 <CSSTransition>时,我们需要为每个不同的路由设置一个动画状态。当路由切换时,React 会自动为当前路由和下一个路由切换添加动画。

以下是一个例子,假设我们为<CSSTransition>设置了四种动画状态:appear,appear-active,enter,enter-active。这些状态对应的 CSS 样式分别对组件的透明度、宽度、高度等属性进行动画操作:

-- -------------------- ---- -------
------ ----- ---- -------
------ - ------------- -- ------- ------ ---- - ---- ------------------
------ - -------------- --------------- - ---- ------------------------
------ -----------
------ ---- ---- --------
------ ----- ---- ---------
------ ------- ---- -----------

----- --- - -- -- -
  --------
    -----
      -----
        ----
          --------- -----------------------
          --------- -----------------------------
          --------- ---------------------------------
        -----
      ------

      ------ ---------- -------- -- -- -
        -----------------
          --------------
            ------------------
            -----------------
            -------------
          -
            ---- --------------------
              ------ ----- -------- ---------------- --
              ------ ------------- ----------------- --
              ------ --------------- ------------------- --
            ------
          ----------------
        ------------------
      ----
    ------
  ---------
-

------ ------- ---

我们还需要在 CSS 文件中为这四种状态设置相应的样式。

-- -------------------- ---- -------
------------ -
  -------- --
-
------------------------ -
  -------- --
  ----------- ------- --- --------
-

----------- -
  -------- --
  ------ --
  ------- --
-
----------------------- -
  -------- --
  ------ -----
  ------- -----
  ----------- ------- --- -------- ----- --- -------- ------ --- --------
-

在使用<CSSTransition>时,我们需要确保所添加的样式和组件的加载时机相同。在组件加载时,我们需要确保占位样式渲染。在组件加载完成时,我们才会为其添加 CSS 动画。

总结

当使用 React Router 实现 SPA 应用时,页面抖动是常见的问题之一。为了防止页面抖动,我们可以为页面添加样式或使用 React Transition Group 动画库。前者主要是在页面切换时为其添加占位样式来防止抖动。后者则是在组件加载时添加 CSS 动画进行过渡,并在组件加载完成时移除占位样式。无论哪种方法,都可以有效地提升用户体验,并增加你的应用的可用性。

最后,请注意,以上方法并不是唯一的解决方案,你可以根据你的具体使用场景和需求,选择适合的方法进行防抖动。希望这篇文章能够帮助你更好地学习和使用 React Router,以及提升你的 SPA 应用的体验。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64a43edc48841e98940ad19e

纠错
反馈