[편집 및 공유] vue-router 관련 인터뷰 질문 일부 (답변 분석 포함)
이 글은 Vue-Router 관련 인터뷰 질문(답변 분석 포함)을 요약하고 공유하여 기본 지식을 정리하고 Vue-Router 지식 보유량을 높이는 데 도움이 됩니다. 꼭 들러보세요!
vue-router의 원리
단일 페이지 애플리케이션에서 서로 다른 구성 요소 간 전환은 프런트 엔드 라우팅을 통해 구현되어야 합니다.
Front-end Routing
1. 키는 경로이고, 값은 페이지 콘텐츠를 표시하는 데 사용되는 구성 요소입니다.
2. 작업 프로세스: 브라우저의 경로가 변경되면 해당 구성 요소가 표시됩니다. vue-router
의 라우팅 기능: vue-router
的路由作用:将组件映射到路由, 然后渲染出来
主要就是
路由的hash模式
hash 是 URL 中
#
及后面的那部分,#
后的url不会发送到服务器,所以改变 URL 中的 hash 部分不会引起页面刷新window可以监听
onhashchange
事件变化。当hash变化时,读取#
后的内容,根据信息进行路由规则匹配,通过改变window.location.hash
改变页面路由。
改变URL的三种方式
- 通过浏览器前进后退改变 URL
- 通过标签改变 URL
- 通过window.location改变URL
优点
- 只需要前端配置路由表, 不需要后端的参与
- 兼容性好, 浏览器都能支持
hash值改变不会向后端发送请求, 完全属于前端路由
缺点
- hash值前面需要加#, 不符合url规范,也不美观
路由的history模式 - 利用H5的history API
html5 的history Interface 中新增的
pushState()
和replaceState()
方法,用来在浏览历史中添加和修改记录,改变页面路径,使URL跳转不会重新加载页面。类似
hashchange
事件的popstate
事件,但 popstate 事件有些不同:
只有在做出浏览器的行为才会调用 popState,用户点击浏览器倒退按钮和前进按钮,或者使用 JavaScript 调用History.back()、History.forward()、History.go()方法时才会触发。
优点
符合url地址规范, 不需要#, 使用起来比较美观
缺点
- 在用户手动输入地址或刷新页面时会发起url请求, 后端需要配置index.html页面用户匹配不到静态资源的情况, 否则会出现404错误
- 兼容性比较差, 是利用了 HTML5 History对象中新增的
pushState()
和replaceState()
方法,需要特定浏览器的支持.
$route和$router有什么区别?
$router是VueRouter的实例对象,表示整个应用的唯一路由器对象。包含了路由跳转的方法、钩子函数等。
$route是当前路由对象,表示本组件的路由规则,每一个路由都会有一个route对象,是一个局部对象。
vue-router参数传递的几种方式,有什么区别?
- | 描述 | 如何指定跳转的路由 | 如果没有传参 | 可以传参没有要求的值吗 |
---|---|---|---|---|
params参数 | 路径/params参数 |
必须要使用name指定路由 | params是路由的一部分,如果在配置了占位符必须要有 如果这个路由有params传参,但是在跳转的时候没有传这个参数,会导致跳转失败或者页面会没有内容。 |
传递路径上没有的占位符,地址栏上不会显示并且刷新会丢失 |
query参数 |
路径? key1=val1 & key2=val2.... 구성 요소를 경로에 매핑한 다음 렌더링 |
주로 |
방법 페이지를 새로 고치지 않고 URL을 변경하려면 | URL 변경을 감지하는 방법 [관련 권장 사항: vuejs 비디오 튜토리얼 | , 웹 프론트엔드 개발
- 🎜hash는 URL에서
#
와 다음 사이의 부분입니다.#
뒤의 URL은 서버로 전송되지 않으므로 🎜변경하세요. URL의 해시 부분은 페이지를 새로 고치지 않습니다. 🎜🎜 - 🎜창은
onhashchange
이벤트 변경 사항을 모니터링할 수 있습니다. 해시가 변경되면#
뒤의 내용을 읽고, 그 정보를 바탕으로 라우팅 규칙을 일치시키고,window.location.hash
를 변경하여 페이지 라우팅을 변경합니다. 🎜
- 브라우저를 통해 앞뒤로 URL 변경
- 태그를 통해 URL 변경
- window.location을 통해 URL 변경
- 프런트엔드에서만 라우팅 테이블을 구성하면 되며 백엔드 개입은 필요하지 않습니다. li>
- 우수한 호환성, 브라우저 지원 가능
- 🎜해시 값 변경은 백엔드로 요청을 보내지 않으며 완전히 프런트엔드 라우팅입니다🎜
- 해시 값이 앞에 필수입니다. #을 추가하면 URL 사양을 준수하지 않고 아름답지 않습니다.
🎜🎜 라우팅의 기록 모드 - H5의 기록 API 사용🎜
- 새로운
pushState()
및replaceState( )
🎜html5의 기록 인터페이스에 있는 메소드는 검색 기록에 기록을 추가 및 수정하고, 페이지 경로를 변경하고, 🎜페이지를 다시 로드하지 않고 URL을 이동하도록 만드는 데 사용됩니다🎜. 🎜 - 🎜
popstate
이벤트는hashchange
이벤트와 유사하지만 popstate 이벤트는 약간 다릅니다. 🎜는 🎜를 수행한 후에만 호출됩니다. 브라우저의 동작🎜 popState는 사용자가 브라우저의 뒤로 버튼과 앞으로 버튼을 클릭하거나 JavaScript를 사용하여 History.back(), History.forward() 및 History.go() 메서드를 호출할 때 트리거됩니다. 🎜
- 🎜URL 주소 사양을 준수하여 #이 필요하지 않으며 사용하기가 더 아름답습니다🎜
- 사용자가 수동으로 주소를 입력하거나 페이지를 새로 고치면 URL 요청이 시작되므로 사용자가 정적 리소스와 일치할 수 없도록 백엔드에서 index.html 페이지를 구성해야 합니다. 404 오류가 발생합니다.
- 호환성 HTML5 기록의 새로운
pushState()
및replaceState()
메서드를 활용합니다. 특정 브라우저의 지원이 필요한 객체입니다. ul>🎜🎜🎜$route와 $router의 차이점은 무엇인가요? 🎜🎜🎜$router는 VueRouter의 인스턴스 객체로, 전체 애플리케이션에 대한 유일한 라우터 객체를 나타냅니다. 라우팅 점프 방법, 후크 기능 등이 포함되어 있습니다. 🎜 $route는 이 구성 요소의 라우팅 규칙을 나타내는 현재 라우팅 개체입니다. 각 경로에는 로컬 개체인 경로 개체가 있습니다. 🎜🎜🎜🎜Vue-router 매개변수는 여러 방식으로 전달되는데, 차이점은 무엇인가요?🎜🎜 - 全局路由守卫 : 可以有多个根据创建顺序调用。
-
router.beforeEach()
全局前置守卫,每次导航时都会触发。 -
router.afterEach()
全局后置路由守卫,每次路由跳转完成后。不会接受 next 函数,跳转完成已经进入到组件内了 -
router.beforResolve()
全局解析守卫,在路由跳转前,所有组件内守卫和 异步路由组件 被解析之后触发,它同样在 每次导航 时都会触发。 解析完成后导航被确定,准备开始跳转。
-
- 组件内路由守卫
-
beforeRouteEnter()
路由进入组件之前调用,该钩子在beforeEach
和beforeEnter
之后。
此时还没有进入组件,组件实例还没有被创建。所以不能获取组件实例,此时 this 为 undefined,在beforeCreate
生命周期前触发。 -
beforeRouteUpdate()
this 已经可用了,所以给 next 传递回调就没有必要了。对一个带有动态参数的路径 /foo/:id,在/foo/1 和/foo/2之间跳转的时候,由于会渲染统一的Foo组件,因此这个组件实例会被复用,这个钩子在这种情况下可以被调用。 -
beforeRouteLeave()
离开该组件时被调用,this 已经可用了,所以给 next 传递回调就没有必要了。
-
- 独享路由守卫
-
beforeEnter()
需要在路由配置上定义 beforeEnter 守卫,此守卫只在进入路由时触发,在 beforeEach 之后紧随执行,不会在 params、query 或 hash 改变时触发。
-
-
include
、exclude
前两个属性允许keep-alive
有条件的进行缓存 -
max
可以定义组件最大的缓存个数,如果超过了这个个数的话,在下一个新实例创建之前,就会将以缓存组件中最久没有被访问到的实例销毁掉。 - 글로벌 라우팅 가드: 생성 순서에 따라 여러 호출이 있을 수 있습니다.
-
router.beforeEach()
전역 프론트 가드, 🎜는 탐색할 때마다 실행됩니다🎜. -
router.afterEach()
각 경로 점프가 완료된 후 전역 사후 라우팅 가드입니다. 🎜다음 함수를 허용하지 않습니다🎜, 점프가 완료되었고 구성 요소에 들어갔습니다. -
router.beforResolve()
전역 구문 분석 가드, 경로 점프 전, 모든 🎜 구성 요소 Guards 🎜 및 🎜Async 라우팅 구성 요소🎜는 구문 분석 후 실행되며 모든 탐색에서도 실행됩니다. 구문 분석이 완료되면 탐색이 결정되고 점프할 준비가 됩니다.
-
- 경로가 구성 요소에 진입하기 전에
-
beforeRouteEnter()
내의 경로 가드가 호출됩니다. code>beforeEach code> 및
beforeEnter
뒤. 🎜 아직 컴포넌트를 입력하지 않았으며, 컴포넌트 인스턴스가 아직 생성되지 않았습니다. 따라서 구성 요소 인스턴스를 얻을 수 없습니다. 이는 정의되지 않았으며beforeCreate
수명 주기 전에 트리거됩니다. -
-
beforeRouteUpdate()
이는 이미 사용 가능하므로 🎜 콜백을 next 🎜로 전달할 필요가 없습니다. 동적 매개변수가 있는 /foo/:id 경로의 경우 /foo/1과 /foo/2 사이를 이동할 때 통합된 Foo 구성 요소가 렌더링되므로 이 구성 요소 인스턴스가 이 경우에 다시 호출될 수 있습니다. -
beforeRouteLeave()
는 구성 요소를 떠날 때 호출되며 이미 사용 가능하므로 🎜 콜백을 다음 🎜으로 전달할 필요가 없습니다. - 독점 경로 가드
-
beforeEnter()
🎜라우팅 구성에서 beforeEnter 가드를 정의해야 합니다. 경로 🎜에 들어갈 때만 트리거되고 beforeEach 직후에 실행되며 매개변수, 쿼리 또는 해시가 변경되면 트리거되지 않습니다.
🎜구성 요소에 들어가기 전 호출 순서 -
-
include
,exclude
처음 두 개 이 속성은keep-alive
가 조건부로 캐시하도록 허용합니다. -
max
는 이 숫자가 초과될 경우 캐시된 구성 요소의 최대 수를 정의할 수 있습니다. 다음 새 인스턴스가 생성되면 가장 오랫동안 액세스하지 않은 캐시 구성 요소의 인스턴스가 삭제됩니다. - 내부 구성 요소의 vnode 객체에 shouldKeepAlive 속성을 추가하여 구성 요소가 언로드될 때 해당 구성 요소는 실제로 언로드되지 않고 캐시되어야 함을 렌더러에 알립니다.
내부 구성 요소의 vnode 객체에 KeepAlive 속성을 추가합니다. . 구성 요소가 캐시된 경우 렌더러가 다시 마운트되지 않고 직접 활성화될 수 있음을 나타내는 표시를 추가합니다.
-
cache
前者用来存缓存组件的虚拟dom集合 keys
-
keys
후자는 캐시 구성 요소의 키 컬렉션을 저장하는 데 사용됩니다. 구성 요소 ID와 태그를 기반으로 캐시 키를 생성합니다. 캐시 개체에 구성 요소 인스턴스가 캐시되었는지 확인합니다. 존재하는 경우 캐시된 값을 직접 검색하고 키에서 키 위치를 업데이트합니다(키 위치 업데이트는 LRU 교체 전략 구현의 핵심입니다). - 존재하지 않는 경우 맵 객체에 컴포넌트 인스턴스를 저장하고 키 값을 저장한 다음 캐시된 인스턴스 수가 최대 설정 값을 초과하는지 확인하세요. LRU 교체 정책에 따라 사용되지 않은 인스턴스(즉, 아래 첨자가 0인 키)입니다.
- | 설명 | 점프 경로 지정 방법 | 매개 변수가 전달되지 않은 경우 | 전달할 수 있습니다. 요구사항이 없는 매개변수는 값입니다 | 🎜
---|---|---|---|---|
위 내용은 [편집 및 공유] vue-router 관련 인터뷰 질문 일부 (답변 분석 포함)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

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

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

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

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

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

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

뜨거운 주제











HTML 템플릿의 버튼을 메소드에 바인딩하여 VUE 버튼에 함수를 추가 할 수 있습니다. 메소드를 정의하고 VUE 인스턴스에서 기능 로직을 작성하십시오.

vue.js에서 bootstrap 사용은 5 단계로 나뉩니다 : Bootstrap 설치. main.js.의 부트 스트랩 가져 오기 부트 스트랩 구성 요소를 템플릿에서 직접 사용하십시오. 선택 사항 : 사용자 정의 스타일. 선택 사항 : 플러그인을 사용하십시오.

vue.js에서 JS 파일을 참조하는 세 가지 방법이 있습니다. & lt; script & gt; 꼬리표;; mounted () 라이프 사이클 후크를 사용한 동적 가져 오기; Vuex State Management Library를 통해 수입.

vue.js의 시계 옵션을 사용하면 개발자가 특정 데이터의 변경 사항을들을 수 있습니다. 데이터가 변경되면 콜백 기능을 트리거하여 업데이트보기 또는 기타 작업을 수행합니다. 구성 옵션에는 즉시 콜백을 실행할지 여부와 DEEP를 지정하는 즉시 포함되며, 이는 객체 또는 어레이에 대한 변경 사항을 재귀 적으로 듣는 지 여부를 지정합니다.

VUE 멀티 페이지 개발은 vue.js 프레임 워크를 사용하여 응용 프로그램을 구축하는 방법입니다. 여기서 응용 프로그램은 별도의 페이지로 나뉩니다. 코드 유지 보수 : 응용 프로그램을 여러 페이지로 분할하면 코드를보다 쉽게 관리하고 유지 관리 할 수 있습니다. 모듈 식 : 각 페이지는 쉬운 재사용 및 교체를 위해 별도의 모듈로 사용할 수 있습니다. 간단한 라우팅 : 페이지 간의 탐색은 간단한 라우팅 구성을 통해 관리 할 수 있습니다. SEO 최적화 : 각 페이지에는 자체 URL이있어 SEO가 도움이됩니다.

vue.js는 이전 페이지로 돌아갈 수있는 네 가지 방법이 있습니다. $ router.go (-1) $ router.back () 사용 & lt; router-link to = & quot;/quot; Component Window.history.back () 및 메소드 선택은 장면에 따라 다릅니다.

Vue DevTools를 사용하여 브라우저 콘솔에서 vue 탭을 보면 VUE 버전을 쿼리 할 수 있습니다. npm을 사용하여 "npm list -g vue"명령을 실행하십시오. package.json 파일의 "종속성"객체에서 vue 항목을 찾으십시오. Vue Cli 프로젝트의 경우 "vue -version"명령을 실행하십시오. & lt; script & gt에서 버전 정보를 확인하십시오. vue 파일을 나타내는 html 파일의 태그.

VUE의 기능 차단은 지정된 기간 내에 기능이 호출되는 횟수를 제한하고 성능 문제를 방지하는 데 사용되는 기술입니다. 구현 방법은 다음과 같습니다. lodash 라이브러리 가져 오기 : 'lodash'에서 import {debounce}; Debounce 기능을 사용하여 인터셉트 기능을 만듭니다. const debouncedfunction = debounce (() = & gt; { / logical /}, 500); 인터셉트 함수를 호출하면 제어 기능이 최대 500 밀리 초 안에 한 번 호출됩니다.
