【原创】一篇学会vue路由配置 、 动态路由 、多层路由(实例)
先来看看效果图:

为了方便讲解,我没有使用vue脚手架,如果需要的,可以留言跟我要。不多说开工:
首先,html先组上
<div id="app">
<div>
<router-link to="/index">首页</router-link>
<router-link to="/news">新闻</router-link>
<router-link to="/friend">朋友圈</router-link>
<router-view></router-view>
</div> </div>
这个没什么要说的把,不懂html我也没招,router-link 页面路径 router-view vue展现视图
接下来就是vuejs的代码,我说下思路吧,针对新手思路:首先我们先写一级的路由,先不考虑二级的。写好了一层的再去考虑二层的,这是一层路由代码,这是注释都写全了就不一行行解释了。
// 注册新闻列表模块
Vue.component('newstpl',{
template:'<div><h2>新闻页</h2></div>',
});
// 注册朋友圈列表模块
Vue.component('firendlist',{
template:'<div><h1><center>朋友圈</center></h1></div>',
})
//首页内容
const indexhtml={
template:"<div><h3>主页内容</h3></div>"
}
//新闻页面内容
const newhtml={
template:'<newstpl></newstpl>'
}
//朋友圈页面内容
const firendhtml={
template:'<firendlist></firendlist>',
}
//声明路由器
const routes=[
{path:'/index',component:indexhtml,
},
{path:'/news',component:newhtml,
},
{path:'/friend',component:firendhtml},
]
//注册路由
const router = new VueRouter({
routes
})
//绑定
new Vue({
el:'#app',
router, })
好了,一层实现完毕,启动看看,好没问题,咱们往下走,下面我讲细一点吧 有点复杂。
咱们一共首页、朋友圈和新闻三个模块。一个个来
首页,相对简单。就是简单的二层路由
const indexhtml={
template:"<div><h3>主页内容</h3><p><router-link to='/index/zhuce'>注册</router-link> <router-link to='/index/login'>登录</router-link></router-link></p><router-view></router-view></div>"
}
首先把indexhtml改成如上一般,增加注册和登录两个模块,既然增加了这俩模块,那肯定也要有魔板对吧,
//注册页面
const zhuce={
template:'<div>我是注册页面</div>'
}
//登录页面
const login={
template:'<div>我是登录页面</div>'
}
模版有了,那么就是写进路由了,路由怎么写呢?
{path:'/index/login',component:login},
这么写么?大家想一下,这么写可以么
首先,这么写相当于直接到了登录页面,却不显示index页面了,
再者,这样完全不利于代码的可读性,想象一下,另外的人去看你代码,那么多路由,谁知道对应哪里呢?不利于工作需要,
下面上正确的代码,
{path:'/index',component:indexhtml,
children:[
{path:'zhuce',component:zhuce},
{path:'login',component:login},
]
}
来说说吧,多层路由增加一个childred数组,简单吧,也可以继续嵌套,多层嵌套即可
想直接copy代码的可以看最后,可以分享所有代码。 这样简单的实现了首页的效果,再来说说新闻页面把,首先我考虑的是假如是一个后台系统,用户自定义的新闻路径,那么肯定不能是写死的地址,对吧,然后就是他的列表,肯定就要通过一个数组存储(本文中所有都是本地数据,需要服务器数据的可以留言我),在这他列表点击肯定要显示他的新闻内容,这个内容肯定不能写死地址,所以第一时间就想到了动态路由,也是本文的重点,下面开始吧(以下代码使用了watch监听,个人不推荐使用watch来制作页面,特别耗费资源,本文这么做是因为要讲解动态路由,但是不想全加载一个内容,并且当时写的时候有人问了我watch相关的,所以用了,好了不多说,说道用的时候再说替换方法)
首先我们要注册一个新闻列表的模块
// 注册新闻列表模块
Vue.component('newstpl',{
template:'<div><h2>新闻页</h2><ul><li v-for="i in list"><router-link :to=" \'/news/\' + i.path">{{i.name}}</router-link></li></ul><router-view></router-view></div>',
data(){
return {
list:[
{name:'新闻一',path:'new1'},
{name:'新闻二',path:'new2'},
{name:'新闻三',path:'new3'}
], }
}
});
也需要注册一个内容页的模块
// 注册新闻内容模块 实现内容针对性
Vue.component('contenttpl',{
props: {
data1: {
default: 'new4'
}
},
template:`<div><h1>{{yemian[0].title}}</h1><h2>{{yemian[0].content}}</h2></div>`,
data(){
return {
yemian:[{}],
newlist:[
{title:'new1',content:'新闻一的内容'},
{title:'new2',content:'新闻er的内容'},
{title:'new3',content:'新闻san的内容'},
]
}
},
watch:{
data1(){
this.myfunction() }
},
mounted(){
this.myfunction()
},
methods:{
myfunction(){ this.yemian = this.newlist.filter(item=>{
return item.title==this.data1; })
},
},
});
这段比较长,说一下把,首先watch这个完全可以换成在列表加载出来之后去后台直接获取完整地址,再用完整地址来更新view,
在这说说我为什么需要一个myfunction这个函数,首先这也是watch和路由配合的一个缺点,用watch监听参数变化时候,怎么动态去更新内容呢,所以我增加了watch监听,但是发现模版第一次加载时候不生效,这是因为我第一次点击时候是传参,所以在魔板生成时候就已经有了这个,即便增加默认值也是不行的,所以增加了一个方法,开始就触发一遍,
filter是js语法,不懂得可以去查查,不多讲
接下来就是配置这个路由,
{path:'/news',component:newhtml,
children:[
{path:'/news/:id',component:{
template:'<contenttpl :data1="$route.params.id"></contenttpl>'
}}
]
},
contenttpl这个上面注册了,上面提到我考虑后台数据,不确定的情况,所以需要传参更改内容(又是watch的锅),如果用我提到的另外一种方法可以避免这么麻烦,感兴趣的可以找我要。
$route.params.id 获取动态路由的值
不懂得可以看看route第二章
https://router.vuejs.org/zh-cn/essentials/dynamic-matching.html
大约在第二屏
接下来就是朋友圈这个,这个上面的gif就看出来了,把第二个看完,第三个就是留给你自己练习的,看完本文的朋友去练习把,下面分享本页面的全部代码
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>vueroter 学习</title>
</head>
<body>
<div id="app">
<div>
<router-link to="/index">首页</router-link>
<router-link to="/news">新闻</router-link>
<router-link to="/friend">朋友圈</router-link>
<router-view></router-view>
</div> </div> <script src="https://unpkg.com/vue/dist/vue.js"></script>
<script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
<script>
// 注册新闻列表模块
Vue.component('newstpl',{
template:'<div><h2>新闻页</h2><ul><li v-for="i in list"><router-link :to=" \'/news/\' + i.path">{{i.name}}</router-link></li></ul><router-view></router-view></div>',
data(){
return {
list:[
{name:'新闻一',path:'new1'},
{name:'新闻二',path:'new2'},
{name:'新闻三',path:'new3'}
], }
}
});
// 注册新闻内容模块 实现内容针对性
Vue.component('contenttpl',{
props: {
data1: {
default: 'new4'
}
},
template:`<div><h1>{{yemian[0].title}}</h1><h2>{{yemian[0].content}}</h2></div>`,
data(){
return {
yemian:[{}],
newlist:[
{title:'new1',content:'新闻一的内容'},
{title:'new2',content:'新闻er的内容'},
{title:'new3',content:'新闻san的内容'},
]
}
},
watch:{
data1(){
this.myfunction() }
},
mounted(){
this.myfunction()
},
methods:{
myfunction(){ this.yemian = this.newlist.filter(item=>{
return item.title==this.data1; })
}, }, });
// 注册朋友圈列表模块
Vue.component('firendlist',{
template:'<div><h1><center>朋友圈</center></h1><ul><li v-for="t in firendlist">{{t.name}}</li></ul></div>',
data(){
return {
firendlist:[
{name:'1'},
{name:'2'},
{name:'3'},
{name:'4'},
{name:'5'},
{name:'6'},
{name:'7'},
{name:'8'},
{name:'9'},
{name:'10'},
{name:'11'},
{name:'12'},
]
}
}
})
//首页内容
const indexhtml={
template:"<div><h3>主页内容</h3><p><router-link to='/index/zhuce'>注册</router-link> <router-link to='/index/login'>登录</router-link></router-link></p><router-view></router-view></div>" }
//新闻页面内容
const newhtml={
template:'<newstpl></newstpl>' }
//朋友圈页面内容
const firendhtml={
template:'<firendlist></firendlist>', }
//注册页面
const zhuce={
template:'<div>我是注册页面</div>'
}
//登录页面
const login={
template:'<div>我是登录页面</div>'
} //声明路由器
const routes=[
{path:'/index',component:indexhtml,
children:[
{path:'zhuce',component:zhuce},
{path:'login',component:login},
]
},
{path:'/news',component:newhtml,
children:[
{path:'/news/:id',component:{
template:'<contenttpl :data1="$route.params.id"></contenttpl>'
}}
]
},
{path:'/friend',component:firendhtml}, ]
//注册路由
const router = new VueRouter({
routes
})
//绑定
new Vue({
el:'#app',
router, })
</script>
</body>
</html>
以上是本文全部代码,不喜勿喷,本文分享结束。转载需要注明原处
【原创】一篇学会vue路由配置 、 动态路由 、多层路由(实例)的更多相关文章
- Vue结合路由配置递归实现菜单栏
作者:小土豆biubiubiu 博客园:https://www.cnblogs.com/HouJiao/ 掘金:https://juejin.im/user/58c61b4361ff4b005d9e8 ...
- vue路由配置,vue子路由配置
上一篇关于vue环境配置已经写好了!按照操作就行了! 现在一个项目已经部署完成,接下来我们从路由开始! 还记得在初始化项目的时候,有提示是否需要安装vue-router,对没错,vue中路由全靠它! ...
- 路由器基本配置实验,静态路由和动态RIP路由
实验涉及命令以及知识补充 连线 PC和交换机FastEtherNet接口 交换机和路由器FastEtherNet接口 路由器和路由器Serial接口 serial是串行口,一般用于连接设备,不能连接电 ...
- vue 路由配置
1.不带参数的路由配置 及 跳转 //路由配置: { name: "a", path: "/a", component: a } 页面跳转: this.$r ...
- Spring Cloud构建微服务架构:服务网关(路由配置)【Dalston版】
转载:http://blog.didispace.com/spring-cloud-starter-dalston-6-2/ 原创 2017-08-26 翟永超 Spring Cloud 被围观 ...
- 一、虚拟环境.二、路由配置主页与404.三、2.x路由分发.四、伪静态.五、request对象.六、FBV与CBV.七、文件上传.
一.虚拟环境 ''' 解决版本共存 1. 用pycharm选择File点击NewProject然后选择virtualenv创建一个纯净环境 2. 打开下载的目录将venv文件夹下的所有文件(纯净的环境 ...
- vue-route(三)后台管理路由配置
在一个后台管理的项目中,关于路由的配置, 我们需要实现的一个布局是header,aside,main三部分,后期还可能添加footer部分,实现的需求是请求数据时,局部的刷新,这个时候我们就需 ...
- Spring Cloud架构教程 (四)服务网关(路由配置)
传统路由配置 所谓的传统路由配置方式就是在不依赖于服务发现机制的情况下,通过在配置文件中具体指定每个路由表达式与服务实例的映射关系来实现API网关对外部请求的路由. 没有Eureka和Consul的服 ...
- IP路由__动态路由
1.使用协议来查找网络并更新路由表的配置,就是动态路由.它比使用静态或默认路由方便,但它需要一定的路由器CPU处理时间和网络链接带宽.路由协议定义了路由器与相邻路由器通信时所使用的一组规则. 在互联网 ...
随机推荐
- redis发布订阅、事务、脚本
Redis 发布订阅 Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息. Redis 客户端可以订阅任意数量的频道. 下图展示了频道 cha ...
- (转)Linux vi 命令大全
进入vi的命令 vi filename :打开或新建文件,并将光标置于第一行首 vi +n filename :打开文件,并将光标置于第n行首 vi + filename :打开文件,并将光标置于最后 ...
- cds view 创建和调用
cds view 是一个core data service, 能够将数据库表虚拟化为一个虚拟表(double).因为各个使用sap的公司,使用的数据库数据是不同的,所以提供一个数据库的虚拟. 通过向 ...
- 【UML】NO.55.EBook.8.UML.3.001-【UML和模式应用 第3版】
1.0.0 Summary Tittle:[UML]NO.54.EBook.8.UML.3.001-[UML和模式应用 第3版] Style:DesignPattern Series:DesignPa ...
- repo 获取各个库的tag代码或者分支代码
关于mainfest.xml中的参数格式和说明,可以自己查阅,此处不详细写,我们知道project中的reversion可以指定分支,tag,commitid等,那么如何书写呢? 首先克隆mainfe ...
- Python学习之数组类型一:
Python学习之数组类型一: Numpy中的向量与矩阵: 1.创建: 向量.矩阵均由array函数创建,区别在于向量是v=array( [逗号分隔的元素] ), 矩阵是M=array( [[ ]] ...
- 日志采集器windows客户端的配置释义
<Extension json> Module xm_json </Extension> <Extension charconv> Module xm_charco ...
- java之WebService
链接:https://www.jianshu.com/p/1c145315da47 WebService介绍 首先我们来谈一下为什么需要学习webService这样的一个技术吧.... 问题一 如果我 ...
- EasyUI出现多条边框重合的问题
比如在 下面使用一个datagrid表格,可能出现某几条边框重合的问题,这种情况需要在div一层的panel添加"border:false"属性,datagrid不做处理即可
- vue全局使用axios插件请求ajax
vue全局使用axios插件请求ajax Vue 原本有一个官方推荐的 ajax 插件 vue-resource,但是自从 Vue 更新到 2.0 之后,官方宣布停止更新vue-resource,并推 ...