Maison  >  Article  >  interface Web  >  Combien de types de fonctions de hook de routage vue existe-t-il ? Quelles sont les différences ?

Combien de types de fonctions de hook de routage vue existe-t-il ? Quelles sont les différences ?

青灯夜游
青灯夜游original
2021-10-27 17:51:018614parcourir

Vue a deux fonctions de hook de routage, à savoir : 1. Global guard (fonction de hook global), qui fait référence à l'objet routeur dans « index.js » ; 2. Routing guard (pour une seule fonction de hook de routage) ; les protections (fonctions de hook au niveau des composants) sont des protections définies à l'intérieur des composants de routage.

Combien de types de fonctions de hook de routage vue existe-t-il ? Quelles sont les différences ?

L'environnement d'exploitation de ce tutoriel : système Windows 7, vue version 2.9.6, ordinateur DELL G3. La fonction hook de

vue-router fait en fait référence au garde de navigation. vue-router钩子函数 ,其实说的就是 导航守卫

引用官网的话

导航” 表示路由正在发生改变。

vue-router 提供的导航守卫主要用来通过 跳转取消 的方式 守卫导航 。有多种机会植入路由导航过程中:全局的, 单个路由独享的, 或者组件级的。

也就是:全局守卫(全局钩子函数)路由守卫(针对单个路由钩子函数)组件守卫(组件级钩子函数)

代码演示环境搭建

先简单搭建一下环境

index.js

import { createRouter, createWebHashHistory } from 'vue-router';

const router = createRouter({
  history: createWebHashHistory(),
  routes: [
    {
      path: '/a',
      component: () => import('../components/A.vue'),
    },
    {
      path: '/b',
      component: () => import('../components/B.vue'),
    },
    {
      path: '/c',
      component: () => import('../components/C.vue'),
    },
  ],
});
export default router;

main.js

// index.js
import router from "./router"; 
createApp(App).use(router).mount("#app");

页面A

<template>
  <div>
    <h1>我是页面A啊</h1>
    <comp></comp>
  </div>
</template>

页面B

<template>
  <div>
    <h1>我是页面B啊</h1>
    <comp></comp>
  </div>
</template>

页面C

<template>
  <div>
    <h1>我是页面C啊</h1>
    <comp></comp>
  </div>
</template>

通用组件

<template>
  <div>我是公用组件啊</div>
</template>

当前页面是这样的,有点丑,凑活看吧,咱也不是来学习 css

Combien de types de fonctions de hook de routage vue existe-t-il ? Quelles sont les différences ?

全局守卫

顾名思义,是要定义在全局的,也就是我们 index.js 中的 router 对象。

beforeEach

全局前置守卫,在路由跳转前触发,它在 每次导航 时都会触发。

通过 router.beforeEach 注册一个全局前置守卫。

Combien de types de fonctions de hook de routage vue existe-t-il ? Quelles sont les différences ?

参数

beforeEach 全局前置守卫接收三个参数

  • to: Route: 即将要进入的目标路由对象
  • from: Route: 当前导航正要离开的路由对象
  • next: Function: 一定要调用该方法不然会阻塞路由。

注意: next 参数可以不添加,但是一旦添加,则必须调用一次,否则路由跳转等会停止。

next()方法的几种情况

  • next(): 进行管道中的下一个钩子。
  • next(false): 中断当前的导航。回到 from 路由对应的地址。
  • next(’/’) 或者 next({ path: ‘/’ }): 跳转到一个不同的地址,可传递的参数与 router.push 中选项一致。
  • next(error): 导航终止,且该错误会被传递给 router.onError() 注册过的回调。

我们把前两个参数打印出来看一下,里面包含路径,参数,元信息等内容。

Combien de types de fonctions de hook de routage vue existe-t-il ? Quelles sont les différences ?

返回值

  • false:取消当前的导航。
  • null,undefined,true或者直接return:调用下一个导航守卫。

定义多个守卫

全局前置守卫可以定义多个,根据创建顺序调用。在所有守卫完成之前导航一直处于等待中。

下面这个例子中我们就定义了两个 beforeEach 全局前置守卫。可以看到,只有在两秒以后分别打印出两条日志后才进行页面的跳转。

Combien de types de fonctions de hook de routage vue existe-t-il ? Quelles sont les différences ?

Combien de types de fonctions de hook de routage vue existe-t-il ? Quelles sont les différences ?

除了 beforeEach 全局前置守卫之外,其他的全局守卫都可以定义多个,并且在所有守卫完成之前导航一直处于等待中,其他的钩子函数就不进行演示了。

beforeResolve

全局解析守卫,在路由跳转前,所有 组件内守卫异步路由组件 被解析之后触发,它同样在 每次导航 时都会触发。

通过 router.beforeResolve 注册一个全局解析守卫。

router.beforeResolve((to, from, next) => {
  next();
})

回调参数,返回值和 beforeEach

Citation du site officiel🎜🎜🎜 "Navigation" signifie que l'itinéraire change. 🎜🎜🎜🎜Le garde de navigation fourni par vue-router est principalement utilisé pour garder la navigation en sauter ou annuler > . Il existe de multiples possibilités d'intégration dans le processus de navigation sur un itinéraire : globalement, exclusivement pour un seul itinéraire, ou au niveau des composants. 🎜🎜🎜C'est-à-dire : Global guard (fonction de hook globale), Routing guard (pour une fonction de hook de routage unique), Component guard (fonction de hook au niveau du composant) ). 🎜

Configuration de l'environnement de démonstration de code

🎜Configurez d'abord l'environnement simplement🎜🎜index.js🎜rrreee🎜main.js🎜rrreee🎜 Page A🎜rrreee🎜Page B🎜rrreee🎜Page C🎜rrreee🎜Composants communs🎜rrreee🎜La page actuelle est comme ça, c'est un peu moche, regarde-le juste pour t'amuser, on est pas là pour apprendre le css🎜🎜Combien de types de fonctions de hook de routage vue existe-t-il ? Quelles sont les différences ?🎜

Global guard

🎜Comme son nom l'indique, il est défini globalement, c'est-à-dire index.js dans notre objet code>router. 🎜

beforeEach

🎜Global front guard, déclenché avant le saut d'itinéraire, il se déclenchera à chaque navigation. 🎜🎜Enregistrez une garde globale beforeEach via router.beforeEach. 🎜🎜Combien de types de fonctions de hook de routage vue existe-t-il ? Quelles sont les différences ?🎜

Paramètres

🎜beforeEach La garde avant globale reçoit trois paramètres🎜
  • pour : Route : l'objet de route cible qui est sur le point d'entrer li>
  • from : Route : L'objet de routage que la navigation actuelle est sur le point de quitter
  • suivant : Fonction : Cette méthode doit être appelé sinon cela bloquera le routage.
🎜Remarque : Le paramètre next n'a pas besoin d'être ajouté, mais une fois ajouté, il doit être appelé une fois, sinon le routage saute, etc. . s'arrêtera. 🎜🎜 Plusieurs cas de la méthode next()🎜
  • next() : Passez au hook suivant dans le pipeline.
  • next(false) : Interrompre la navigation en cours. Retourner à l'adresse correspondant à l'itinéraire de.
  • next('/') ou next({ path: '/' }) : Accédez à une adresse différente, les paramètres qui peuvent être transmis sont les mêmes que routeur Les options dans push sont les mêmes.
  • next(error) : La navigation est terminée et l'erreur sera transmise au rappel enregistré par router.onError().
🎜Imprimons les deux premiers paramètres et jetons un coup d'œil. Ils contiennent des chemins, des paramètres, des méta-informations, etc. 🎜🎜Combien de types de fonctions de hook de routage vue existe-t-il ? Quelles sont les différences ?🎜

Valeur de retour h3>
  • false : Annule la navigation en cours.
  • Nul, indéfini, vrai ou retour direct : appelez le prochain garde de navigation.

Définir plusieurs gardes

🎜Plusieurs gardes frontaux globaux peuvent être définis et appelés selon l'ordre de création. La navigation est en attente jusqu'à ce que tous les gardes soient terminés. 🎜🎜Dans l'exemple suivant, nous définissons deux front guards globaux beforeEach. On peut voir que le saut de page ne se produit qu'après l'impression de deux journaux deux secondes plus tard. 🎜🎜Combien de types de fonctions de hook de routage vue existe-t-il ? Quelles sont les différences ?🎜🎜🎜🎜sauf avantEach En plus de la garde avant globale, plusieurs autres gardes globales peuvent être définies, et la navigation attendra que toutes les gardes soient terminées. Les autres fonctions de crochet ne seront pas démontrées. 🎜

beforeResolve

🎜La protection de résolution globale, avant le saut de routage, est déclenchée une fois que tous les Garde interne et Composant de routage asynchrone sont analysés. Il est également déclenché après. Se déclenche à chaque navigation. 🎜🎜Enregistrez un garde de résolution globale via router.beforeResolve. 🎜rrreee🎜Paramètre de rappel, la valeur de retour est la même que beforeEach. Il est également possible de définir plusieurs gardes d'analyse globales. 🎜

afterEach

Global post hook, il se produit une fois le saut d'itinéraire terminé, après beforeEach et beforeResolve, beforeRouteEnter (garde à l'intérieur du composant) Avant. Il se déclenche également à chaque navigation. beforeEachbeforeResolve 之后,beforeRouteEnter(组件内守卫)之前。它同样在 每次导航 时都会触发。

通过 router.afterEach 注册一个全局后置钩子。

Combien de types de fonctions de hook de routage vue existe-t-il ? Quelles sont les différences ?

这个钩子的两个参数和 beforeEach 中的 tofrom 一样。然而和其它全局钩子不同的是,这些钩子不会接受 next 函数,也不会改变导航本身。

路由守卫

顾名思义,就是跟路由相关的钩子,我们的路由守卫只有一个,就是 beforeEnter

beforeEnter

需要在路由配置上定义 beforeEnter 守卫,此守卫只在进入路由时触发,在 beforeEach 之后紧随执行,不会在 paramsqueryhash 改变时触发。

Combien de types de fonctions de hook de routage vue existe-t-il ? Quelles sont les différences ?

beforeEnter 路由守卫的参数是 tofromnext ,同 beforeEach 一样。

组件守卫

顾名思义,是定义在路由组件内部的守卫。

beforeRouteEnter

Combien de types de fonctions de hook de routage vue existe-t-il ? Quelles sont les différences ?

路由进入组件之前调用,该钩子在全局守卫 beforeEach 和路由守卫 beforeEnter 之后,全局 beforeResolve 和全局 afterEach 之前调用。

参数包括 tofromnext

该守卫内访问不到组件的实例,也就是 thisundefined,也就是他在 beforeCreate 生命周期前触发。

beforeRouteUpdate

Combien de types de fonctions de hook de routage vue existe-t-il ? Quelles sont les différences ?

对于 beforeRouteUpdate 来说,this 已经可用了,所以给 next 传递回调就没有必要了。

beforeRouteLeave

Combien de types de fonctions de hook de routage vue existe-t-il ? Quelles sont les différences ?

对于 beforeRouteLeave 来说,this 已经可用了,所以给 next 传递回调就没有必要了。

总结

完整的导航解析流程

  1. 导航被触发。
  2. 在失活的组件里调用 beforeRouteLeave 守卫。
  3. 调用全局的 beforeEach 守卫。
  4. 在重用的组件里调用 beforeRouteUpdate 守卫。
  5. 在路由配置里调用 beforeEnter
  6. 解析异步路由组件。
  7. 在被激活的组件里调用 beforeRouteEnter
  8. 调用全局的 beforeResolve 守卫。
  9. 导航被确认。
  10. 调用全局的 afterEach 钩子。
  11. 触发 DOM 更新。
  12. 调用 beforeRouteEnter 守卫中传给 next
  13. Enregistrez un posthook global via router.afterEach.
Combien de types de fonctions de hook de routage vue existe-t-il ? Quelles sont les différences ?

Ceci Les deux paramètres du hook sont les mêmes que to et from dans beforeEach. Cependant, contrairement à d'autres hooks globaux, ces hooks n'acceptent pas la fonction next et ne modifient pas non plus la navigation elle-même.

Route guard

Combien de types de fonctions de hook de routage vue existe-t-il ? Quelles sont les différences ?Comme son nom l'indique, il s'agit d'un hook lié au routage. Nous n'avons qu'un seul garde de route, qui est beforeEnter.

beforeEnterVous devez définir la garde beforeEnter sur la configuration du routage. Cette garde ne se déclenche qu'à la saisie de la route. Elle est exécutée immédiatement après beforeEach et ne le sera pas. être exécuté après Se déclenche lorsque les paramètres, query ou hash changent.

🎜Combien de types de fonctions de hook de routage vue existe-t-il ? Quelles sont les différences ?🎜🎜beforeEnter route guard sont to, from, next, les mêmes que beforeEach. 🎜

Garde de composant

🎜Comme son nom l'indique, il s'agit d'une garde définie à l'intérieur du composant de routage. 🎜🎜beforeRouteEnter🎜🎜Combien de types de fonctions de hook de routage vue existe-t-il ? Quelles sont les différences ? 🎜🎜Appelé avant que la route n'entre dans le composant, ce hook est appelé après la garde globale beforeEach et la garde de route beforeEnter, la garde globale beforeResolve et le afterEach global avant d'appeler. 🎜🎜Les paramètres incluent <code>à, de, suivant. 🎜🎜L'instance du composant n'est pas accessible dans cette garde, c'est-à-dire que this est non défini, c'est-à-dire qu'il est déclenché avant le beforeCreate cycle de vie. 🎜🎜beforeRouteUpdate🎜🎜Combien de types de fonctions de hook de routage vue existe-t-il ? Quelles sont les différences ? 🎜🎜Pour beforeRouteUpdate, this est déjà disponible, il n'est donc pas nécessaire de passer un rappel à next. 🎜🎜beforeRouteLeave🎜🎜Combien de types de fonctions de hook de routage vue existe-t-il ? Quelles sont les différences ? 🎜🎜Pour beforeRouteLeave, this est déjà disponible, donc passer un rappel à next n'est pas nécessaire. 🎜

Résumé

🎜Processus complet d'analyse de la navigation🎜
  1. La navigation est déclenchée. 🎜
  2. Appelez la garde beforeRouteLeave dans le composant désactivé. 🎜
  3. Appelez la garde globale beforeEach. 🎜
  4. Appelez la garde beforeRouteUpdate dans le composant réutilisé. 🎜
  5. Appelez beforeEnter dans la configuration du routage. 🎜
  6. Résoudre les composants de routage asynchrone. 🎜
  7. Appelez beforeRouteEnter dans le composant activé. 🎜
  8. Appelez la garde globale beforeResolve. 🎜
  9. Navigation confirmée. 🎜
  10. Appelez le hook global afterEach. 🎜
  11. Déclenchez les mises à jour du DOM. 🎜
  12. Appelez la fonction de rappel passée à next dans la garde beforeRouteEnter, et l'instance de composant créée sera transmise en tant que paramètre de la fonction de rappel. 🎜🎜🎜🎜Ce qui précède est la réponse officielle. Nous utilisons maintenant un organigramme pour le montrer intuitivement. 🎜🎜🎜🎜🎜Recommandations associées : "🎜Tutoriel vue.js🎜"🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn