SPA 页面多级路由之间引起的坑以及解决方法

阅读时长 5 分钟读完

单页应用(SPA)页面的多级路由是前端开发中常见的技术,也是提高用户交互体验和页面访问效率的重要手段。但在实际开发中,多级路由可能会引起一些坑,需要注意。

引起的问题

路由嵌套

多级路由经常会出现路由嵌套的情况。例如,我们有这样一个路由配置:

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

在这种情况下,访问 /about 路径时会渲染 About 组件,但这个组件只是一个容器,它包含了子路由 teamcontact。这时候要渲染子组件,需要使用 <router-view> 标签。但如果在 About 组件中不加上这个标签,子组件就无法渲染。

动态路由

多级路由还有可能包含动态路由参数,例如:

当我们通过路径访问 /product/123 时,这个 123 就是一个动态的参数,表示商品的 ID 值。在 Product 组件中可以通过 $route.params.id 获得这个值。

但是,如果在多级路由中包含动态路由参数,例如:

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

访问 /about/team/123 时,这个 123 就是动态路由参数。但是,在 Team 组件中通过 $route.params.id 获取不到这个值。这是因为动态路由参数只对当前路由组件生效。如果要在父组件中使用,需要使用 $route.matched 对象获得当前路由信息,进而获得动态路由参数。

路由重定向

在多级路由中,还可能需要进行路由重定向,将一个路径转发到另外一个路径。例如:

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

这个配置将 /about 路径重定向到 /about/team 路径。但是,如果在 About 组件中不使用 $router.replace 方法重定向,而是直接写成 <router-link to="/about">About</router-link>,那么在页面刷新后就会出现问题。这是因为浏览器刷新时会重新加载整个应用程序,而不会触发重定向操作。所以需要在代码中使用 $router.replace 方法进行重定向。

解决方法

针对上述问题,我们可以采取以下方法避免或解决。

路由嵌套

在多级路由中,一定记得加上 <router-view> 标签,这样子路由才能正确渲染。如果某个父级组件不想渲染子路由,可以不加这个标签,在子路由组件中使用单独的 router-view 标签进行渲染。

动态路由

在多级路由中包含动态路由参数时,可以使用 $route.matched 对象获取当前路由信息,进而获得动态路由参数。例如,在 Team 组件中可以这样写:

这个方法会获取路由参数中序号为 1 的路径信息,即 /about/team/:id 中的 :id

路由重定向

在进行路由重定向时,一定要使用 $router.replace 方法,而不是直接写 <router-link to="/about">About</router-link>。如果需要在重定向后刷新页面,可以加上 location.reload() 方法。

完整的示例代码如下:

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

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

总结

在使用多级路由时,一定要注意路由嵌套、动态路由和路由重定向等问题,并使用相应的解决方法避免或解决这些问题。这样可以提高代码质量和效率,提高用户体验。

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

纠错
反馈