목차
分析
我是页面A啊
我是页面B啊
我是页面C啊
全局守卫
분석
글로벌 가드
路由守卫
组件守卫
beforeRouteLeave
总结
完整的导航解析流程
웹 프론트엔드 프런트엔드 Q&A vue-router에는 여러 개의 후크가 있습니다

vue-router에는 여러 개의 후크가 있습니다

Dec 22, 2021 pm 04:49 PM
vue-router

7개의 후크가 있습니다: 1. beforeEach; 4. beforeEnter; 6. beforeRouteUpdate;

vue-router에는 여러 개의 후크가 있습니다

이 튜토리얼의 운영 환경: Windows 7 시스템, vue 버전 2.9.6, DELL G3 컴퓨터.

vue-router에는 몇 개의 후크 기능이 있나요? 정확히 무엇이고 실행 과정은 어떻게 되나요? vue-router 有几种钩子函数?具体是什么及执行流程是怎样的?

先上思维导图。

vue-router 钩子函数.png

分析

vue-router钩子函数 ,其实说的就是 导航守卫

引用官网的话

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

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

也就是:全局守卫路由守卫组件守卫

代码演示环境搭建

先简单搭建一下环境

index.js

/*
 * @Description:一尾流莺
 * @Date: 2021-03-21 16:17:56
 * @LastEditTime: 2021-07-18 15:14:42
 * @FilePath: \vite-project-js\src\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 id="我是页面A啊">我是页面A啊</h1>
    <comp></comp>
  </div>
</template>
로그인 후 복사

页面B

<template>
  <div>
    <h1 id="我是页面B啊">我是页面B啊</h1>
    <comp></comp>
  </div>
</template>
로그인 후 복사

页面C

<template>
  <div>
    <h1 id="我是页面C啊">我是页面C啊</h1>
    <comp></comp>
  </div>
</template>
로그인 후 복사

通用组件

<template>
  <div>我是公用组件啊</div>
</template>
로그인 후 복사

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

vue-router에는 여러 개의 후크가 있습니다

全局守卫

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

beforeEach

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

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

vue-router에는 여러 개의 후크가 있습니다

参数

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

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

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

next()方法的几种情况

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

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

vue-router에는 여러 개의 후크가 있습니다

返回值

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

定义多个守卫

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

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

vue-router에는 여러 개의 후크가 있습니다

vue-router에는 여러 개의 후크가 있습니다

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

beforeResolve

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

通过 router.beforeResolve

마인드맵으로 시작해보세요. 🎜🎜vue-router 후크 기능.png🎜

분석

🎜vue-router후크 기능은 실제로 탐색 가드를 참조합니다. 🎜🎜공식 홈페이지에서 인용🎜🎜🎜 "내비게이션"은 경로가 변경된다는 의미입니다. 🎜🎜🎜🎜 vue-router에서 제공하는 내비게이션 가드는 주로 점프 또는 취소에 의한 내비게이션 보호에 사용됩니다. > . 경로 탐색 프로세스를 구축할 수 있는 기회는 여러 가지가 있습니다. 전역적으로, 단일 경로에 대해 단독으로 또는 구성 요소 수준에서 말이죠. 🎜🎜🎜즉, Global Guard, Routing Guard, Component Guard입니다. 🎜🎜코드 데모 환경 구축🎜🎜먼저 간단하게 환경🎜🎜index.js🎜
router.beforeResolve((to, from, next) => {
  next();
})
로그인 후 복사
로그인 후 복사
🎜main을 설정해보겠습니다. js🎜rrreee 🎜Page A🎜rrreee🎜Page B🎜rrreee🎜Page C🎜rrreee🎜🎜공통 구성요소🎜🎜rrreee🎜현재 페이지는 이렇습니다. 조금 보기 흉합니다. 한 번 보세요. 우리는 배우려고 온 것이 아닙니다. < code>css 🎜🎜vue-router에는 여러 개의 후크가 있습니다🎜

글로벌 가드

🎜이름에서 알 수 있듯이 이는 index.js</code의 <code>라우터 객체인 전역적으로 정의됩니다. >. 🎜🎜beforeEach🎜🎜경로 점프 전에 트리거되는 전역 프론트 가드는 모든 탐색에서 트리거됩니다. 🎜🎜router.beforeEach를 통해 전역 beforeEach 가드를 등록하세요. 🎜🎜vue-router에는 여러 개의 후크가 있습니다🎜🎜매개변수 🎜🎜beforeEach 전역 프론트 가드는 세 개의 매개변수를 받습니다🎜
  • to: Route: 곧 진입하려는 대상 라우팅 객체
  • from: Route: 현재 탐색이 곧 떠날 경로 개체
  • next: 함수: 이 메소드를 호출해야 합니다. 그렇지 않으면 경로가 차단됩니다.
🎜참고: next 매개변수는 추가할 필요가 없지만 일단 추가되면 한 번 호출해야 합니다. 그렇지 않으면 점프 등을 라우팅합니다. .멈추겠습니다. 🎜🎜 next() 메서드의 여러 사례🎜
  • next(): 파이프라인의 다음 후크로 진행합니다.
  • next(false): 현재 탐색을 중단합니다. from 경로에 해당하는 주소로 돌아갑니다.
  • next('/') 또는 next({ path: '/' }): 다른 주소로 점프, 전달할 수 있는 매개변수는 router.push의 옵션은 동일합니다.
  • next(error): 탐색이 종료되고 오류는 router.onError()에 의해 등록된 콜백으로 전달됩니다.
🎜처음 두 매개변수를 인쇄하여 경로, 매개변수, 메타정보 등이 포함되어 있는지 살펴보겠습니다. 🎜🎜vue-router에는 여러 개의 후크가 있습니다🎜🎜반환 값< /strong>🎜
  • false: 현재 탐색을 취소합니다.
  • null, 정의되지 않음, true 또는 직접 반환: 다음 탐색 가드를 호출합니다.
🎜여러 가드 정의 🎜🎜 생성 순서에 따라 여러 글로벌 프론트 가드를 정의하고 호출할 수 있습니다. 모든 가드가 완료될 때까지 탐색이 보류됩니다. 🎜🎜다음 예에서는 두 개의 beforeEach 전역 프론트 가드를 정의합니다. 2초 후에 두 개의 로그가 출력된 후에야 페이지 점프가 발생하는 것을 알 수 있다. 🎜🎜vue-router에는 여러 개의 후크가 있습니다🎜🎜< img alt="vue-router에는 여러 개의 후크가 있습니다"/>🎜🎜beforeEach 제외 글로벌 프론트 가드 외에도 여러 다른 글로벌 가드를 정의할 수 있으며 탐색은 모든 가드가 완료될 때까지 대기합니다. 다른 후크 기능은 시연되지 않습니다. 🎜🎜beforeResolve🎜🎜전역 해상도 가드, 경로 점프 전, 모든 구성 요소 내 가드 트리거됨 비동기 라우팅 구성요소가 파싱된 후에는 모든 탐색 시에도 트리거됩니다. 🎜🎜 router.beforeResolve를 통해 전역 해상도 가드를 등록하세요. 🎜
router.beforeResolve((to, from, next) => {
  next();
})
로그인 후 복사
로그인 후 복사

回调参数,返回值和 beforeEach 一样。也可以定义多个全局解析守卫。

afterEach

全局后置钩子,它发生在路由跳转完成后,beforeEachbeforeResolve 之后,beforeRouteEnter(组件内守卫)之前。它同样在 每次导航 时都会触发。

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

vue-router에는 여러 개의 후크가 있습니다

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

路由守卫

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

beforeEnter

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

vue-router에는 여러 개의 후크가 있습니다

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

组件守卫

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

beforeRouteEnter

vue-router에는 여러 개의 후크가 있습니다

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

参数包括 tofromnext

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

beforeRouteUpdate

vue-router에는 여러 개의 후크가 있습니다

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

beforeRouteLeave

vue-router에는 여러 개의 후크가 있습니다

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

总结

完整的导航解析流程

  • 导航被触发。

  • 在失活的组件里调用 beforeRouteLeave 守卫。

  • 调用全局的 beforeEach 守卫。

  • 在重用的组件里调用 beforeRouteUpdate 守卫。

  • 在路由配置里调用 beforeEnter

  • 解析异步路由组件。

  • 在被激活的组件里调用 beforeRouteEnter

  • 调用全局的 beforeResolve 守卫。

  • 导航被确认。

  • 调用全局的 afterEach 钩子。

  • 触发 DOM 更新。

  • 调用 beforeRouteEnter 守卫中传给 next 的回调函数,创建好的组件实例会作为回调函数的参数传入。

上面是官方给出的答案,现在我们用流程图来直观的展示一下。

vue-router에는 여러 개의 후크가 있습니다

【相关推荐:《vue.js教程》】

위 내용은 vue-router에는 여러 개의 후크가 있습니다의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

내 Vue 애플리케이션에서 'NavigationDuplicated: 현재 위치에 대한 중복 탐색 방지'라는 vue-router 오류가 발생했습니다. 이를 해결하는 방법은 무엇입니까? 내 Vue 애플리케이션에서 'NavigationDuplicated: 현재 위치에 대한 중복 탐색 방지'라는 vue-router 오류가 발생했습니다. 이를 해결하는 방법은 무엇입니까? Jun 24, 2023 pm 02:20 PM

Vue 애플리케이션에서 발생하는 vue-router 오류 "NavigationDuplicated:Avoidedredundantnavigationtocurrentlocation" - 어떻게 해결합니까? Vue.js는 빠르고 유연한 JavaScript 프레임워크로서 프런트 엔드 애플리케이션 개발에서 점점 더 인기를 얻고 있습니다. VueRouter는 라우팅 관리에 사용되는 Vue.js의 코드 라이브러리입니다. 그러나 때로는

Vue 라우팅을 자세히 설명하는 기사: vue-router Vue 라우팅을 자세히 설명하는 기사: vue-router Sep 01, 2022 pm 07:43 PM

이 글은 Vue 제품군 버킷에 있는 Vue-Router에 대해 자세히 설명하고 라우팅 지식에 대해 알아보는 데 도움이 되기를 바랍니다.

Vue 및 Vue-Router: 구성 요소 간에 데이터를 공유하는 방법은 무엇입니까? Vue 및 Vue-Router: 구성 요소 간에 데이터를 공유하는 방법은 무엇입니까? Dec 17, 2023 am 09:17 AM

Vue 및 Vue-Router: 구성 요소 간에 데이터를 공유하는 방법은 무엇입니까? 소개: Vue는 사용자 인터페이스 구축에 널리 사용되는 JavaScript 프레임워크입니다. Vue-Router는 단일 페이지 애플리케이션을 구현하는 데 사용되는 Vue의 공식 라우팅 관리자입니다. Vue 애플리케이션에서 컴포넌트는 사용자 인터페이스를 구축하기 위한 기본 단위입니다. 많은 경우 서로 다른 구성 요소 간에 데이터를 공유해야 합니다. 이 기사에서는 Vue 및 Vue-Router에서 데이터 공유를 달성하는 데 도움이 되는 몇 가지 방법을 소개합니다.

Vue 애플리케이션에서 vue-router를 사용할 때 '오류: 현재 위치로의 중복 탐색 방지' 문제를 해결하는 방법은 무엇입니까? Vue 애플리케이션에서 vue-router를 사용할 때 '오류: 현재 위치로의 중복 탐색 방지' 문제를 해결하는 방법은 무엇입니까? Jun 24, 2023 pm 05:39 PM

Vue 애플리케이션에서 vue-router를 사용할 때 "오류: 현재 위치에 대한 중복 탐색 방지"라는 오류 메시지가 나타나는 경우가 있습니다. 이 오류 메시지는 "현재 위치로의 중복 탐색 방지"를 의미하며 일반적으로 동일한 링크를 반복적으로 클릭하거나 동일한 라우팅 경로를 사용할 때 발생합니다. 그렇다면 이 문제를 해결하는 방법은 무엇입니까? 라우터를 정의할 때 정확한 수정자를 사용하세요.

Vue 애플리케이션에서 vue-router를 사용할 때 '오류: 잘못된 경로 구성 요소: xxx' 문제를 해결하는 방법은 무엇입니까? Vue 애플리케이션에서 vue-router를 사용할 때 '오류: 잘못된 경로 구성 요소: xxx' 문제를 해결하는 방법은 무엇입니까? Jun 25, 2023 am 11:52 AM

Vue는 개발자가 효율적이고 재사용 가능한 웹 애플리케이션을 신속하게 구축할 수 있는 인기 있는 프런트 엔드 프레임워크입니다. Vue-router는 개발자가 애플리케이션 라우팅 및 탐색을 쉽게 관리하는 데 도움이 되는 Vue 프레임워크의 플러그인입니다. 그러나 Vue-router를 사용할 때 "Error:InvalidroutecomComponent:xxx"라는 일반적인 오류가 발생하는 경우가 있습니다. 이 문서에서는 이 오류의 원인과 해결 방법을 설명합니다. 그 이유는 Vu에 있다

Vue 애플리케이션에서 vue-router를 사용할 때 '오류: 비동기 구성 요소를 해결하지 못했습니다: xxx' 문제를 해결하는 방법은 무엇입니까? Vue 애플리케이션에서 vue-router를 사용할 때 '오류: 비동기 구성 요소를 해결하지 못했습니다: xxx' 문제를 해결하는 방법은 무엇입니까? Jun 24, 2023 pm 06:28 PM

vue-router를 사용하는 것은 Vue 애플리케이션에서 라우팅 제어를 구현하는 일반적인 방법입니다. 하지만 vue-router 사용 시 비동기 컴포넌트 로딩 오류로 인해 "Error: FailedtoresolveasynccomComponent:xxx" 오류가 발생하는 경우가 있습니다. 이번 글에서는 이 문제를 살펴보고 해결책을 제시하겠습니다. 비동기식 구성요소 로딩의 원리를 이해합니다. Vue에서 구성요소는 동기식 또는 비동기식으로 생성될 수 있습니다.

Vue-Router: 라우팅 메타 정보를 사용하여 경로를 관리하는 방법은 무엇입니까? Vue-Router: 라우팅 메타 정보를 사용하여 경로를 관리하는 방법은 무엇입니까? Dec 18, 2023 pm 01:21 PM

Vue-Router: 라우팅 메타 정보를 사용하여 경로를 관리하는 방법은 무엇입니까? 소개: Vue-Router는 Vue.js의 공식 라우팅 관리자로 단일 페이지 애플리케이션(SPA)을 빠르게 구축하는 데 도움이 됩니다. 일반적인 라우팅 기능 외에도 Vue-Router는 라우팅을 관리하고 제어하기 위해 라우팅 메타 정보 사용을 지원합니다. 라우팅 메타 정보는 경로에 연결할 수 있는 사용자 정의 속성으로, 일부 특수 논리 또는 권한 제어를 구현하는 데 도움이 될 수 있습니다. 1. 라우팅 메타정보란? 라우팅 메타 정보는 다음과 같습니다.

Vue 오류 해결: 경로 점프에 vue-router를 올바르게 사용할 수 없습니다. Vue 오류 해결: 경로 점프에 vue-router를 올바르게 사용할 수 없습니다. Aug 17, 2023 pm 10:29 PM

Vue 오류 해결: 라우팅 점프에 vue-router를 올바르게 사용할 수 없습니다. Vue를 사용하여 프런트 엔드 프로젝트를 개발할 때 페이지 라우팅 점프에 vue-router를 사용하는 경우가 많습니다. 그러나 때때로 vue-router를 사용할 때 일부 오류가 발생하여 경로가 정상적으로 점프하지 못하는 경우가 있습니다. 이 기사에서는 이 질문에 답하고 그에 상응하는 해결책을 제시할 것입니다. 먼저 vue-router를 사용하기 전에 vue-rou가 올바르게 설치되었는지 확인해야 합니다.

See all articles