【原创】一篇学会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处理时间和网络链接带宽.路由协议定义了路由器与相邻路由器通信时所使用的一组规则. 在互联网 ...
随机推荐
- mixpanel umeng talkingdata
市面上可以比较容易的接触到的实时大数据用户行为分析系统有很多,比如国外有著名的Mixpanel.Localytics.Google,国内有TalkingData.这些公司都提供基于云的大数据分析系统, ...
- keepalived实现高可用
准备: 1.A-centos(192.168.6.177) 端口为9898的服务 2.B-ubuntu(192.168.6.182) 端口为9898的服务 3.keepalived安装包https ...
- 【UML】NO.53.EBook.5.UML.1.013-【UML 大战需求分析】- 组合结构图(Composition Structure Diagram)
1.0.0 Summary Tittle:[UML]NO.52.EBook.1.UML.1.012-[UML 大战需求分析]- 交互概览图(Interaction Overview Diagram) ...
- c#之如何操作excel
可使用EPPlus类库,下载地址如下: http://epplus.codeplex.com/ 也可以在这里下载: https://files.cnblogs.com/files/jietian331 ...
- Zuul 网关路由
Zuul 网关路由 路由是微服务架构中不可或缺的一部分,例如:/api/user映射到user服务,/api/shop映射到shop服务. Zuul是一个基于JVM的路由和服务端的负载均衡器.Zuul ...
- SLF4J bindings
see: https://www.slf4j.org/manual.html
- C++ STL 顺序容器--list + 关联容器
list 双向链表,可以双向遍历,既指向前驱节点,又指向后继但不能随机访问任意元素,可动态增加或者减少元素,内存管理自动完成,增加任何元素都不会使迭代器失效, 删除元素时,除了指向当前被删元素的迭代器 ...
- mysql获取随机字符串和随机数的方法
在我们开发的过程中,我们可能会需要在表中随机生成一些数据以供我们进行相应的测试. 就像我之前发的“mysql创建存储过程向数据表中加入规定条数的数据” 那么我们应该怎样生成随机的字符串和随机数字呢? ...
- 6、Spring-Kafka4
4.1. Using Spring for Apache Kafka This section offers detailed explanations of the various concerns ...
- Linux 系统安全设置
一.SElinux安全子系统策略. 临时修改 命令:setenforce 0 #临时关闭selinux. 命令:setenforce 1 #临时开启selinux 命令:getenforce ...