Vue.js 中如何使用 vue-router 实现页面跳转

阅读时长 12 分钟读完

简介

Vue.js 是一种开放源代码的JavaScript框架,用于构建用户界面和单页应用程序。而 Vue-Router 是一个 Vue.js 官方的路由管理器,它与 Vue.js 核心深度集成,使得构建单页面应用变得异常简单。

在这篇文章中,我们将深入学习 Vue.js 如何使用 vue-router 实现页面跳转的方法,涵盖 Vue-Router 的核心概念和基础用法,并提供一些实用的示例代码,以供读者参考和学习。

安装和配置

在开始使用 Vue.js 和 Vue-Router 之前,我们首先需要安装它们。它们可以通过 npm 或者 yarn 进行安装,比如:

或者:

安装完成后,我们需要在 Vue.js 实例中注册 Vue-Router,以便进行后续的配置和使用。这个过程通常会在应用程序的入口文件 main.js 中完成,比如:

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

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

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

--- -----
  -------
  ------- - -- ------
-----------------
展开代码

在这个例子中,我们使用了 Vue.use(VueRouter) 方法来启用 Vue-Router,并通过 new VueRouter() 方法创建了一个新的 VueRouter 实例。这个实例包含路由规则(routes),也就是用于定义应用程序页面和 URL 路径之间映射关系的地方。

路由规则

路由规则是 Vue-Router 最重要的部分之一,它用于定义我们应用程序中所有页面的 URL 路径。下面我们将深入学习 Vue-Router 中路由规则的核心概念和基础用法。

动态路由

动态路由是指 URL 中包含参数的路由,比如 /user/:id。这个路由规则表示当访问 /user/1 的时候,将会渲染一个名为 User 的组件,并传入 id 属性为 1。

在组件中,可以通过 $route.params.id 来获取路由参数。

嵌套路由

嵌套路由是指页面中嵌套其他页面的路由,比如 /user/:id/profile。这个路由规则表示当访问 /user/1/profile 的时候,将会渲染一个名为 UserProfile 的子组件,并传入 id 属性为 1,component: UserProfile

-- -------------------- ---- -------
----- ------ - -
  -
    ----- ------------
    ---------- -----
    --------- -
      -
        ----- ----------
        ---------- -----------
      -
    -
  -
-
展开代码

在父组件中可以使用 <router-view> 来渲染子组件,同时也可以通过 $route.params.id$route.params.profile 获取路由参数。

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

---- ----------- -- ---
----------
  ---- ---------------------
    ------ --------------------- -------
  ------
-----------
展开代码

命名路由

命名路由可以为一个路由规则设置一个唯一的名称,方便在应用程序中进行跳转。我们可以通过 name 属性来定义路由规则的名称,比如:

在应用程序中可以使用 this.$router.push({ name: 'user', params: { id: 1 } }) 来跳转到 /user/1

重定向

重定向是指将某个路由规则重定向到另一个路由规则。我们可以通过 redirect 属性来进行重定向,比如:

在应用程序中访问 /user 将会自动跳转到 /user/1

404 页面

404 页面表示当用户访问一个不存在的 URL 时,会显示的页面。我们可以通过指定一个名为 * 的路由规则,来表示其它路由都无法匹配时,渲染一个 404 页面。

-- -------------------- ---- -------
----- ------ - -
  -
    ----- ----
    ---------- ----
  --
  -
    ----- ----
    ---------- --------
  -
-
展开代码

路由传参

路由传参是指在页面跳转时,传递一些数据给新页面。这些数据可以是查询字符串、路由参数、state 状态等。

查询字符串

查询字符串可以通过 URL 中的 ?& 连接符来传递。我们可以通过 $route.query 对象来获取 URL 中的查询字符串参数。比如,访问 /user?id=1&name=john,可以通过 $route.query.id$route.query.name 来获取查询字符串参数。

路由参数

路由参数可以通过 URL 中的 : 来指定。我们可以通过 $route.params 对象来获取 URL 中的路由参数。比如,访问 /user/1,可以通过 $route.params.id 来获取路由参数。

state 状态

state 状态可以通过 router.push() 方法的第二个参数来传递。它们存储在浏览器的会话历史中,并且不会出现在 URL 中。我们可以通过 $route.params 对象来获取 state 状态。比如,我们使用 router.push({ path: '/user', params: { id: 1 }, state: { name: 'john' } }) 来传递一个 state 状态。

路由防卫

路由防卫是指在页面跳转之前,对一些逻辑进行判断和处理,比如登录状态、权限等。Vue-Router 提供了一些钩子函数,可以让我们在跳转页面之前进行一些逻辑判断。

全局钩子

全局钩子会在任何路由规则发生变化之前触发,比如:

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

---------------------- ----- ----- -- -
  -- ----------------------- -- -------------------------- -
    -- -------------------- -
      ------
        ----- ---------
        ------ - --------- ----------- -
      --
    - ---- -
      ------
    -
  - ---- -
    ------
  -
--
展开代码

在这个例子中,我们使用了 beforeEach() 钩子函数,它会在任何路由规则发生变化之前触发。在这里,我们判断了用户是否已经登录,如果没有则跳转到登录页面。

组件钩子

组件钩子会在组件内部进行跳转之前触发,比如:

-- -------------------- ---- -------
----- ---- - -
  --------- ---------- -- ---------------- -- - -- ------------------ ----------
  -------------------- ----- ----- -
    --------------------------------
    -------
  --
  --------------------- ----- ----- -
    ---------------------------------
    -------
  --
  -------------------- ----- ----- -
    --------------------------------
    -------
  -
-
展开代码

在这个例子中,我们在 User 组件中定义了三个组件钩子:beforeRouteEnter、beforeRouteUpdate、beforeRouteLeave。它们会在组件内部进行跳转之前触发。

示例代码

最后,我们提供一些实用的示例代码,以供读者参考和学习。

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

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

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

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

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

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

--- -----
  --- -------
  -------
  --------- -
    -----
      ---------- ------ ------------
      ----
        ---------------- ------------------------------
        ---------------- -------------------------------------------------
        ---------------- ------------- --- ------------------------
      -----
      ---------------------------
    ------
  -
--
展开代码

在这个例子中,我们定义了 Home、User、NotFound 三个组件,并定义了三个路由规则:/、/user/:id/:name、*。在 /user/:id/:name 路由规则中,我们使用了动态路由和查询字符串。

在 User 组件中,我们定义了三个组件钩子:beforeRouteEnter、beforeRouteUpdate、beforeRouteLeave。在路由防卫中,我们使用了全局钩子 beforeEach,并在 matched 属性中使用了 requiresAuth 自定义参数。

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

纠错
反馈

纠错反馈