VUE三 vue-router(路由)详解
前端路由
根据不同的 url 地址展示不同的内容或页面,无需依赖服务器根据不同URL进行页面展示操作
优点
- 用户体验好,不需要每次都从服务器全部获取,快速展现给用户
缺点
- 使用浏览器的前进,后退键的时候会重新发送请求,没有合理地利用缓存
- 单页面无法记住之前滚动的位置,无法在前进,后退的时候记住滚动的位置
一、路由(以user为例)
userList-->用户列表页的路由所加载的代码(router-->index.js)
import Vue from 'vue' //引入vue
import Router from 'vue-router' //引入vue-router
import userList from '@/components/userList' //引入根目录下的user.vue组件 Vue.use(Router) //vue全局使用Router export default new Router({
routes: [ //配置路由,这里是个数组
{
path: '/userList', //链接路径
name: 'userList', //路由名称
component: userList //对应的组件模板
}
]
})
userList-->用户列表页代码(userList.vue)
<template>
<div>展示用户列表页</div>
</template> <script>
export default {
name: 'userList',
data () {
return {
msg: ''
}
}
}
</script> <style scoped> </style>
打开网址:http://localhost:8080/#/userList 显示如上模板解析页。
注意:其中 # 为哈希,mode:hash 若要用原始类型的网址,则mode:history。
二、动态路由匹配
模式 | 匹配路径 | 获取动态路由参数 |
/user/:username | /user/nina | $route.params.username |
/user?:username | /user?username=nina | $route.query.username |
还是以userList为例
创建一个 userList 组件,对于所有 ID 各不相同的用户,都要使用这个组件来渲染。所以,我们需要在 vue-router 的路由路径中使用『动态路径参数』来达到这个效果。
userList-->用户列表页的路由所加载的代码(router-->index.js)
import Vue from 'vue'
import Router from 'vue-router'
import userList from '@/components/userList' Vue.use(Router) export default new Router({
routes: [ {
path: '/userList/:userId', //动态设置路由参数
name: 'userList',
component: userList
}
]
})
user-->用户列表页代码(userList.vue)
<template> <div>
<div>展示用户列表页</div>
<div>用户ID</div>
<span>{{$route.params.userId}}</span> //获取用户userId
</div> </template> <script>
export default {
name: 'userList',
data () {
return {
msg: ''
}
}
}
</script> <style scoped> </style>
打开网址:http://localhost:8080/#/userList/0006 可以看到用userList组件渲染出来的userId显示在页面上。
三、嵌套路由
选项卡,在选项卡中,顶部有数个导航栏,中间显示的是主体内容,这个时候,整个页面是一个路由,然后点击选项卡切换不同的路由来展示不同的内容,这个时候就是路由中嵌套路由。
用户信息列表页,在用户信息列表中,会有用户的基本信息页,用户的密码修改页等也需要路由的嵌套
以userList列表页为例
userList-->用户列表页的路由所加载的代码(router-->index.js)
import Vue from 'vue'
import Router from 'vue-router'
import userList from '@/components/userList'
import userInfo from '@/components/userInfo'
import changePaw from '@/components/changePaw' Vue.use(Router) export default new Router({
routes: [ {
path: '/userList',
name: 'userList',
component: userList,
children:[
{
path:'userInfo',
name:'userInfo',
component:userInfo
},
{
path:'changePaw',
name:'changePaw',
component:changePaw
}
]
}
]
})
useruserList-->用户列表页代码(userList.vue)
<template> <div>
<div>展示用户列表页</div>
<router-link to="/userList/userInfo">用户基本信息页</router-link> //to后必须用绝对地址
<router-link to="/userList/changePaw">修改密码页</router-link>
<div>
<router-view></router-view>
</div> </div> </template> <script>
export default {
name: 'userList',
data () {
return {
msg: ''
}
}
}
</script> <style scoped> </style>
两个子页面-->用户基本信息页(userInfo.vue)
<template> <div>
<div>用户基本信息页</div> </div> </template> <script>
export default {
name: 'userInfo',
data () {
return {
msg: ''
}
}
}
</script> <style scoped> </style>
两个子页面-->用户修改密码页(changePaw.vue)
<template> <div>
<div>用户修改密码页</div> </div> </template> <script>
export default {
name: 'changePaw',
data () {
return {
msg: ''
}
}
}
</script> <style scoped> </style>
打开网址:http://localhost:8080/#/userList 可以看到用userList组件渲染出来页面上,有两个导航(用户基本信息页、用户修改密码页)可以来回切换
四、编程式路由
通过js来实现页面的跳转
- $router.push("name")
- $router.push({path:"name"})
- $router.push({path:"name?a=123"})或者$router.push({path:"name",query:{a:123}})
- $router.go(1)
(1)先用常用的<router-link>为例
以userList列表页为例,添加跳转到产品中心的链接。
userList-->用户列表页的路由所加载的代码(router-->index.js)
import Vue from 'vue'
import Router from 'vue-router'
import userList from '@/components/userList'
import productCenter from '@/components/productCenter' Vue.use(Router) export default new Router({
routes: [
{
path: '/userList',
name: 'userList',
component: userList,
},
{
path:'/productCenter',
name:'productCenter',
component:productCenter
}
]
})
useruserList-->用户列表页代码(userList.vue)
<template> <div>
<div>展示用户列表页</div>
<router-link to="/productCenter">产品中心页</router-link>
</div> </template> <script>
export default {
name: 'userList',
data () {
return {
msg: ''
}
}
}
</script> <style scoped> </style>
产品中心页(productCenter.vue)
<template> <div>
<div>产品列表页</div> </div> </template> <script>
export default {
name: 'productCenter',
data () {
return {
msg: ''
}
}
}
</script> <style scoped> </style>
打开网址:http://localhost:8080/#/userList 可以看到用userList组件渲染出来页面上,有个跳转导航(产品中心页),点击可以跳转到产品中心页。
(2)$router.push("name") ==》其中如例一中,只改变userList.vue中的跳转方式
<template> <div>
<div>展示用户列表页</div>
<button @click="jump">产品中心页</button> //添加跳转事件
</div> </template> <script>
export default {
name: 'userList',
data () {
return {
msg: ''
}
},
methods:{
jump(){
this.$router.push('/productCenter') //应用js跳转事件进行跳转
}
}
}
</script> <style scoped> </style>
(2)$router.push({path:"name"}) ==》其中如例一中,只改变userList.vue中的跳转方式
<template> <div>
<div>展示用户列表页</div>
<button @click="jump">产品中心页</button>
</div> </template> <script>
export default {
name: 'userList',
data () {
return {
msg: ''
}
},
methods:{
jump(){
this.$router.push({path:'/productCenter'})
}
}
}
</script> <style scoped> </style>
(3)$router.push({path:"name?a=123"})或者$router.push({path:"name",query:{a:123}})
==》其中如例一中,只改变userList.vue中的跳转方式,并在产品中心页(productCenter.vue)接收参数用query接收
userList.vue
<template> <div>
<div>展示用户列表页</div>
<button @click="jump">产品中心页</button>
</div> </template> <script>
export default {
name: 'userList',
data () {
return {
msg: ''
}
},
methods:{
jump(){
this.$router.push({path:'/productCenter?userId=0001'})
}
}
}
</script> <style scoped> </style>
productCenter.vue-->接收传过来的参数
<template> <div>
<div>产品列表页</div>
<div>接收参数
<span>{{$route.query.userId}}</span> //接收页面切换过来的参数
</div>
</div> </template> <script>
export default {
name: 'productCenter',
data () {
return {
msg: ''
}
}
}
</script> <style scoped> </style>
注意组件与组件之前路由切换的时候传递用params
页面之间的切换(比如?拼接的方式)传递用jquery
五、命名路由和命名视图
- 给路由定义不同的名字,根据路由的名字进行匹配
- 给不同的router-view定义名字,通过名字进行对应组件的渲染
(1)命名路由
以userList列表页为例,添加跳转到产品中心的链接。
userList-->用户列表页的路由所加载的代码(router-->index.js)
import Vue from 'vue'
import Router from 'vue-router'
import userList from '@/components/userList'
import productCenter from '@/components/productCenter' Vue.use(Router) export default new Router({
routes: [
{
path: '/userList',
name: 'userList',
component: userList,
},
{
path:'/productCenter',
name:'productCenter', //定义路由的名字
component:productCenter
}
]
})
useruserList-->用户列表页代码(userList.vue)
<template> <div>
<div>展示用户列表页</div>
<router-link v-bind:to="{name:'productCenter'}">产品中心页</router-link> //跳转到与路由名字相同的路由地址
</div> </template> <script>
export default {
name: 'userList',
data () {
return {
msg: ''
}
}
}
</script> <style scoped> </style>
产品中心页(productCenter.vue)
<template> <div>
<div>产品列表页</div> </div> </template> <script>
export default {
name: 'productCenter',
data () {
return {
msg: ''
}
}
}
</script> <style scoped> </style>
(2)跳转到产品中心的路由为动态路由
userList-->用户列表页的路由所加载的代码(router-->index.js)
import Vue from 'vue'
import Router from 'vue-router'
import userList from '@/components/userList'
import productCenter from '@/components/productCenter' Vue.use(Router) export default new Router({
routes: [
{
path: '/userList',
name: 'userList',
component: userList,
},
{
path:'/productCenter/:userId', //为动态路由
name:'productCenter',
component:productCenter
}
]
})
useruserList-->用户列表页代码(userList.vue)
<template> <div>
<div>展示用户列表页</div>
<router-link v-bind:to="{name:'productCenter',params:{userId:0001}}">产品中心页</router-link> //跳转到与路由名字相同的路由地址,params是路由的参数,不是页面跳转参数
</div> </template> <script>
export default {
name: 'userList',
data () {
return {
msg: ''
}
}
}
</script> <style scoped> </style>
(2)命名视图
路由所加载的代码(router-->index.js)
import Vue from 'vue'
import Router from 'vue-router'
import userList from '@/components/userList'
import userInfo from '@/components/userInfo'
import changePaw from '@/components/changePaw' Vue.use(Router) export default new Router({
routes: [
{
path: '/',
name: 'userList',
components: {
default:userList,
userInfo:userInfo,
changePaw:changePaw
}
}
]
})
App.vue-->再浏览器输入根网址后,页面会展示出路由所加载的所有页面信息。
<template>
<div id="app">
<span>ddddddddddddddddddd</span>
<router-view class="main"></router-view>
<router-view class="left" name="userInfo"></router-view>
<router-view class="right" name="changePaw"></router-view>
</div>
</template> <script>
export default {
name: 'App'
}
</script> <style>
#app {
font-family: 'Avenir', Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
margin-top: 60px;
}
</style>
路由中的meta
meta字段(元数据)
直接在路由配置的时候,给每个路由添加一个自定义的meta对象,在meta对象中可以设置一些状态,来进行一些操作。用它来做登录校验再合适不过了
{
path: '/actile',
name: 'Actile',
component: Actile,
meta: {
login_require: false
},
},
{
path: '/goodslist',
name: 'goodslist',
component: Goodslist,
meta: {
login_require: true
},
children:[
{
path: 'online',
component: GoodslistOnline
}
]
}
这里我们只需要判断item下面的meta对象中的login_require是不是true,就可以做一些限制了
router.beforeEach((to, from, next) => {
if (to.matched.some(function (item) {
return item.meta.login_require
})) {
next('/login')
} else
next()
})
VUE三 vue-router(路由)详解的更多相关文章
- Vue 路由详解
Vue 路由详解 对于前端来说,其实浏览器配合超级连接就很好的实现了路由功能.但是对于单页面应用来说,浏览器和超级连接的跳转方式已经不能适用,所以各大框架纷纷给出了单页面应用的解决路由跳转的方案. V ...
- vue技术栈进阶(02.路由详解—基础)
路由详解(一)--基础: 1)router-link和router-view组件 2)路由配置 3)JS操作路由
- vue和react全面对比(详解)
vue和react对比(详解) 放两张图镇压小妖怪 本文先讲共同之处, 再分析区别 大纲在此: 共同点: a.都使用虚拟dom b.提供了响应式和组件化的视图组件 c.注意力集中保持在核心库,而将其他 ...
- Ocelot简易教程(三)之主要特性及路由详解
作者:依乐祝 原文地址:https://www.cnblogs.com/yilezhu/p/9664977.html 上篇<Ocelot简易教程(二)之快速开始2>教大家如何快速跑起来一个 ...
- elasticsearch系列三:索引详解(分词器、文档管理、路由详解(集群))
一.分词器 1. 认识分词器 1.1 Analyzer 分析器 在ES中一个Analyzer 由下面三种组件组合而成: character filter :字符过滤器,对文本进行字符过滤处理,如 ...
- npm安装vue详细教程(图片详解)
npm安装vue详细教程(图片详解) 一.总结 一句话总结:整个安装流程照着教程来,注意系统环境变量的配置,注意一下npm的本地仓库和缓存位置 教程 系统环境变量 仓库 缓存 1.什么情况下最适合用n ...
- Vue插件编写、用法详解(附demo)
Vue插件编写.用法详解(附demo) 1.概述 简单来说,插件就是指对Vue的功能的增强或补充. 比如说,让你在每个单页面的组件里,都可以调用某个方法,或者共享使用某个变量,或者在某个方法之前执行一 ...
- vue视图不更新情况详解
vue视图不更新情况详解:https://www.jb51.net/article/161371.htm
- [转载]Ocelot简易教程(三)之主要特性及路由详解
上篇<Ocelot简易教程(二)之快速开始2>教大家如何快速跑起来一个ocelot实例项目,也只是简单的对Ocelot进行了配置,这篇文章会给大家详细的介绍一下Ocelot的配置信息.希望 ...
- iOS路由详解
本文如题,路由详解,注定是一篇详细解释iOS路由原理及使用的文章,由于此时正在外地出差,无法详细一一写出,只能不定时的补充. 一.什么是iOS路由 路由一词来源于路由器,可以实现层级之间消息转发的功能 ...
随机推荐
- pycharm打印出的汉字显示乱码
pycharm未配置时,默认配置为: 打印汉字时显示乱码 简单设置即可 这下以后就没有问题了.
- Java逆向工程(数据库表生成java类)
说起来倒是挺简单的,就是听着名字感觉挺高大上.逆向工程方式有很多,比如mybatis就提供了一个这样的工具mybatis-genderator,这个我反正是没用过只是听说过,以前在公司都是用公司写好的 ...
- android版本更新框架、新闻客户端、音乐播放器、自定义View、Github客户端、指南针等源码
Android精选源码 XUpdate 一个轻量级.高可用性的Android版本更新框架 Android一个可定制的圆形进度条 Android自定义View分享 打钩动画源码 android音乐文件播 ...
- Qt QString的arg()方法的使用
1.QString的arg()方法用于填充字符串中的%1,%2...为给定的参数,如 QString m = tr("); // m = "12:60:60: 2.它还有另外一种重 ...
- 类加载器ClassLoader的理解
最近在做一个热加载Class的小组件,这个组件需要对类加载器ClassLoader有所了解,我就顺便借这个机会把学到的一点皮毛与大家分享一下. 从Class文件开始 ClassLoader,顾名思义就 ...
- [LC] 209. Minimum Size Subarray Sum
Given an array of n positive integers and a positive integer s, find the minimal length of a contigu ...
- jmeter如何解决乱码问题
使用jmeter的时候时常遇到中文乱码的情况,下面总结一下几个解决方法,方便以后进行复习. 1.添加后置处理器Beanshell PostProcessor,在输入框内写入“prve.setDateE ...
- 3DMAX卸载/完美解决安装失败/如何彻底卸载清除干净3DMAX各种残留注册表和文件的方法
在卸载3dmax重装3dmax时发现安装失败,提示是已安装3dmax或安装失败.这是因为上一次卸载3dmax没有清理干净,系统会误认为已经安装3dmax了.有的同学是新装的系统也会出现3dmax安装失 ...
- Floyd算法-dp问题
求结点对之间有负数的距离.限制条件:不允许有包含负权值的边组成的回路. 例子: 1.初始化 其中distance矩阵表示i,j两结点之间的距离. path矩阵,以第一行为例,表示0->0值为n表 ...
- Analysis of Hello2 source code
Hello2 应用程序是一个 Web 模块,它使用 Java Servlet 技术来显示问候语和响应,使用的是 Java Servlet 技术. 该应用程序源代码在 tutorial-examples ...