解决 Vue SPA 中使用路由守卫时页面闪动的问题

在使用 Vue 开发单页应用(SPA)时,我们经常会使用路由守卫来控制用户访问页面的权限。路由守卫的使用很方便,但在某些情况下,会出现页面闪动的问题,这个问题对用户体验有很大的影响。

问题分析

路由守卫的执行时机是在路由切换时,如下图所示:

图中可以看到,路由守卫的执行时机是在用户访问新页面时,但在路由守卫验证通过之前,页面已经显示出来了。这就导致了页面的闪动问题。

解决方案

解决页面闪动问题的方案是在路由切换之前,提前获取页面内容,并在验证通过后,再将内容渲染到页面中。这个方案可以使用 Vue 的异步组件和加载中组件来实现。

异步组件

异步组件是 Vue 中一个很方便的功能,它可以将组件的加载延迟到组件被访问时,可以避免在页面加载时同时加载大量组件的问题。异步组件的定义方式如下:

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

上述代码中,import('./views/User.vue') 返回一个 Promise 对象,当 Promise 对象被解析时,组件才会被加载。

加载中组件

加载中组件是一个用于提示用户正在加载内容的组件,可以在网络延迟或请求数据时展示。加载中组件的目的是让用户明确地知道,当前页面正在加载中,他们需要等待片刻才能看到内容。

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

可以为每个路由定义一个加载中组件,当路由守卫验证通过时,先显示加载中组件,然后异步加载组件,并将加载到的内容替换掉加载中组件。这样就可以避免页面闪动的问题。

示例

假设我们有一个需要登录才能访问的页面 /user,使用路由守卫来控制用户的访问权限。我们可以定义如下的路由:

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

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

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

上述代码中,我们为需要登录的路由添加了 meta 属性,并在 beforeEach 中验证用户是否已经登录。如果用户已经登录,则允许访问路由,否则跳转到登录页面。

现在我们需要修改 /user 路由的组件渲染方式,让其先显示加载中组件,然后异步加载 User.vue 组件并渲染。这里我们可以定义一个高阶组件来实现:

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

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

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

上述代码中,我们定义了一个 asyncComponent 函数,它接受一个组件的加载函数,返回一个异步组件的定义对象。异步组件的 component 选项是异步加载组件并解析 Promise(Promise.resolve(loadComponent())),加载过程中会显示 Loading 组件。

总结

在 Vue 的单页应用开发中,路由守卫是一个非常方便的功能,但在页面加载时会出现闪动问题,影响用户体验。通过使用异步组件和加载中组件,我们可以解决这个问题。在实际的开发中,可以将异步组件的定义、加载中组件的定义和路由守卫的使用封装到一个高阶组件中,方便复用和维护。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/64aa0c7b48841e989463ad3a


猜你喜欢

  • Cypress 测试框架中如何处理页面中的弹窗

    Cypress 是一个用于编写端到端(E2E)测试的JavaScript测试框架。它提供了一个简单易用的API,可以通过自动化测试来模拟用户在网站上的行为。然而,在自动化测试中,经常会遇到弹窗这样的交...

    1 年前
  • 使用Material Design Lite实现响应式设计

    在现代网站开发中,响应式设计是至关重要的。它可以确保网站在不同的设备和屏幕尺寸下都能够正常运行和显示。Google的Material Design Lite是一个非常强大的工具,可以帮助开发人员实现响...

    1 年前
  • SSE 在物流行业中的应用实践

    SSE 在物流行业中的应用实践 物流是现代社会中不可或缺的行业之一,其涉及到物资生产、运输、存储等环节。随着互联网技术和移动设备的普及,物流行业也开始向数字化、智能化方向转变。

    1 年前
  • Chai 和 Jasmine 的测试框架比较

    在前端开发中,测试框架是必不可少的工具之一。常见的测试框架有 Chai 和 Jasmine。本文将对这两个测试框架进行比较,包括使用区别、优缺点等方面。 Chai 和 Jasmine 的基本概述 Ch...

    1 年前
  • 在 Electron 和 TypeScript 中构建桌面应用程序

    介绍 在现代化的应用程序和可执行文件中,桌面应用程序一直扮演着一个非常重要的角色。现在,随着越来越多的应用向云端迁移,一些独立的桌面应用程序,如文本编辑器、功能强大的音频编辑器和其他工具,无论在操作方...

    1 年前
  • ECMAScript 2017 中的 Object.assign 如何实现对象浅拷贝

    在前端开发中,对象的拷贝是一个常见的操作。有时我们需要在原对象的基础上进行修改,但同时还需要保留原对象。这时,我们常常使用对象的浅拷贝。 ECMAScript 2017 中新增的 Object.ass...

    1 年前
  • ES7 字符串的 padding 方法详解

    ES7 引入了一种新的字符串方法 padStart 和 padEnd,能够轻松地填充字符串来满足特定的长度要求。 padStart padStart 方法能够在字符串的开头添加一些内容来达到特定长度。

    1 年前
  • Express.js 中 Web 应用安全防护的最佳实践

    在当前互联网时代,Web 应用安全是一个极其重要的话题,任何一个规模较大的 Web 应用程序或网站都需要有一定的安全保护措施。本文主要介绍 Express.js 中 Web 应用安全防护最佳实践,包括...

    1 年前
  • # ES10 之强大的 Flat() 方法和 flatMap() 方法

    ES10 之强大的 Flat() 方法和 flatMap() 方法 在前端编程当中,数据处理是一个非常重要的环节,尤其是在面对海量数据的时候,处理的效率和准确率都是至关重要的。

    1 年前
  • RxJS 中 Subject 的突破

    在 RxJS 中,Subject 是一种特殊的 Observable,它可以像普通的 Observable 一样进行订阅和发送数据,同时还可以在任何时刻手动推送数据给它的订阅者。

    1 年前
  • Enzyme 结合 Jest 进行 React 组件测试实例

    React 是一个用于构建用户界面的 JavaScript 库,它的组件化思想让前端开发更加高效和简洁。在开发 React 组件的过程中,我们需要进行测试以保证组件的质量和正确性。

    1 年前
  • Vue 中使用 Custom Elements 的方法介绍

    Custom Elements 是使用原生 Web Components 创建自定义元素的一种方式。在 Vue 中使用 Custom Elements 可以让我们更方便地封装和复用组件,同时也可以更好...

    1 年前
  • JS 中 BigInt 的基本使用方法

    在 JavaScript 中,数字是以 64 位浮点数的形式存储的。这对于大部分计算来说已经足够了,但对于一些需要处理超过 253 的大数运算来说就有些捉襟见肘了。

    1 年前
  • Node.js+Mongoose 实现数据分页查询功能详解

    在大多数的 Web 应用程序中,数据分页查询是一个非常常见的需求。而 Node.js 和 Mongoose 则是我们常用的开发工具之一。本文将详细介绍如何使用 Node.js 和 Mongoose 搭...

    1 年前
  • Koa2 中使用 cookie-parser 处理 cookie

    在 Koa2 中,处理 cookie 是一个很常见的需求。而 cookie-parser 就是一个非常实用的库,它可以方便地将 cookie 解析为 JavaScript 对象或字符串,或者将 Jav...

    1 年前
  • 如何在 React Native 中使用 Enzyme 进行测试?

    React Native 是一种流行的移动应用开发框架。在开发过程中,我们需要进行多次测试以确定应用的正确性和稳定性。Enzyme 是一款 React 测试实用程序,它可以轻松地在 React Nat...

    1 年前
  • Headless CMS 如何支持批量数据导入和导出

    现今的Web应用程序越来越依赖于互联网上获取的数据源,因此,对于开发人员来说,管理和更新数据变得越来越关键。 Headless CMS是一种灵活的内容管理系统,在不捆绑特定前端框架的情况下,可以提供R...

    1 年前
  • Web Components 在 React 中的实践及使用心得分享

    随着前端技术的不断发展,Web Components 在前端界面开发中的作用越来越重要。Web Components 是一个包含了自定义元素、阴影DOM、自定义事件和模板等功能的组件化平台,其主要目的...

    1 年前
  • 利用 Socket.io 实现人人都能用的内网穿透工具

    最初,我们可能会遇到一个问题:如何在内网中共享我们的本地开发服务器,使远程用户可以轻松地访问我们的服务器,同时绕开常见的网络配置和限制,确保我们的服务器能够正常工作。

    1 年前
  • CSS Flexbox 中如何解决多列垂直对齐的问题

    在网页开发中,常常遇到多列布局需要垂直对齐的情况,这时候使用 CSS Flexbox 是一种非常方便和有效的方法。 什么是 Flexbox? Flexbox 是 CSS3 新增的一种布局模式,它可以让...

    1 年前

相关推荐

    暂无文章