Vue的路由及路由钩子函数的实现

yizhihongxing

来给您详细讲解一下 "Vue的路由及路由钩子函数的实现"。

一、Vue的路由机制

Vue.js 是一款轻量级的 JavaScript 框架,为我们提供了一套完整的解决方案。Vue 的路由机制实现了单页应用(SPA)的核心,通过改变 URL 地址实现页面的切换,而不像传统的多页应用刷新整个页面。Vue 的路由是以插件形式进行管理的,它提供了很多的路由接口和钩子函数。

路由所提供的核心功能就是实现了单页应用内对 URL 的处理,我们可以通过路由来跳转到不同的页面。在 Vue-router 中,它有三个基础概念:Router、Route、VueRouter

  • Router 是 Vue 当中创建路由的一个实例化对象,用于接收一些配置参数、传递到对应组件。它的主要功能是初始化全局路由,监听 URL 变化,处理路由匹配。

  • Route 就是路由映射的对象,每个 Route 对象对应着一个 URL。

  • VueRouter 是 Vue.js 官方的 router 模块,它是构建单页应用必不可少的核心代码之一,VueRouter 的主要作用就是实现路由跳转、页面切换等功能。

下面是一个简单的实例来帮助您更好的理解:

import Vue from "vue";
import Router from "vue-router";

Vue.use(Router);

const routes = [{
    path: "/",
    name: "home",
    component: () => import("@/views/Home.vue")
}, {
    path: "/about",
    name: "about",
    component: () => import("@/views/About.vue")
}]

const router = new Router({
    mode: "history",
    base: process.env.BASE_URL,
    routes
})

export default router;

在这里,我们通过 import Router 引入了路由并通过 Vue.use(Router) 进行注册。设置好了路由相关的参数后,再通过 new Router() 创建一个路由实例,这里参数的意义分别是:

  • mode 为路由模式,默认是 hash 模式,可以改成 history 模式

  • base 表示配置路由的根路径

  • routes 表示路由列表,里面都是路由对象,包含路由的路径、名称、对应的组件等属性

最后,我们将 router 实例暴露出去,再在 main.js 里面导入并挂载到 Vue 实例上即可:

import Vue from "vue";
import App from "./App.vue";
import router from "./router";

Vue.config.productionTip = false;

new Vue({
    router,
    render: h => h(App)
}).$mount("#app");

二、路由钩子函数

路由钩子函数就是在路由到达前或离开后执行的一些操作,这些操作主要有以下几种:

  • 全局守卫: 当导航到某个路由时可以触发的钩子函数,包括 beforeEachbeforeResolveafterEach

  • 组件内守卫: 即在组件内定义的钩子函数,包括 beforeRouteEnterbeforeRouteUpdatebeforeRouteLeave

1. 全局守卫

Vue-router 提供了一些全局钩子函数,可以在路由导航过程中,在不同的生命周期阶段调用这些函数。

beforeEach(to, from, next)

全局前置守卫,类似于路由拦截器。在路由跳转前,可以做一些跳转前所需的逻辑。如果调用的 next 函数,则路由会继续往下执行,否则路由就会停止跳转。

router.beforeEach((to, from, next) => {
  //to: 要进入的路,from: 从哪个路由离开的,next: 继续往下执行
  if(to.meta.requiresAuth && !store.getters.isLoggedIn) {
    next('/login')
  } else {
    next()
  }
})

beforeResolve(to, from, next)

全局解析守卫,可以在所有组件内守卫和异步路由组件被解析之后调用。

router.beforeResolve((to, from, next) => {
  console.log('全局解析守卫');
  next();
})

afterEach(to, from)

全局后置钩子函数,类似于请求拦截器的返回拦截器,不会接受 next 函数。afterEach 只是要通知你已经完成了一些操作,你不需要再调用 next(),跳转已经完成。

router.afterEach((to, from) => {
  console.log('已经完成了路由跳转');
})

2. 组件内守卫

这些守卫函数被组件内的路由钩子调用。它们可以有许多用例,例如在进入或离开页面时,需要验证或修改组件的一些数据。

beforeRouteEnter(to, from, next)

访问路由之前为组件生成实例,有时候在组件里的钩子函数,我们拿到的是 undefined,这时候需要用到 beforeRouteEnter 组件钩子,它提供一个回调函数next,可以在回调函数next里面接受这个实例。

export default {
  beforeRouteEnter(to, from, next) {
    console.log('beforeRouteEnter')
    next(vm => {
      //vm 是 beforeRouteEnter 里面的 this 实例
      vm.xxx = "hello world"
    })
  },
  data() {
    return  {
      xxx: ""
    }
  }
}

beforeRouteUpdate(to, from, next)

beforeRouteUpdate 可以监测到 $route 对象的变化,通常用于复用组件时,当在当前路由中使用组件时,如果路由参数发生变化,组件会进行复用,这时候可以使用 beforeRouteUpdate 钩子函数来更新组件的数据。

export default {
  //更新时有参数对应,to 表示更新的路由
  beforeRouteUpdate(to, from, next) {
    const id = to.params.id
    console.log('beforeRouteUpdate for -> :', id)
    this.fetchData(id)
    next()
  },
  methods: {
    fetchData(id) {
      console.log('beforeRouteEnter fetchData for -> :', id)
    }
  }
}

beforeRouteLeave(to, from, next)

beforeRouteLeave 在路由离开时调用,离开组件之前,通过 next 回调函数中传递 true 或 false,来控制离开行为。

export default {
  beforeRouteLeave(to, from, next) {
    console.log('beforeRouteLeave')
    if(confirm('确定离开?')) {
      next()
    } else {
      next(false)
    }
  }
}

总结

Vue-router 作为 Vue.js 框架中的一部分,使用方便简单,提供了路由的基础功能,同时支持多种钩子函数,这些钩子函数可以帮助我们在路由跳转前或后,自定义处理一些逻辑,提高了项目的可扩展性、可维护性。

以上就是 "Vue的路由及路由钩子函数的实现" 的详细讲解,希望对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Vue的路由及路由钩子函数的实现 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • vue项目history模式下部署子路由跳转失败的解决

    针对vue项目history模式下部署子路由跳转失败的问题,可以采取以下步骤进行解决: 问题分析 在使用vue项目的时候,我们常常会使用到路由来实现不同页面之间的跳转。而在VueRouter中,常见的路由模式有hash模式和history模式。其中hash模式是指在浏览器的URL地址中,使用#来区分不同的子路由。例如,http://localhost:808…

    Vue 2023年5月29日
    00
  • 安装多版本Vue-CLI的实现方法

    请注意以下完整攻略,包含了安装多版本Vue-CLI的实现方法和两条示例说明: 1. 安装nvm nvm 是 Node.js 的版本管理器,可以方便地在本机多版本 Node.js 之间切换。我们可以通过安装 nvm 来实现多版本 Vue-CLI 的安装。先来安装 nvm,可以前往 nvm 的 GitHub 仓库 下载脚本进行安装。 $ curl -o- htt…

    Vue 2023年5月28日
    00
  • 详解vue渲染从后台获取的json数据

    让我们来详细讲解“详解vue渲染从后台获取的json数据”的完整攻略。 1. 获取后台数据 首先,我们需要从后台获取数据。通常,我们会使用ajax或fetch等方式来获取数据。在Vue.js中,我们可以使用axios插件来实现异步请求。 例如,我们可以使用axios发送一个GET请求来获取后台的数据: import axios from ‘axios’ ex…

    Vue 2023年5月28日
    00
  • Vue自定义指令使用方法详解

    Vue自定义指令使用方法详解 什么是自定义指令 Vue.js 自带一些指令,比如 v-if、v-for 等,用于操作元素的属性、文本内容等。而自定义指令,就是允许我们自定义一些指令,实现一些 Vue.js 自带指令不具备的操作。 Vue.js 的自定义指令是通过 directive 方法来实现的,语法如下: // 全局定义 Vue.directive(‘指令…

    Vue 2023年5月27日
    00
  • vue实现数字动态翻牌的效果(开箱即用)

    下面是详细讲解“vue实现数字动态翻牌的效果(开箱即用)”的完整攻略: 背景 数字翻牌是一种常见的数字展示方式,适用于数字金融类、计数器、抽奖等场景。在这里我们将使用Vue.js实现数字动态翻牌的效果。 实现思路 数字动态翻牌的效果主要要用到CSS3动画和Vue动态绑定数据。首先需要用CSS3设置数字的动态翻牌效果,在Vue中通过监听数据变化来触发数字动态翻…

    Vue 2023年5月27日
    00
  • Vue不能watch数组和对象变化解决方案

    Vue中的watch属性用于监控变量的变化并执行相应的操作,但是Vue默认不能直接监控数组和对象的变化。如果要监控数组和对象的变化需要使用特定的解决方案。 问题分析 Vue默认不支持watch数组和对象的变化是因为Vue实现了一个高效的响应式系统,它利用了ES6的Proxy特性来实现对数据的监控。但是Proxy不支持ie11以下的浏览器,因此对于不支持ES6…

    Vue 2023年5月28日
    00
  • Vue Element UI + OSS实现上传文件功能

    下面是“Vue Element UI + OSS实现上传文件功能”的完整攻略。 准备工作 1.安装Vue CLI并创建Vue项目。 2.引入Element UI和Aliyun OSS SDK。 <!– index.html –> <!DOCTYPE html> <html lang="en"> &l…

    Vue 2023年5月28日
    00
  • vue与vue-i18n结合实现后台数据的多语言切换方法

    下面是“vue与vue-i18n结合实现后台数据的多语言切换方法”的完整攻略: 1. 安装和配置vue-i18n 首先需要在项目中安装和配置vue-i18n,安装命令为: npm install vue-i18n –save 然后在main.js中引入vue-i18n并进行配置: import Vue from ‘vue’ import App from …

    Vue 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部