先来看看效果图:

为了方便讲解,我没有使用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路由配置 、 动态路由 、多层路由(实例)的更多相关文章

  1. Vue结合路由配置递归实现菜单栏

    作者:小土豆biubiubiu 博客园:https://www.cnblogs.com/HouJiao/ 掘金:https://juejin.im/user/58c61b4361ff4b005d9e8 ...

  2. vue路由配置,vue子路由配置

    上一篇关于vue环境配置已经写好了!按照操作就行了! 现在一个项目已经部署完成,接下来我们从路由开始! 还记得在初始化项目的时候,有提示是否需要安装vue-router,对没错,vue中路由全靠它! ...

  3. 路由器基本配置实验,静态路由和动态RIP路由

    实验涉及命令以及知识补充 连线 PC和交换机FastEtherNet接口 交换机和路由器FastEtherNet接口 路由器和路由器Serial接口 serial是串行口,一般用于连接设备,不能连接电 ...

  4. vue 路由配置

    1.不带参数的路由配置 及 跳转 //路由配置: { name: "a", path: "/a", component: a }   页面跳转: this.$r ...

  5. Spring Cloud构建微服务架构:服务网关(路由配置)【Dalston版】

    转载:http://blog.didispace.com/spring-cloud-starter-dalston-6-2/ 原创  2017-08-26  翟永超  Spring Cloud 被围观 ...

  6. 一、虚拟环境.二、路由配置主页与404.三、2.x路由分发.四、伪静态.五、request对象.六、FBV与CBV.七、文件上传.

    一.虚拟环境 ''' 解决版本共存 1. 用pycharm选择File点击NewProject然后选择virtualenv创建一个纯净环境 2. 打开下载的目录将venv文件夹下的所有文件(纯净的环境 ...

  7. vue-route(三)后台管理路由配置

    在一个后台管理的项目中,关于路由的配置,     我们需要实现的一个布局是header,aside,main三部分,后期还可能添加footer部分,实现的需求是请求数据时,局部的刷新,这个时候我们就需 ...

  8. Spring Cloud架构教程 (四)服务网关(路由配置)

    传统路由配置 所谓的传统路由配置方式就是在不依赖于服务发现机制的情况下,通过在配置文件中具体指定每个路由表达式与服务实例的映射关系来实现API网关对外部请求的路由. 没有Eureka和Consul的服 ...

  9. IP路由__动态路由

    1.使用协议来查找网络并更新路由表的配置,就是动态路由.它比使用静态或默认路由方便,但它需要一定的路由器CPU处理时间和网络链接带宽.路由协议定义了路由器与相邻路由器通信时所使用的一组规则. 在互联网 ...

随机推荐

  1. vue 中使用 axios 请求接口,请求会发送两次问题

    在开发项目过程中,发现在使用axios调用接口都会有两个请求,第一个请求时,看不到请求参数,也看不到请求的结果:只有第二次请求时才会有相应的请求参数以及请求结果: 那为甚么会有这么一次额外的请求呢,后 ...

  2. Struts2 学习

    Struts2简介 1.概念:轻量级的MVC框架,主要解决了请求分发的问题,重心在控制层和表现层.低侵入性,与业务代码的耦合度很低.Struts2实现了MVC,并提供了一系列API,采用模式化方式简化 ...

  3. python类型错误:'NoneType' object is not subscriptable

    TypeError: 'NoneType' object is not subscriptable --> 原因:变量使用了系统内置的关键字list 解决:重新定义下这个变量

  4. NLP:Gensim库之word2vec

    Gensim是一款开源的第三方Python工具包,用于从原始的非结构化的文本中,无监督地学习到文本隐层的主题向量表达.它支持包括TF-IDF,LSA,LDA,和word2vec在内的多种主题模型算法, ...

  5. JavaScript 数组插入元素并排序

    1.插入类排序 插入类排序的思想是:在一个已排好序的序列区内,对待排序的无序序列中的记录逐个进行处理,每一步都讲待排序的记录和已排好的序列中的记录进行比较,然后有序的插入到该序列中,直到所有待排序的记 ...

  6. python函数默认参数作用域

    当def函数参数默认值为对象时,例如列表[],字典{} 示例1:猜测一下,会输出什么??? def ddd(a,b=[]): b.append(a) return b print(ddd(1)) pr ...

  7. 前端学习历程--js--原型&闭包

    一.数据类型 1.值类型:undefined, number, string, boolean,不是对象 2.引用类型:函数.数组.对象.null.new Number(10)都是对象 3.引用类型判 ...

  8. Netty返回数据丢包的问题之一

    这个问题是在一个群友做压力测试的时候发现的.使用客户端和netty创建一条连接,然后写了一个for循环不停的给服务器发送1500条信息,发现返回只有几百条.另外几百条不知道哪去了.查看代码,发现在服务 ...

  9. powerdesigner相关记录

    背景 项目逐步开始规范化,表设计直接用designer来,然后生成语句,到oracle数据库,把相关的操作等记录一下, designer版本:15.1 oracle版本:11.2,64位 oracle ...

  10. fpga板制作调试过程记录

    2010-09-11 22:49:00 昨天淘宝准备买块fpga核心板学习,为了练习焊接,我让老板给我散料及pcb板自己焊接. 一,在物料到之前的准备: 我先设计了一下焊接测试计划 1,检查电路板:特 ...