【vue】vue-Router 常见面试题_vue-router面试题-程序员宅基地

技术标签: vue  前端  

【vue】vue-Router 常见面试题

写在前面

这里是小飞侠Pan,立志成为一名优秀的前端程序媛!!!

本篇博客收录于我的github前端笔记仓库中,持续更新中,欢迎star~

https://github.com/mengqiuleo/myNote


一、vue-Router基本使用

前端路由是什么?

前端路由是在保证只有一个HTML页面的情况下,通过对每个视图展示形式匹配一个特殊的url来实现所谓的切换效果。不会重新向服务端发送请求,也不会跳转页面。无论是刷新、前进、还是后退,都可以通过特殊url实现。

1.点击这里vue-router使用

2.导航守卫的使用:导航守卫


二、常见面试题


1.vue-router 路由钩子函数是什么 执行顺序是什么

钩子函数种类有:全局守卫、路由守卫、组件守卫

  • 全局前置/钩子:beforeEach、beforeResolve、afterEach
  • 路由独享的守卫:beforeEnter
  • 组件内的守卫:beforeRouteEnter、beforeRouteUpdate、beforeRouteLeave

完整的导航解析流程:

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

2. vue-router 动态路由是什么 有什么问题

例如,我们有一个 User 组件,对于所有 ID 各不相同的用户,都要使用这个组件来渲染。那么,我们可以在 vue-router 的路由路径中使用“动态路径参数”(dynamic segment) 来达到这个效果:

const User = {
  template: "<div>User</div>",
};

const router = new VueRouter({
  routes: [
    // 动态路径参数 以冒号开头
    { 
    	path: "/user/:id", 
    	component: User 
    },
  ],
});


(1) params 方式
  • 配置路由格式:/router/:id
  • 传递的方式:在path后面跟上对应的值
  • 传递后形成的路径:/router/123

1)路由定义

//在APP.vue中
<router-link :to="'/user/'+userId" replace>用户</router-link>    

//在index.js
{
    
   path: '/user/:userid',
   component: User,
},
复制代码

2)路由跳转

// 方法1:
<router-link :to="{ name: 'users', params: { uname: wade }}"> 按钮 </router-link>

// 方法2:
this.$router.push({
    name:'users',params:{
    uname:wade}})

// 方法3:
this.$router.push('/user/' + wade)
复制代码

3)参数获取 通过 this.$route.params.userid 获取传递的值


(2) query 方式
  • 配置路由格式:/router,也就是普通配置
  • 传递的方式:对象中使用query的key作为传递方式
  • 传递后形成的路径:/route?id=123

1)路由定义

//方式1:直接在router-link 标签上以对象的形式
<router-link :to="{path:'/profile',query:{name:'why',age:28,height:188}}">档案</router-link>

// 方式2:写成按钮以点击事件形式
<button @click='profileClick'>我的</button>    

profileClick(){
    
  this.$router.push({
    
    path: "/profile",
    query: {
    
        name: "kobi",
        age: "28",
        height: 198
    }
  });
}
复制代码

2)跳转方法

// 方法1:
<router-link :to="{ name: 'users', query: { uname: james }}">按钮</router-link>

// 方法2:
this.$router.push({
     name: 'users', query:{
     uname:james }})

// 方法3:
<router-link :to="{ path: '/user', query: { uname:james }}">按钮</router-link>

// 方法4:
this.$router.push({
     path: '/user', query:{
     uname:james }})

// 方法5:
this.$router.push('/user?uname=' + jsmes)
复制代码

3)获取参数

通过this.$route.query 获取传递的值

(3) params 和 query 的区别
  • 对于 query:

name 和 path 都可以用,

<router-link :to="{ name: 'W', query: { id:'1234',age:'12' }}"/>
<router-link :to="{ path: '/W', query: { id:'1234',age:'12' }}"/>
  • 对于 params:

只能用 name,

<router-link :to="{ name: 'W', params: { id:'1234',age:'12' }}"/>

总结

用法:query要用path来引入,params要用name来引入,接收参数都是类似的,分别是 this.$route.query.namethis.$route.params.name

url地址显示:query更加类似于ajax中get传参,params则类似于post,说的再简单一点,前者在浏览器地址栏中显示参数,后者则不显示

注意:query刷新不会丢失query里面的数据 params刷新会丢失 params里面的数据。


3.$route 和 $router 的区别

  • $router为VueRouter实例,想要导航到不同URL,则使用$router.push方法
  • $route为当前router跳转对象,里面可以获取name、path、query、params等

4.Vue-Router 的懒加载如何实现

路由懒加载的含义:

把不同路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应组件

const List = () => import('@/components/list.vue')

const router = new VueRouter({
  routes: [
    { path: '/list', component: List }
  ]
})

5.vue-router 中常用的路由模式

hash 模式
  1. location.hash 的值实际就是 URL 中#后面的东西 它的特点在于:hash 虽然出现 URL 中,但不会被包含在 HTTP 请求中,对后端完全没有影响,因此改变 hash 不会重新加载页面。

  2. 可以为 hash 的改变添加监听事件

window.addEventListener("hashchange", funcRef, false);

每一次改变 hash(window.location.hash),都会在浏览器的访问历史中增加一个记录利用 hash 的以上特点,就可以来实现前端路由“更新视图但不重新请求页面”的功能了

特点:兼容性好但是不美观


history 模式

利用了 HTML5 History Interface 中新增的 pushState() 和 replaceState() 方法。

这两个方法应用于浏览器的历史记录站,在当前已有的 back、forward、go 的基础之上,它们提供了对历史记录进行修改的功能。这两个方法有个共同的特点:当调用他们修改浏览器历史记录栈后,虽然当前 URL 改变了,但浏览器不会刷新页面,这就为单页应用前端路由“更新视图但不重新请求页面”提供了基础。

特点:虽然美观,但是刷新会出现 404 需要后端进行配置(一般是将页面配置重定向到首页路由)

总结

hash模式是开发中默认的模式,如果想要切换到history模式,就要进行以下配置(后端也要进行配置):

const router = new VueRouter({
  mode: 'history',
  routes: [...]
})

6.编程式路由导航 与 声明式路由导航


编程式路由导航 --> 即写 js 的方式

相关 API:

1) this.$router.push(path):

相当于点击路由链接(可以返回到当前路由界面) --> 队列的方式(先进先出)

2)this.$router.replace(path):

用新路由替换当前路由(不可以返回到当前路由界面) --> 栈的方式(先进后出)

3)this.$router.back():

请求(返回)上一个记录路由

4)this.$router.go(-1):

请求(返回)上一个记录路由

5) this.$router.go(1):

请求下一个记录路由


声明式路由导航 --> 即 <router-link>
<router-link to='xxx' tag='li'>  To PageB  </router-link>

注意:<router-link> 会默认解析成 a 标签,可以通过 tag 属性指定它解析成什么标签


7.单页面应用的优缺点(SPA)

单页面应用程序将所有的活动局限于一个Web页面中,在该Web页面初始化时加载相应的HTML、JavaScript 和 CSS。一旦页面加载完成,单页面应用不会因为用户的操作而进行页面的重新加载或跳转。取而代之的是利用 JavaScript 动态的变换HTML的内容,从而实现UI与用户的交互。由于避免了页面的重新加载,单页面应用可以提供较为流畅的用户体验。
所谓的页面跳转,多个页面之间的切换是利用JS动态的变换HTML的内容,加载的时候不是加载整个页面,而是某个指定的容器中的内容。

一个:你有一个水杯,一会儿装的是可乐,一会儿装的是牛奶。


单页面应用的优点
  • 良好的交互体验

单页应用的内容的改变不需要重新加载整个页面,获取数据也是通过Ajax异步获取,没有页面之间的切换,就不会出现“白屏现象”,也不会出现假死并有“闪烁”现象,页面显示流畅

  • 良好的前后端工作分离模式

后端不再负责模板渲染、输出页面工作,后端API通用化,即同一套后端程序代码,不用修改就可以用于Web界面、手机、平板等多种客户端

  • 减轻服务器压力

单页应用相对服务器压力小,服务器只用出数据就可以,不用管展示逻辑和页面合成,吞吐能力会提高几倍


缺点
  • 不会记住用户的操作记录

  • 首屏加载慢

前端路由的重要的作用

1、可以在改变url的时候不会向服务器发送请求。
2、可以监听到url的改变。


解决方案:

  • 1.vue-router懒加载

    Vue-router懒加载就是按需加载组件,只有当路由被访问时才会加载对应的组件,而不是在加载首页的时候就加载,项目越大,对首屏加载的速度提升得越明显

  • 2.使用CDN加速

    在做项目时,我们会用到很多库,采用cdn加载可以加快加载速度。

  • 3.异步加载组件

  • 4.服务端渲染

    服务端渲染还能对seo优化起到作用,有利于搜索引擎抓取更多有用的信息(如果页面纯前端渲染,搜索引擎抓取到的就只是空页面)

  • 不利于SEO

seo 本质是一个服务器向另一个服务器发起请求,解析请求内容。但一般来说搜索引擎是不会去执行请求到的js的。也就是说,搜索引擎的基础爬虫的原理就是抓取url,然后获取html源代码并解析。 如果一个单页应用,html在服务器端还没有渲染部分数据数据,在浏览器才渲染出数据,即搜索引擎请求到的html是模型页面而不是最终数据的渲染页面。 这样就很不利于内容被搜索引擎搜索到

解决方案:

  • 1.服务端渲染

    服务器合成完整的 html 文件再输出到浏览器

  • 2.页面预渲染

  • 3.路由采用h5 history模式

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_52834435/article/details/124523404

智能推荐

解决butterknife 依赖库使用的Attribute value must be constant问题_第三方库butterknife attribute value must be constant-程序员宅基地

文章浏览阅读9.5k次,点赞3次,收藏6次。在我们使用android studio 通常会把常用的代码,新建成module在library中引入butterknife的依赖: compile ‘com.jakewharton:butterknife:8.4.0’ 但是在module 使用的时候会出现以下问题: 造成这个的原因就是在library里R.id.xxx不再是final类型了,也就不是常量了变成可变的,而注入是需要传入常_第三方库butterknife attribute value must be constant

学习资料要去哪里打印,网上打印靠谱吗?_去哪里打印学习资料-程序员宅基地

文章浏览阅读218次。很多人喜欢将对自己有用的学习资料整理下来,资料整理好以后打印出来可以更好的查看,倘若仅有一两张资料需要打印的话,大家可以随便找一家打印店即可,价格方面即便是稍微贵一点也不会差别特别大。但倘若学习资料如果份数比较多,比如有上百张、上千张资料需要打印,这时候大家就需要找一些打印价格相对比较便宜,比较正规的打印平台进行打印,小编推荐大家打印学习资料可到专业的网上在线打印平台易桌面打印室提交文件资料进行打印。易桌面打印室是一个比较专业的网上在线打印平台,该平台可快速为大家打印各种类型的资料、试卷、书本等,在打印资_去哪里打印学习资料

微信小程序 淘宝_淘宝微信小程序-程序员宅基地

文章浏览阅读4.8k次,点赞2次,收藏33次。模仿淘宝写了一个小程序,主要目的还是练手并且以页面效果为主,写法肯定也会有更好的,后续继续加强。登录页面的话,就直接点登录进入到首页了,没有做过多的交互。其中做比较多的交互是购物车,应数据的形式做出的交互,实际的项目中可能会有更好的数据形式,产品数增减全选合计等,事件传参比较多;下面以购物车为例,贴上购物车的部分js 代码,里面有个“监听”是否勾选和计数的函数(watchSelec..._淘宝微信小程序

并发计算模型BSP与SEDA_bulk synchronous parallel-程序员宅基地

文章浏览阅读3.6k次。1 BSP批量同步并行计算BSP(Bulk Synchronous Parallel)批量同步并行计算用来解决并发编程难的问题。名字听起来有点矛盾,又是同步又是并行的。因为计算被分组成一个个超步(super-step),超步内并行计算并且结点间不能通信。在超步之间设置同步栅栏(barrier synchronization),计算完成后相互通信,全部完成后才能继续下一个超步。2 SEDA阶段_bulk synchronous parallel

企业微信的后台怎么进入和管理?_企业微信后台-程序员宅基地

文章浏览阅读1w次。企业微信的后台怎么进入和管理? _企业微信后台

【机器学习】QQ-plot深入理解与实现_python qqplot subplot-程序员宅基地

文章浏览阅读1.2w次。QQ-plot深入理解与实现26JUNJune 26, 2013最近在看关于CSI(Channel State Information)相关的论文,发现论文中用到了QQ-plot。Sigh!我承认我是第一次见到这个名词,异常陌生。维基百科给出了如下定义:“在统计学中,QQ-plot(Q代表分位数Quantile)是一种通过画出分位数来比较两个概率分布的图形方法。首先选定_python qqplot subplot

随便推点

SDL2 显示视频并在视频上显示文字_sdl2显示视频-程序员宅基地

文章浏览阅读905次。SDL2可以直接显示视频,也可以在mfc控件上显示,光显示图像比较简单,但是SDL本身不带字库,因此不能直接显示文字,需要调用第三方库完成。 SDL2可以直接从官方下载,但显示文字需要用扩展库SDL_ttf实现,ttf是True Type Font的缩写,ttf是Windows下的缺省字体,它有美观,放大缩小不变形的优点,因此广泛应用很多场合。使用ttf库的第一件事要从Windows的字库下拷贝出一个字库出来,最好是中文字体,这样可以同时支持英文和中文显示。它一般在c:\w..._sdl2显示视频

Codeforces 637B Chat Order 【模拟】_codeforce637b-程序员宅基地

文章浏览阅读493次。题目链接:Codeforces 637B Chat Order_codeforce637b

解决Form或UserControl接收不到KeyDown等事件_winform 默认接收不了keydown事件,需要点一下才行-程序员宅基地

文章浏览阅读2.6k次。解决Form或UserControl接收不到KeyDown等事件2011-02-01 来自:博客园 字体大小:【大 中 小】摘要:当Form包含自定义控件,或UserControl存在嵌套时,外层的对象就会接收不到KeyDown等事件了,但是,我们可以通过override基类的ProcessDialogKey方法来达到同样的效果  当Form包含自定义控件,或U_winform 默认接收不了keydown事件,需要点一下才行

C#发送电子邮件 (异步)_c# sendemailasync用法-程序员宅基地

文章浏览阅读4.1k次。///验证电子邮件的正则表达式string emailStr = @"^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$";/// /// 异步发送电子邮件 /// /// 发送方电子邮件_c# sendemailasync用法

中断中处理延时及一些函数的调用规则(中断调i2c驱动有感)_模拟iic的延时对定时器中断的影响-程序员宅基地

文章浏览阅读4.5k次。转自:http://blog.csdn.net/xiyu_1986/article/details/69969271,中断处理程序中不能使用有睡眠功能的函数,如ioremap,kmalloc,msleep等,理由是中断程序并不是进程,没有进程的概念,因此就没有休眠的概念;2,中断处理程序中的延时可以用忙等待函数来代替,如ndelay,udelay,mdelay等,这些函数在实现上本质是根据_模拟iic的延时对定时器中断的影响

iphone12文件管理连接服务器,iPhone手机打开服务器功能,和Windows电脑互传文件方法...-程序员宅基地

文章浏览阅读5.2k次。iPhone手机打开服务器功能,和Windows电脑互传文件方法PC端设置:一、在计算机端新建一个文件夹,例如取名为:“iphone共享文件”。二、然后右键点击文件夹属,点击“共享”。三、打开共享后,再左键点击“共享”,下拉箭头选择“Everyone”然后继续选择“共享”,显示出共享文件夹的网络地址和共享文件夹的名字。PC端设置完成。Iphone手机端设置:一、选择iphone手机“文件”,点击右..._iphone 手机的连接服务器 怎么连接电脑