路由导航守卫 和 Vue 实例生成周期钩子函数的执行顺序?

路由导航守卫 都是在 Vue 实例生命周期钩子函数 之前执行的

Vue-Router 有哪几种导航钩子?

1. 全局守卫

  • 全局前置守卫:beforeEach
router.beforeEach((to, from, next) => {
// 必须调用next
})
  • 全局解析守卫:beforeResolve
router.beforeResolve((to, from, next) => {
// 必须调用next
})
  • 全局后置钩子:afterEach
router.afterEach((to, from) => {})
  1. 路由独享守卫
  • beforeEnter
const router = new VueRouter({
routes: [
{
path: '/home',
beforeEnter: (to, from, next) => {
//...
}
}
]
})
  1. 组件内的守卫
  • beforeRouteEnter
  • beforeRouteUpdate
  • beforeRouteLeave
const Foo = {
template: `...`,
beforeRouteEnter(to, from, next) {
// 在渲染该组件的对应路由被 confirm 前调用
// 不!能!获取组件实例 `this`
// 因为当守卫执行前,组件实例还没被创建
},
beforeRouteUpdate(to, from, next) {
// 在当前路由改变,但是该组件被复用时调用
// 举例来说,对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候,
// 由于会渲染同样的 Foo 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用。
// 可以访问组件实例 `this`
},
beforeRouteLeave(to, from, next) {
// 导航离开该组件的对应路由时调用
// 可以访问组件实例 `this`
}
}

beforeRouteEnter 守卫 不能 访问 this,因为守卫在导航确认前被调用,因此即将登场的新组件还没被创建。

不过,你可以通过传一个回调给 next 来访问组件实例。在导航被确认的时候执行回调,并且把组件实例作为回调方法的参数。

beforeRouteEnter (to, from, next) {
next(vm => {
// 通过 `vm` 访问组件实例
})
}

注意:只有 beforeRouteEnter 支持给 next 传递回调

讲一下完整的导航解析流程?

  1. 导航被触发
  2. 在失活的组件里调用 beforeRouteLeave 守卫
  3. 调用全局的 beforeEach 守卫
  4. 在重用的组件里调用 beforeRouteUpdate 守卫
  5. 在路由配置里调用 beforeEnter 守卫
  6. 解析异步路由组件
  7. 在被激活的组件里调用 beforeRouteEnter
  8. 在所有组件内守卫和异步路由被解析之后,调用全局的解析守卫 beforeResolve
  9. 导航被确认
  10. 调用全局后置钩子 afterEach
  11. 触发 DOM 更新
  12. 用创建好的组件实例,传给 beforeRouteEnter 中的 next 回调函数

导航守卫三个参数的含义?

  • to:即将要进入的目标路由对象
  • from:当前导航正要离开的路由对象
  • next:一定要调用该方法来 resolve 这个钩子,不然路由跳转不过去
    • next():进入下一个路由
    • next(false):中断当前的导航
    • next('/') 或 next({path: '/'}):当前导航被中断,进行新的一个导航

route 和 router 有什么区别?

  • this.$route 是当前路由信息对象,包括 path、params、hash、query、fullPath、matched、name 等路由信息参数
  • this.$router 是路由实例对象,包括了路由的跳转方式 push()、go(),钩子函数等
  • this.$routes 是创建路由实例的配置项,用来配置多个 route 路由对象

路由之间跳转有哪些方式?

  1. 声明式导航: 通过内置组件 router-link 跳转
<router-link :to="/home"></router-link>
  1. 编程式导航: 通过调用 router 实例的方法跳转
  • 使用 push 方法跳转
this.$router.push({
path: '/home'
})
  • 使用 repalce 方法跳转
this.$router.replace({
path: '/home'
})

Vue-Router 传参有哪些方式?

  • query 传参和接参

    • 传参
    this.$router.push({
    path: '/home',
    query: { id: 1 }
    })
    • 接参
    this.$router.query.id
  • params 传参和接参

    • 传参
    this.$router.push({
    name: 'Home',
    params: { id: 1 }
    })
    • 接参
    this.$route.params.id

注意: params 传参,push 里面只能是 name: 'xxx',不能是 path: '/xxx',因为 params 只能用 name 来引入路由,如果这里写成了 path,目标页面接收参数会是 undefined

query 和 params 的区别?

  • query 刷新页面参数不会消失,params 传参页面参数会消失,可以考虑本地存储解决
  • query 传参会显示在 url 地址上,params 传参不会显示地址上

如何监听路由参数的变化?

有两种方法可以监听路由参数的变化,但是只能用在包含 <router-view/> 的组件内

  1. watch 监听$route 对象
watch: {
$route(to, from) {
console.log(to, from)
}
}
  1. 调用组件内的守卫 beforeRouteUpdate
beforeRouteUpdate(to, from, next) {
console.log(to, from)
next()
}

谈谈你对 router-link 的了解?

router-link 是 vue-router 的内置组件,在具有路由功能的应用中,作为声明式导航使用

router-link 有 8 个 props,如下:

  • to

    必填,标识目标路由的链接,当被点击后,内部会立刻把 to 的值传到 router.push(),所以这个值可以是一个字符串或者描述目标路由的对象

  • repalce

    默认值 false,若设置的话,当点击时,会调用 router.replace()而不是 router.push()

  • append

    设置 append 属性后,则在当前 (相对) 路径前添加基路径。例如,我们从 /a 导航到一个相对路径 b,如果没有配置 append,则路径为 /b,如果配了,则为 /a/b

  • tag

    <router-link>渲染成 tag 设置的标签,如 tag="li",就会渲染成 <li>跳转</li>

  • active-class

    默认值为 router-link-acitve,设置链接激活时使用的 CSS 类名,默认值可以通过路由的构造选项 linkActiveClass 来全局配置

  • exact-active-class

    默认值为 router-link-exact-active,设置链接被精确匹配的时候应该激活的 class,默认值可以通过路由构造函数选项 linkExactActiveClass 进行全局配置

  • exact

    是否精确匹配,默认为 false

  • event

    声明可以用来触发导航的事件,可以是一个字符串或是一个包含字符串的数组,默认是 click

<router-link to="home">Home</router-link>
<router-link :to="'home'">Home</router-link>
<router-link :to="{ path: 'home' }">Home</router-link>
<router-link :to="{ name: 'user', params: { userId: 123 }}">User</router-link>
<router-link :to="{ path: 'user', query: { userId: 123 }}">User</router-link>

说说 active-class 是哪个组件的属性?

<router-link/>组件的属性,设置连接激活时使用的 css 类名,默认值可以通过路由的构造选项 linkActiveClass 来全局配置

css

.nav .active{
   color: red;
}

router.js

export default new Router({
linkActiveClass: 'active',
routes: []
})

怎么重定向页面?

  • 重定向 path
const router = new Router({
routes: [{ path: '/a', redirect: '/b' }]
})
  • 重定向到命名的路由
const router = new Router({
routes: [{ path: '/a', name: 'Baa' }]
})
  • 可以写成一个方法,动态返回重定向的目标
const router = new Router({
routes: [
{
path: '/a',
redirect: (to) => {
return { path: '/bbb', query: { a: 1 } }
}
}
]
})

vue-router 怎么配置 404 页面?

在 router.js 中,由于路由是从上到下执行的,只要在路由配置中最后面放个*号就可以了

const router = new Router({
routes: [
{
path: '*',
redirect: '/404'
}
]
})

切换路由时,需要保存草稿的功能,怎么实现?

使用<keep-alive>包裹<router-view>

<keep-alive>
  <router-view></router-viewe
</keep-alive>

vue 路由中去掉

在路由 router.js 中配置 mode:'history'

const router = new Router({
mode: 'history'
})

hash 模式和 history 模式相比较

1. hash 模式:

优点:

hash 值会出现在 URL 中,但不会包含在 http 请求中,所以改变 hash 值时不会刷新页面,也不会向服务器发送请求

hash 值的改变会触发 hashchange 事件,通过监听 hasChange 事件来完成操作实现前端路由

兼容性比较好,能兼容 IE8

缺点:

url 路径会出现”#“字符

hash 有体积限制

  1. history 模式:

优点:

history 模式利用 HTML5 History Interface 中新增的 pushState()replaceState()方法,这两个方法应用于浏览器的历史记录栈,提供了对历史记录进行修改的功能,

url 值不会出现“#”字符

缺点:

url 的改变属于 http 请求,借助 history.pushState 实现页面的无刷新跳转,因此会重新请求服务器,所以需要服务器的配置,否则会 404

兼容性差,IE10,特定浏览器支持

Vue-Router 面试题 (2023-09-13更新)的更多相关文章

  1. Vue 前端面试题

    Vue 前端面试题 1. 说一下 Vue 的双向绑定数据的原理 vue 实现数据双向绑定主要是:采用数据劫持结合“发布者 - 订阅者”模式的方式,通过 Object.defineProperty() ...

  2. vue前端面试题知识点整理

    vue前端面试题知识点整理 1. 说一下Vue的双向绑定数据的原理 vue 实现数据双向绑定主要是:采用数据劫持结合发布者-订阅者模式的方式,通过 Object.defineProperty() 来劫 ...

  3. Vue 前端面试题[转]

    https://mp.weixin.qq.com/s/Uxhx2dJ1Xbm6N3Gl7wNZNw Vue 前端面试题 游荡de蝌蚪 前端开发 1周前 作者:游荡de蝌蚪 https://segmen ...

  4. 整理Vue.js 面试题

    Vue.js 面试题整理   Vue项目结构介绍 build 文件夹:用于存放 webpack 相关配置和脚本. config 文件夹:主要存放配置文件,比如配置开发环境的端口号.开启热加载或开启gz ...

  5. vue.js面试题整理

    Vue.js面试题整理 一.什么是MVVM? MVVM是Model-View-ViewModel的缩写.MVVM是一种设计思想.Model 层代表数据模型,也可以在Model中定义数据修改和操作的业务 ...

  6. Vue.js面试题整理(转载)

    一.什么是MVVM? MVVM是Model-View-ViewModel的缩写.MVVM是一种设计思想.Model 层代表数据模型,也可以在Model中定义数据修改和操作的业务逻辑:View 代表UI ...

  7. [ 转载 ] vue.js面试题一

    转载自:https://www.cnblogs.com/aimeeblogs/p/9501490.html 如有侵权 联系删除 Vue.js面试题整理 一.什么是MVVM? MVVM是Model-Vi ...

  8. Vue.js面试题

    一.什么是MVVM? MVVM是Model-View-ViewModel的缩写.MVVM是一种设计思想.Model 层代表数据模型,也可以在Model中定义数据修改和操作的业务逻辑:View 代表UI ...

  9. Vue 2.0 + Vue Router + Vuex

    用 Vue.js 2.x 与相配套的 Vue Router.Vuex 搭建了一个最基本的后台管理系统的骨架. 当然先要安装 node.js(包括了 npm).vue-cli 项目结构如图所示: ass ...

  10. 前端MVC Vue2学习总结(八)——Vue Router路由、Vuex状态管理、Element-UI

    一.Vue Router路由 二.Vuex状态管理 三.Element-UI Element-UI是饿了么前端团队推出的一款基于Vue.js 2.0 的桌面端UI框架,手机端有对应框架是 Mint U ...

随机推荐

  1. 关于建表字段是否该使用not null这个问题你怎么看?

    大家好,我是 V 哥,在数据库设计中,是否使用 NOT NULL 是一个非常重要的决策,直接影响数据完整性.查询性能以及业务逻辑的复杂度.使用 NOT NULL 的关键在于理解业务需求和具体场景. 下 ...

  2. Go 语言中值接收者和指针接收者方法调用的自动转换规则详解

    在 Go 语言中,方法的调用规则对于值接收者和指针接收者有一些特别的行为,这使得代码变得更加简洁和易用.我们来详细解释一下"方法值调用规则"和"方法表达式调用规则&quo ...

  3. Makefile优化编译速度

    并行编译:使用 make -j 命令来进行并行编译,可以加快编译速度.-j 后面可以跟一个数字,表示并行编译的线程数. 懒惰计算:使用 .PHONY 规则来避免无谓的重新编译.该规则告诉 make,这 ...

  4. Java日期时间API系列16-----Jdk8中java.time包中的新的日期时间API类,java日期计算3,日期中年月日时分秒的属性值修改等

    通过Java日期时间API系列8-----Jdk8中java.time包中的新的日期时间API类的LocalDate源码分析 ,可以看出java8设计非常好,实现接口Temporal, Tempora ...

  5. 推荐一款支持Vue3的管理系统模版:Vue-Vben-Admin

    近年来,随着前端技术的飞速发展,各类后台管理系统框架层出不穷.Vue 作为热门的前端框架,也有许多优秀的后台模板涌现.而 Vue-Vben-Admin,凭借其高效.灵活的架构设计和完善的功能体系,成为 ...

  6. Kubernetes CNI 插件选型和应用场景探讨

    作者:马伟,青云科技容器顾问,云原生爱好者,目前专注于云原生技术,云原生领域技术栈涉及 Kubernetes.KubeSphere.KubeKey 等. 本文介绍容器环境常见网络应用场景及对应场景的 ...

  7. "开源"是什么?为啥这么火?一定免费吗?

    ​ 在科技快速发展的今天,"开源"一词频频出现在我们的视野中.究竟什么是开源?为何它能在技术圈引发如此热潮? 开源软件到底有什么魅力?它是如何改变软件开发和使用的方式的?开源软件是 ...

  8. go: 在proto中使用oneof类型

    在proto中,可以使用OneOf类型,使用一个字段存储不同类型的数据.类似go中的interface. 假设有proto如下,Val是一个OneOf数据类型,它可以为double/int/str.. ...

  9. Readme 《Machine Learning by Andrew NG》

    本文系列内容是吴恩达老师的机器学习公开课的文本对应.需要具备英文,微积分,线性代数,程序设计的基础.从第二周开始有编程作业,到第九周.总共8个作业.感谢吴恩达老师⸜₍๑•⌔•๑ ₎⸝ 2021年9月1 ...

  10. 借用Ultralytics Yolo快速训练一个物体检测器

    借用Ultralytics Yolo快速训练一个物体检测器 同步发表于 https://www.codebonobo.tech/post/14 大约在16/17年, 深度学习刚刚流行时, Object ...