vue-router(vuerouter动态添加路由)

http://www.itjxue.com  2023-01-30 00:05  来源:未知  点击次数: 

VueRouter的基本使用

1.导入vue-router.js文件,必须插入到vue.js文件后面

2.定义路由规则

4.将创建好的路由对象绑定到Vue实例上

5.修改URL哈希值

6.通过router-view渲染匹配的组件

7.css样式

router-link标签:Vue Router中提供专门用于设置哈希值的标签;

router-view标签:Vue Router中提供专门用于将路由匹配到的组件渲染到指定位置;

2.给router-link设置选中样式

默认情况下我们可以通过重写router-link -active类名来实现设置选中样式,但是我们也可以通过linkActiveClass来指定选中样式;

案例: 在one界面中又有两个按钮,通过这两个按钮进一步 切换one中的内容

2--Vue-Router

router-view / 存放页面

路由匹配到的组件将会渲染到App.vue里的router-view /

那么这个App.vue里应该这样写:

切换路由router-link

src/router/main.js

this.$route.params.id ----------// 获取名称为id的参数($route不带r)

rem 布局

1. 拷贝flex.min.js 文件到项目目录

2. src/main.js 导入 import “xxx.flexible.min.js”

3. 在flexible.min.js修改设计宽度

4. 修改css单位 100px = 1rem;

.router-link-active

全局配置 router-link 默认的激活的 class

.router-link-exact-active

全局配置 router-link 默认的精确激活的 class

导入Cookie

import Cookie from '../assets/js/Cookie'

使用Cookie

Cookie.setCookie("uname","mumu");

Cookie.delCookie("uname");

this.uname = Cookie.getCookie("uname");

守卫 三个参数

src/router/main.js添加

Cart购物车页面

给路由配置额外的信息

{

path:"/cart",

meta:{requireAuth:true}

}

$route.meta.requireAuth 获取

main.js里边引入css或者自己写

通过懒加载就不会一次性把所有组件都加载进来,而是当你访问到那个组件的时候才会加载那一个。对于组件比较多的应用会提高首次加载速度。

/* webpackChunkName: "about" */

魔法注释 :指的是吧路由分割为一个单独的js文件名称是about

让css只在当前组件中起作用

通过/index/info就可以访问到info组件了

要注意,以 / 开头的嵌套路径会被当作根路径。 这让你充分的使用嵌套组件而无须设置嵌套的路径。

当你访问 /user/foo 时,User 的出口是不会渲染任何东西,这是因为没有匹配到合适的子路由。如果你想要渲染点什么,可以提供一个 空的 子路由

有时候想同时(同级)展示多个视图,而不是嵌套展示,例如创建一个布局,有 sidebar(侧导航) 和 main(主内容) 两个视图,这个时候命名视图就派上用场了。你可以在界面中拥有多个单独命名的视图,而不是只有一个单独的出口。如果 router-view 没有设置名字,那么默认为 default。

vue-router路由跳转原理

突发奇想,vue-router做单页面应用的时候是如何保证路由跳转的呢?

源码中有两种模式,一种的history模式,另一种是hash模式。

其中abstract模式的应用场景应该是服务端渲染的时候,暂不考虑

以history模式为例,要实现一个完整的路由跳转,会经过如下路径:

? ? history.transition() - history.confirmTransition() -history.update(route)-app._route=route?

其中当app._route=route此时会触发vue组件的re-render,那么为什么呢?

因为

在这个地方使用vue的工具函数,使得_route属性被劫持,当_router初始赋值get时就已经收集了vm._watcher,该watcher是专门用来render该vm实例的,所有当app._router=router时就触发了re-render,通过router-view函数式组件render出匹配的组件。其中this._router.init(this)就是将app=this.

当然为了适应用户通过前进后退来进行单页切换的场景,vue-router里通过监听popstate事件来触发跳转

当然,在路由跳转过去中,vue-router底层通过对前后的组件进行比较判断出deactived,actived,updated的组件,然后提供组件切换过程的一些钩子函数,辅助开发者进行特性开发

如下:

文笔不怎么地,求踩!!!!!!

Vue路由的使用

路由允许我们通过不同的URL去访问不同的内容,该URL可以是我们自己设置的,在项目中并没有这样的文件夹,这种功能就是路由

路由的本质是hash值

定:定义路由组件

配:配置路由

实:实例化路由

挂:挂载路由

路由(vue-router)的基本作用就是将每个路径映射到对应的组件,通过修改路由进行组件之间的转换

常规路径规则为在当前路径后面加上"/path",path即为设定的前端路由路径

? 跳转到上一次的页面:this.$router.go(-1);

? 指定跳转的地址:this.$router.replace("/path");

? 指定跳转的路由名字下:this.$router.replace({name:"menuLink"});

? 通过push进行跳转:this.$router.push("/path");

? 或this.$router.push({name:"path"});

? (1)设置一个默认展示组件,(不推荐!!!)

? ? ? ? {path:"/",component:login}

? ? (2) 路由redirect重定向,设置默认组件

? ? ? ? {path:"/",redirect:"login"}

? (1)创建一个路由对象,当导入vue-router包之后,在window全局对象之中就有一个路由的构造函数VueRouter

? (2)在new路由对象的时候可以传递一个配置对象,这个配置对象的route表示路由器的匹配规则

? (3)每个路由规则都是一个对象,这个规则对象身上必须有两个属性

? ? ? ? 属性1:path表示监听那个路由的链接地址

属性2:component表示如果路由是前面匹配到的path,则展示component属性对应的组件,

? ? ? component属性值必须是一个组件模板对象,不能是组件的引用名称

? (4)router:routerObj将路由规则对象,注册到VM实例上,用来监听URL地址的变化,然后展示对应的组件

? (5)使用vue官方提供的router-link元素使用它,默认渲染成一个a标签,router-link to="login"登录/router-link

? (6)在控制的div中(App.Vue)使用router-view/router-view

vue-router导航守卫之实战篇

官方这么说:

好吧,看不懂,就好(当)好(废)理(话)解(吧)下。其实,导航守卫就是路由跳转过程中的一些钩子函数,再直白点路由跳转是一个大的过程,这个大的过程分为跳转前中后等等细小的过程,在每一个过程中都有一函数,这个函数能让你操作一些其他的事儿的时机,这就是导航守卫。

先看一个钩子函数执行后输出的顺序截图吧,一般讲解都会在之后呈现,给大家换种思路(也就是先预习再学习最后复习)

[图片上传失败...(image-b044c6-1632499247491)]

好吧不知道的估计看不懂吧!不过我希望你能看到一个点能多倒回来看看这个顺序,前方干货预警

导航守卫分为 :全局的、单个路由独享的、组件内的三种。分别来看一下:

【全局的】:是指路由实例上直接操作的钩子函数,他的特点是所有路由配置的组件都会触发,直白点就是触发路由就会触发这些钩子函数,如下的写法。钩子函数按执行顺序包括beforeEach、beforeResolve(2.5+)、afterEach三个(以下的钩子函数都是按执行顺序讲解的):

[beforeEach]:在路由跳转前触发,参数包括to,from,next(参数会单独介绍)三个,这个钩子作用主要是用于登录验证,也就是路由还没跳转提前告知,以免跳转了再通知就为时已晚。

[beforeResolve](2.5+):这个钩子和beforeEach类似,也是路由跳转前触发,参数也是to,from,next三个,和beforeEach区别官方解释为:

即在 beforeEach 和 组件内beforeRouteEnter 之后,afterEach之前调用。

[afterEach]:和beforeEach相反,他是在路由跳转完成后触发,参数包括to,from没有了next(参数会单独介绍),他发生在beforeEach和beforeResolve之后,beforeRouteEnter(组件内守卫,后讲)之前。

【路由独享的】是指在单个路由配置的时候也可以设置的钩子函数,其位置就是下面示例中的位置,也就是像Foo这样的组件都存在这样的钩子函数。目前他只有一个钩子函数beforeEnter:

[beforeEnter]:和beforeEach完全相同,如果都设置则在beforeEach之后紧随执行,参数to、from、next

【组件内的】:是指在组件内执行的钩子函数,类似于组件内的生命周期,相当于为配置路由的组件添加的生命周期钩子函数。钩子函数按执行顺序包括beforeRouteEnter、beforeRouteUpdate (2.2+)、beforeRouteLeave三个,执行位置如下:

[beforeRouteEnter]:路由进入之前调用,参数包括to,from,next。该钩子在全局守卫beforeEach和独享守卫beforeEnter之后,全局beforeResolve和全局afterEach之前调用,要注意的是该守卫内访问不到组件的实例,也就是this为undefined,也就是他在beforeCreate生命周期前触发。在这个钩子函数中,可以通过传一个回调给 next来访问组件实例。在导航被确认的时候执行回调,并且把组件实例作为回调方法的参数,可以在这个守卫中请求服务端获取数据,当成功获取并能进入路由时,调用next并在回调中通过 vm访问组件实例进行赋值等操作,(next中函数的调用在mounted之后:为了确保能对组件实例的完整访问)。

[beforeRouteUpdate] (v 2.2+):在当前路由改变时,并且该组件被复用时调用,可以通过this访问实例。参数包括to,from,next。可能有的同学会疑问,what is 路由改变 or what is 组件被复用?

[beforeRouteLeave]:导航离开该组件的对应路由时调用,可以访问组件实例 this ,参数包括to,from,next。

至此,所有钩子函数介绍完毕。

屡一下哈:

全局路由钩子:beforeEach(to,from, next)、beforeResolve(to,from, next)、afterEach(to,from);

独享路由钩子:beforeEnter(to,from, next);

组件内路由钩子:beforeRouteEnter(to,from, next)、beforeRouteUpdate(to,from, next)、beforeRouteLeave(to,from, next)

不知道你是否还记得to、from、next这三个参数

下面请重头把这几个钩子函数的参数看一遍,细心的同学可以看见在afterEach钩子中参数没有next,为什么呢?

to:目标路由对象;

from:即将要离开的路由对象;

next:他是最重要的一个参数,他相当于佛珠的线,把一个一个珠子逐个串起来。以下注意点务必牢记:

1.但凡涉及到有next参数的钩子,必须调用next() 才能继续往下执行下一个钩子,否则路由跳转等会停止。

2.如果要中断当前的导航要调用next(false)。如果浏览器的 URL 改变了 (可能是用户手动或者浏览器后退按钮),那么 URL 地址会重置到 from 路由对应的地址。(主要用于登录验证不通过的处理)

3.当然next可以这样使用,next('/') 或者 next({ path: '/' }): 跳转到一个不同的地址。意思是当前的导航被中断,然后进行一个新的导航。可传递的参数与 router.push 中选项一致。

4.在beforeRouteEnter钩子中next((vm)={})内接收的回调函数参数为当前组件的实例vm,这个回调函数在生命周期mounted之后调用,也就是,他是所有导航守卫和生命周期函数最后执行的那个钩子。

5.next(error): (v2.4.0+) 如果传入 next 的参数是一个 Error 实例,则导航会被终止且该错误会被传递给 [router.onError()]() 注册过的回调。

好了,还记得那个截图吗,我们再看一遍

[图片上传失败...(image-940ea2-1632499247491)]

我们最后屡一下顺序:

当点击切换路由时:beforeRouterLeave--beforeEach--beforeEnter--beforeRouteEnter--beforeResolve--afterEach--beforeCreate--created--beforeMount--mounted--beforeRouteEnter的next的回调

当路由更新时:beforeRouteUpdate

(责任编辑:IT教学网)

更多

推荐图片影音文章