【原创】一篇学会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处理时间和网络链接带宽.路由协议定义了路由器与相邻路由器通信时所使用的一组规则. 在互联网 ...
随机推荐
- 如何在一个电脑上使用两个github账号
问题描述:公司电脑上默认使用的是公司的github账号,如果希望写一些代码放到个人的github账号上,就需要配置让一个电脑上可以使用两个github账号 原理:管理两个SSH key 1.生成两个S ...
- 初学Vue 遇到Module not found:Error:Can`t resolve 'less-loader' 问题
学习vue时,导入一个子组件时遇到Module not found:Error:Can`t resolve 'less-loader' 问题,实际上时在子组件中的样式里加了这么个代码 <styl ...
- BMC ipmitool 对linux服务器进行IPMI管理
IPMI是智能型平台管理接口(Intelligent Platform Management Interface)的缩写,是管理基于 Intel结构的企业系统中所使用的外围设备采用的一种工业标准,该标 ...
- break,continue的区别
break 终止循环, continue 跳出本次循环,进入下一次循环 username = 'Loker'passwd = '123456' for i in range(3): user = in ...
- sql server调优
SQLServer调优:查询语句运行几个指标值监测\ https://www.cnblogs.com/zhijianliutang/p/4179110.html
- Unity之流光效果
效果如图: shader如下: Shader "Unlit/Walk light" { Properties { _MainTex ("Base (RGB), Alpha ...
- word之选中文本
在word和notepad中: 特别是在文件很大,如果用鼠标下滑的话,不知道会滑多久呢, 快捷键+鼠标点击截至处
- [Android] 转-RxJava+MVP+Retrofit+Dagger2+Okhttp大杂烩
原文url: http://blog.iliyun.net/2016/11/20/%E6%A1%86%E6%9E%B6%E5%B0%81%E8%A3%85/ 这几年来android的网络请求技术层出不 ...
- https学习笔记三----OpenSSL生成root CA及签发证书
在https学习笔记二,已经弄清了数字证书的概念,组成和在https连接过程中,客户端是如何验证服务器端的证书的.这一章,主要介绍下如何使用openssl库来创建key file,以及生成root C ...
- ASP.NET页面之间传值的方式之Application(个人整理)
Application Application变量在整个应用程序生命周期中都是有效的,类似于使用全局变量一样,所以可以在不同页面中对它进行存取.它和Session变量的区别在于,前者是所有的用户共用 ...