路由导航守卫 和 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. Git常用命令,分支合并与管理

    Git 自我感觉最大的优点是对版本库和分支的管理 各自的电脑都对项目保存一份版本,分支合并也极其方便. 而且Git的目录操作命令跟Linux一样,使用起来还是非常顺手的. Git详解 Git 常用命令 ...

  2. go 使用websocket

    package chat import ( "encoding/json" "github.com/gorilla/websocket" "githu ...

  3. USB LFPS是什么?

    USB LFPS:低功耗状态下的高速数据传输 什么是USB LFPS? USB LFPS(Low-Power Signaling)指的是USB接口在低功耗状态下的一种高速数据传输技术.传统上,USB接 ...

  4. Java日期时间API系列31-----Jdk8中java.time包中的新的日期时间API类,时间戳的获取方式对比、转换和使用。

    时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到.Java中本来已经有相关获取时间戳的方法,Java8后增加新的类In ...

  5. 2022年7月中国数据库排行榜:墨天轮榜单榜眼易主,PolarDB得分涨幅最大

    信创元年,后起之秀,大有可为.2022年7月的 墨天轮中国数据库流行度排行榜 风起云涌,本月排行榜共有232个数据库参与排名,相比上月,新增 ShuangzhaoDB 数据库.榜单前十名的唯一变化是达 ...

  6. FirewallD is not running 原因与解决方法

    解决方法关于linux系统防火墙: centos5.centos6.redhat6系统自带的是iptables防火墙.centos7.redhat7自带firewall防火墙.ubuntu系统使用的是 ...

  7. 25. http 常见状态码

    状态码的分类: 2xx:表明请求被成功接收并处理 : 3xx:表示要完成请求,需要进一步操作. 通常,这些状态代码用来重定向 :重定向就是 从 a 地址跳转到 b 地址 : 4xx:客户端错误,请求错 ...

  8. 一个查询IP地理信息和CDN提供商的离线终端工具

    一个查询IP地理信息和CDN提供商的离线终端工具 Nali 功能 支持多种数据库 纯真 IPv4 离线数据库 ZX IPv6 离线数据库 Geoip2 城市数据库 (可选) IPIP 数据库 (可选) ...

  9. AI五子棋_06 坐标表示到图形表示的算法 Python实现

    AI五子棋 第六步 恭喜你到达第六步! 你已经成功实现了公钥体系最为关键的部分.现在服务器相信你就是你了,下面开始你的战斗. 五子棋的棋盘有15×15个交点,一共有225个交点,我们可以在每一个交点上 ...

  10. mysql重置id排列重新排序

    1.删除表中的原有的主键字段 ALTER TABLE table2 DROP id 2.表中重新创建一个字段 ALTER TABLE table2 ADD id int NOT NULL FIRST; ...