vue-router学习
相关面试题
- 路由传递参数(对象写法)path是否可以结合params参数一起使用?
不可以,这样写,程序会崩掉。
路由跳转传惨的时候,对象的写法可以是name、path形式。(path不能与params参数同时使用)
- 如何指定params参数可传不可传?
如果路由要求传递params参数,但你没传,URL会有问题,
如何指定params参数可不可传,在配置路由的时候,在占位的后面加上一个问号?
【params可以传递阔不可传递】
{ path: "/home/:useName?", name: "home" }
。
- params参数可以传递也可以不传递,但是如果传递是空串,如何解决?
使用undefined解决:params参数可以传递、不传递(空字符串)
this.$router.push({ name: 'home', params: { keyword: '' || undefined }, query: { k: this.usename } })
。
如果指定name与params配置,但params中数据是一个"",无法跳转,路径会出问题。
- 路由组件能不能传递props数据?
可以:三种写法,如下。
相关错误和解决办法
- 编程式路由跳转到当前路由(参数不变),多次执行会抛出
NavigationDuplicated
的警告错误?
路由跳转有两种形式:声明式导航、编程式导航,
声明式导航没有这类问题的,因为vue-router底层已经处理好了,
1.1 为什么编程式导航进行路由跳转的时候,就是这种警告错误呢?
“vue-router”: “^3.5.3”:最新的vue-router引入promise
1.2 通过给push方法传递相应的成功、失败的回调函数,可以捕获到当前错误,可以解决。
1.3 通过底部代码,可以实现解决错误
this.$router.push({ name: "home", params: { useName: this.name}, () => {}, () => {} })
。
1.4 this:当前组件实例
this.$router
属性:当前的这个属性,属性值VueRouter类的一个实例,当在入口文件注册路由的时候,给组件实例添加$router | $route
属性
push:VueRouter类的一个实例
// router/index.js
import VueRouter from 'vue-router'
import Vue from 'vue'
Vue.use(VueRouter)
let originPush = VueRouter.prototype.push
let originReplace = VueRouter.prototype.replace
// 重写 push | replace
// 第一个参数:告诉原来push方法,你往哪里跳转(跳转哪些参数)
// 第二个参数:成功回调
// 第三个参数:失败回调
VueRouter.prototype.push = function(location, resolve, reject) {if(resolve && reject) {// call || apply 区别// 相同点:都可以调用函数一次,都可以篡改函数的上下文一次// 不同点:call与apply传递参数:call:参数用逗号隔开,apply:传递数组originPush.call(this, location, resolve, reject)} else {originPush.call(this, location, () => {}, () => {})}
}
VueRouter.prototype.replace = function(location, resolve, reject) {if(resolve && reject) {// call || apply 区别// 相同点:都可以调用函数一次,都可以篡改函数的上下文一次// 不同点:call与apply传递参数:call:参数用逗号隔开,apply:传递数组originReplace.call(this, location, resolve, reject)} else {originReplace.call(this, location, () => {}, () => {})}
}
概念
1、vue-router的理解
vue的一个插件库,专门用来实现SPA应用。
2、对SPA(单页面)应用的理解
1)单页web应用(single page web application, SPA)。
2)整个应用只有一个完整的页面。
3)点击页面中的导航链接不会刷新页面,只会做页面的局部更新。
4)数据需要通过ajax请求获取。
3、什么是路由
1、路由(route)就是一组key-value的对应关系。key为路径,value可能是function或component。
2、多个路由,需要经过路由器(router)的管理。
4、路由分类
1)后端路由:(后端接口路径)
理解:value是function,用于处理客户端提及哦啊的请求。
工作过程:服务器接收到一个请求时,根据请求路径找到匹配到函数来处理请求,返回响应数据。
2)前段路由:(浏览器路径)
理解:value是component,用于展示页面内容。
工作过程:当浏览器的路径改变时,对应的组件就是显示。
5、路由跳转方式
声明式导航:
router-link
(务必要有to属性),可以实现路由跳转。
编程式导航:利用的是组件实例的$router.push | replace
方法,可以实现路由的跳转。
基本使用
1、安装vue-router,命令:npm i vue-router
2、应用插件:Vue.use(VueRouter)
3、编写router配置项:
// 引入VueRouter
import VueRouter from 'vue-router'
// 引入组件
import Home from './Home'
//创建router实例对象,去管理一组一组的路由规则
const router = new VueRouter({routes: [{path: '/home',name: 'Home',component: Home},{path: '/vuex',name: 'vuex',component: () => import(/* webpackChunkName: "base" */ '../views/vuex/Home')},]
})
// 暴露router
export default router
4、实现切换(active-class可配置高亮样式)
<router-link active-class="active" to="/home">Home</router-link>
5、指定展示位置
<router-view />
几个注意事项
1、路由组件通常存放在
pages
文件夹,一般组件通常存放在components
文件夹。
2、通过切换,“隐藏”了的路由组件,默认是被销毁掉的,需要的时候再去挂载。
3、每个组件都有自己的$route
属性,里面存储着自己的路由信息。
4、整个应用只有一个router,可以通过组件的$router
属性获取到。
路由的query参数 (传的参数在地址栏中显示)
1、传递参数
<!-- 跳转并携带query参数,to的字符串写法 -->
<router-link :to="/home/message/detail?id=666&title=你好">跳转</router-link><!-- 跳转并携带query参数,to的对象写法 -->
<router-link:to="{path: '/home/message/detail',query: {id: 666,title: '你好'}}"
>跳转</router-link>
2、接收参数
$route.query.id
$router.query.title
路由params参数(传的参数不在地址栏中显示)
1、配置路由,生命接收params参数
{path: '/home',component: Home,children: [{path: 'datail/:id/:title', // 使用占位符生命接收params参数name: 'detail',component: Detail}]
}
2、传递参数
<!-- 跳转并携带params参数,to的字符串写法 -->
<router-link :to="/home/detail/666/你好">跳转</router-link><!-- 跳转并携带query参数,to的对象写法 -->
<router-link:to="{name: 'detail',params: {id: 666,title: '你好'}}">跳转</router-link>
特别注意:路由携带params参数时,若使用to的对象写法,则不能使用path配置项,必须使用name。
3、接收参数
$route.params.id
$route.params.name
路由的props配置
path: '/ref',name: 'ref',title: 'ref父子组件传值',component: () => import(/* webpackChunkName: "base" */ '../views/Ref/fu'),children: [{path: 'refzi',// path: 'refzi/:id/:title',name: 'refzi',title: 'ref父子组件传值',// props的第一种写法,值为对象,该对象中的所有key-value都会以props的形式传递给‘ref’组件// 传递的死数据// props: { a: 1, b: 'hello' },// props的第二种写法,值为布尔值。若布尔值为真,就会把该路由组件收到的所有params参数,以props的形式传给‘ref‘组件// props: true,// props的第三种写法,值为函数。使用query// props($route) {props({ query }) { // { query }:结构赋值// console.log($route)return { id: query.id, title: query.title }},component: () => import(/* webpackChunkName: "base" */ '../views/Ref/ref')}]}
<router-link>
的replace属性
1、作用:控制路由跳转时操作游览器历史记录的模式。
2、浏览器的历史记录有两种写入方式:分别是push
和replace
,push
是追加历史记录,replace
是替换当前记录。路由跳转时候默认为push
。
3、如何开启replace
模式:<router-link replace></router-link>
。
编辑路由组件
this.$router.push({path: '/ref/refzi',query: {id: 666,title: '你好啊'}})this.$router.replace({name: 'refzi',params: {id: 666,title: '你好啊'}})
this.$router.back() // 后退
this.$router.forward() // 前进
this.$router.go(n) // 前进或后退n个历史记录(负数:后退,正数:前进)
缓存路由组件
1、作用:让不展示的路由组件保存挂载状态,不被销毁。
2、具体代码:
<!-- includce:要作用于哪个组件,name:组件中定义的name的值 -->
<!-- 缓存一个:include="name" ;缓存多个::include="['name1', 'name2']" -->
<keep-alive include="name"><router-view />
</keep-alive>
两个新的生命周期钩子
1、作用:路由组件所独有的两个钩子,用于捕获路由组件的激活状态。
2、具体名字:
1)
activated
路由组件被激活时触发。
2)deactivated
路由组件失活时触发。
路由守卫
1、作用:对路由进行权限控制
2、分类:全局守卫、独享守卫、组件内守卫
3、全局守卫:
// 全局前置守卫:初始化时执行、每次路由切换前执行
router.beforeEach((to, from, next) => {console.log('beforeEach', to, from)if(to.meta.isAuth) { // 判断当前路由是否需要进行权限控制if(localStorage.getItem('homem') === 'yes') { // 权限控制的具体规则next() // 放行} else {alter('暂无权限查看')}} else {next() // 放行}
})// 全局后置守卫:初始化时执行、每次路由切换之后执行
router.afterEach((to, from) => {console.log('afterEach', to, from)if(to.meta.title) {document.title = to.meta.title // 修改网页的title} else {document.title = 'vue_test'}
})
4、独享守卫:
// 全局前置守卫:初始化时执行、每次路由切换前执行
beforeEnter((to, from, next) => {console.log('beforeEnter', to, from)if(to.meta.isAuth) { // 判断当前路由是否需要进行权限控制if(localStorage.getItem('homem') === 'yes') { // 权限控制的具体规则next() // 放行} else {alter('暂无权限查看')}} else {next() // 放行}
})
5、组件内守卫:
// 进入守卫:通过路由规则,进入该组件时被调用
beforeRouteEnter((to, from, next) => {})
// 离开守卫:通过路由规则,离开该组件时被调用
beforeRouteLeave((to, from, next) => {})
路由器的两种工作模式
1、对于一个url来说,什么是hash值?—— #及其后面的内容就是hash值。
2、hash值不会包含在HTTP请求中,即:hash值不会带给服务器。
3、hash模式:
1)地址中永远带着#号,不美观。
2)若以后将地址通过第三方手机app分享,若app检验严格,则地址会被标记为不合法。
3)兼容性好。
4、histoty模式:
1)地址干净,美观。
2)兼容性和hash模式相比略差。
3)应用部署上线时需要后端人员支持,解决刷新页面服务端404的问题。
vue-router学习相关推荐
- (50)Vue Router插件介绍
一.Vue Router插件介绍 Vue Router 是 Vue.js 的官方插件,用来快速实现单页应用. 二.Vue Router学习内容 • 单页应用 • 前端路由 • Vue Router 三 ...
- Vue学习笔记(六)--- 前端路由 Vue Router
一.路由 1.概念 路由本质上来说就是一种对应关系,比如说我们在浏览器中输入不同的 url 地址,我们就能访问不同的资源,那么这 url 地址与资源之间的对应关系,就是路由. 2.分类 ① 后端路 ...
- Vue之router学习
router学习 js小问题 起步 定义 动态路由匹配 通配符 AND 404 高级匹配 匹配优先级 嵌套路由 编程式的导航 push和replace 注意 router.go(n) 操作Histor ...
- Vue 学习(十、 Vue Router - 路由插件 和 Vue 的插件原理)
文章目录 一.Vue Router - 路由插件 1. 安装 Vue Router 2. Vue Router 路由的基本使用 3. 设置 router-link 4. 编程式路由 5. 路由嵌套 6 ...
- Vue.js 3.0 学习笔记(十一)Vue Router路由
一.使用Vue Router 1.HTML页面使用路由 <!DOCTYPE html> <html> <head><meta charset="UT ...
- vue.js基础学习(Vue Router安装与使用)
基础入门:vue.js Vue Router安装与使用 1.Vue Router安装 在cmd窗口运行命令:npm install vue-router@4,安装Vue Router: 2. Vue ...
- Vue 新手学习笔记:vue-element-admin 之安装,配置及入门开发
所属专栏: Vue 开发学习进步 说实话都是逼出来的,对于前端没干过ES6都不会的人,vue视频也就看了基础的一些 但没办法,接下来做微服务架构,前端就用 vue,这块你负责....说多了都是泪,脚手 ...
- Vue Router 4.0 正式发布!焕然一新。
关注若川视野,回复"pdf" 领取资料,回复"加群",可加群长期交流学习 12月8日,Vue Router 4 正式发布稳定版本. 在经历了 14 个 Alph ...
- 老张 .NetCore与Vue 框架学习
缘起 作为一个.Net攻城狮已经4年有余了,一直不温不火,正好近来项目不是很忙,闲得无聊,搞一搞新技术,一方面是打发无聊的时间,一方面也是督促自己该学习辣!身边的大神都转行的转行,加薪的加薪,本人比较 ...
- vue router 参数_Vue.js项目开发技术解析
Vue.js项目开发技术解析 一.Vue.js实例 在一个Vue.js工程中,用于显示内容最基层的实例称之为根实例.通过该实例可以进行页面或组件的更新和显示.对于项目本身而言,无论是什么样的页面,都要 ...
最新文章
- 黑莓作为猫带笔记本上网
- 【入门须知】学DIV CSS技术如何入门?
- 汇编loop指令及用法解释
- [网摘]关于产品运营
- 一个Json在线格式化的网站
- C++设计模式之工厂方法模式
- String、StringBuffer和StringBuilde的区别
- QWT错误static struct QMetaObject const QwtPlot
- cad lisp 法兰6_南昌平板法兰加工设备_山东平安数控机械有限公司
- 飞思卡尔磁力计MAG3110 快速上手指南
- Vm虚拟机Deepin安装教程---kalrry
- VC++课程设计常见问题解答
- 落花人独立,微雨燕双飞——晏几道《临江仙》
- Unity中的UI相关组件
- 十年测试经验的阿里p10讲解python初阶:函数和模块 python全栈自动化测试系类4-2
- AE插件-快速景深模糊插件 Aescripts Fast Bokeh Pro v2.0.7 WIN
- matlab设置坐标数值,Matlab中描点及坐标设置相关
- 易语言 Visual Basic 6.0 (VB6)
- 程序是如何运行的呢?
- 程序员的一颗浮躁的心