Vue开发之基础路由

1.router-link和router-view组件

src/App.vie文件内容:

<template><div id="app"><div id="nav"><router-link to="/">Home</router-link> |<router-link to="/about">About</router-link></div><router-view/></div>
</template>

App.vue文件代码里有2个router-link组件和1个router-view组件

router-link组件实际上是封装了一个a标签,里面有一个重要的to属性,to属性指定的值是一个路径
router-link标签中有内容渲染,所以router-link标签有开标签和闭标签
router-view组件是视图渲染组件,通过router-link的to属性加载的组件都会在router-view里被渲染
router-view标签中没有内容渲染,所以router-view标签可以写成 <router-view/> 单标签的形式,这与  <router-view></router-view> 效果相同

router-link的to属性指定的路径就是src/router/router.js文件中定义的路由

import Home from '@/views/Home.vue'         // 引入Home.vue文件并设置引入名称为Home,@标签是在vue.config.js文件中定义的src路径的别名export default [                // 路由列表是一个数组,在这个数组中定义了路由对象
{                               // 一个基本的路由对象包含path和component这两个属性path: '/',              // path属性是在浏览器中输入的跳转路径component: Home,        // component属性是指定要加载渲染的组件名称}, {path: '/about',// 这里定义的是懒加载路由,即只有当访问这个路由时,才会加载 src/views/About.vue这个组件component: () => import('@/views/About.vue'),       }
]

2.路由配置

2.1 动态路由

src/router/router.js中新建一个路由对象

import Home from '@/views/Home.vue'export default [{path: '/',component: Home,}, {path: '/about',component: () => import('@/views/About.vue'),},{path:'/argu/:name',     // 动态路由component:() => import('@/views/argu.vue')}
]

src/views目录中创建argu.vue文件

argu.vue文件内容如下

<template><div>{{ $route.params.name }}</div>
</template><script>
export default {}
</script>

在浏览器中输入URL: http://localhost:8080/#/argu/apple,页面上会渲染URL中对应的参数

同样的,当URL改成:http://localhost:8080/#/argu/orange时,页面上渲染的结果也相应改变了

在上面的例子里,$route代表的是当前加载页面的路由对象$route.params代表当前加载页面中的参数对象

所以$route.params.name表示的就是当前加载页面的参数对象中的name对应位置上的的值

不管浏览器的URL中输入的是name值是什么,$route.params.name都会被匹配到

这样就可以起到组件复用,只需要传递不同的参数,同一个页面就可以呈现不同的结果

2.2 嵌套路由

在实际开发中,经常会用到多层嵌套的组件,多层嵌套组件可以通过嵌套路由来完成

修改src/router/router.js文件,新建嵌套路由

import Home from '@/views/Home.vue'export default [{path: '/',component: Home,}, {path: '/about',component: () => import('@/views/About.vue'),},{path:'/argu/:name',component:() => import('@/views/argu.vue')},{path:'/parent',         // 嵌套路由component:() => import('@/views/parent.vue'),children:[{path:'child',component:() => import('@/views/child.vue')}]}
]

然后在src/views目录下新建parent.vue文件和child.vue文件

parent.vue文件内容如下

<template><div>I am parent page<router-view/></div>
</template><script>
export default {}
</script>

child.vue文件内容如下

<template><div>I am child page</div>
</template><script>
export default {}
</script>

浏览器打开URL:http://localhost:8080/#/parent/child,渲染结果如下

2.3 命名路由

修改src/router/router.js文件,为路由命名

import Home from '@/views/Home.vue'export default [{path: '/',name: 'home',           // 命名路由component: Home,}, {path: '/about',name: 'about',          // 命名路由component: () => import('@/views/About.vue'),},{path:'/argu/:name',component:() => import('@/views/argu.vue')},{path:'/parent',component:() => import('@/views/parent.vue'),children:[{path:'child',component:() => import('@/views/child.vue')}]}
]

修改App.vue文件,在router-link标签中使用name来绑定路由名

<template><div id="app"><div id="nav"><router-link v-bind:to="{ name:'home'}">Home</router-link> |<router-link :to="{ name:'about'}">About</router-link></div><router-view/></div>
</template><style>
#app {font-family: 'Avenir', Helvetica, Arial, sans-serif;-webkit-font-smoothing: antialiased;-moz-osx-font-smoothing: grayscale;text-align: center;color: #2c3e50;
}
#nav {padding: 30px;
}#nav a {font-weight: bold;color: #2c3e50;
}#nav a.router-link-exact-active {color: #42b983;
}
</style>

v-bind:to 方法可以简写成: :to

使用浏览器访问URL:http://localhost:8080/#/,在页面上点击Home和About标签,可以正常的渲染

2.4 命名视图

如果想在同一个页面上显示多个视图,并分别对不同的视图进行布局时,可以在div标签中定义多个router-view标签,并为每个router-view标签定义名字,这就是命名视图

修改src/App.vue文件,添加两个命名视图view1和view2

<template><div id="app"><div id="nav"><router-link v-bind:to="{ name:'home'}">Home</router-link> |<router-link :to="{ name:'about'}">About</router-link></div><router-view/><router-view name="view1"/>    // 添加router-view标签,并把名字定义为view1<router-view name="view2"/>    // 添加router-view标签,并把名字定义为view2</div>
</template><style>
#app {font-family: 'Avenir', Helvetica, Arial, sans-serif;-webkit-font-smoothing: antialiased;-moz-osx-font-smoothing: grayscale;text-align: center;color: #2c3e50;
}
#nav {padding: 30px;
}#nav a {font-weight: bold;color: #2c3e50;
}#nav a.router-link-exact-active {color: #42b983;
}
</style>

然后修改src/router/router.js文件,在新添加的路由中添加两个命名视图

import Home from '@/views/Home.vue'export default [{path: '/',name: 'home',component: Home,}, {path: '/about',name: 'about',component: () => import('@/views/About.vue'),},{path:'/argu/:name',component:() => import('@/views/argu.vue')},{path:'/parent',component:() => import('@/views/parent.vue'),children:[{path:'child',component:() => import('@/views/child.vue')}]},{path:'/named_view',     // 命名视图components:{// default会默认加载App.vue中没有命名的视图default: () => import('@/views/child.vue'),view1: () => import('@/views/view1.vue'),view2: () => import('@/views/view2.vue'),}}
]

然后在src/views目录下添加view1.vue和view2.vue文件

view1.vue文件内容为

<template><div>I am view1</div>
</template>

view2.vue文件内容为

<template><div>I am view2</div>
</template>

在浏览器中打开URL;http://localhost:8080/#/named_view

在浏览器中安装 Vue Devtool插件,可以看到页面上渲染了3个router-view组件

2.5 重定向路由

重定向路由的作用是把当前要访问的URL重定向到另一个URL

修改src/router/router.js文件,添加重定向路由

import Home from '@/views/Home.vue'export default [{path: '/',name: 'home',component: Home,}, {path: '/about',name: 'about',// route level code-splittingcomponent: () => import('@/views/About.vue'),},{path:'/argu/:name',component:() => import('@/views/argu.vue')},{path:'/parent',component:() => import('@/views/parent.vue'),children:[{path:'child',component:() => import('@/views/child.vue')}]},{path:'/about_path',     // 重定向路由redirect:'about'}
]

当使用浏览器访问URL:http://localhost:8080/#/about_path时,就会跳转到路由名为 about的路由上去,即访问了/about路由

在重定向路由中,也可以使用命名路由的方式

即把/about_path修改成使用命名路由的重定向方式

{path: '/about_path',redirect: {name:'about'}
}

在重定向的redirect中,也可以传入一个函数

修改about_path路由

{path: '/about_path',redirect: to => {console.log(to) // 打印出传入的to函数}
}

浏览器打开URL:http://localhost:8080/#/about_path,在调试样中查看打印出的结果

修改about_path路由,在redirect中定义函数体

{path: '/about_path',redirect: to => {return{name:'home'}}
}

刷新浏览器,页面就跳转到home页面了

redirect中定义的to函数也可以返回一个路由路径

{path: '/about_path',redirect: to => {return '/named_view'}
}

此时打开URL:http://localhost:8080/#/about_path,页面就会跳转到/named_view页面中

上面redirect中的函数体可以简写成

{path: '/about_path',redirect: to => '/named_view'
}

2.6 路由别名

路由别名,顾名思义就是为一个路由设置一个别名,设置别名以后即可以通过路由的path的值进行访问,也可以通过别名访问这个路由

修改src/router/router.js文件,为名为"home"的路由设置别名

import Home from '@/views/Home.vue'export default [{path: '/',name: 'home',alias:'/home_page',component: Home,}, {path: '/about',name: 'about',component: () => import('@/views/About.vue'),},{path:'/argu/:name',component:() => import('@/views/argu.vue')},{path:'/parent',component:() => import('@/views/parent.vue'),children:[{path:'child',component:() => import('@/views/child.vue')}]},{path:'/named_view',components:{default: () => import('@/views/child.vue'),view1: () => import('@/views/view1.vue'),view2: () => import('@/views/view2.vue'),}}, {path: '/about_path',redirect: to => '/named_view'}
]

这样不管访问URL:http://localhost:8080/#/,还是URL:http://localhost:8080/#/home_page,都可以访问到指定的视图了

2.7 JS操作路由

JS操作路由就是通过JS控制页面的跳转和返回

首先修改src/views/Home.vue文件,在页面上添加一个button按钮button按钮的值为"返回上一页"button点击事件为"handleClick"

<template><div class="home"><img alt="Vue logo" src="../assets/logo.png"><HelloWorld msg="Welcome to Your Vue.js App"/><button @click="handleClick">返回上一页</button>    // 新添加的button按钮</div>
</template><script>
// @ is an alias to /src
import HelloWorld from '@/components/HelloWorld.vue'export default {name: 'home',components: {HelloWorld},methods:{handleClick () {this.$router.back()}}
}
</script>

浏览器打开URL:http://localhost:8080/#/,点击About标签跳转到about页面

然后再点击Home标签,跳转到home页面

点击"返回上一页"按钮,页面返回到当前页的上一页,即about页面了

返回上一页的JS语句也可以写成:

handleClick () {this.$router.go(-1)
}

或者跳转到指定页面:

handleClick () {this.$router.push({name:'about',})
}

跳转到指定页面的同时需要在URL上添加参数时,可以加query选项

handleClick () {this.$router.push({name:'about',query:{name:'orange',price:'5'}})
}

在home页点击"返回上一页"时,URL会跳转到about页面,并在URL上添加query中定义的参数

跳转到前面定义的/argu这个路由

先在src/router/router.js文件中,为/argu这个路由添加名字

{path:'/argu/:name',name:'argu',component:() => import('@/views/argu.vue')
}

然后修改src/views/Home.vue文件中的handleClick方法

handleClick () {this.$router.push({name:'argu',params:{name:'orange',}})
}

在home页点击"返回上一页"时,URL会跳转到about页面

上面的方法也可以用ES6的语法重写,也可以达到同样的效果

handleClick () {const name = 'banana'this.$router.push({path:`/argu/${name}`    // 这里的 ` 是键盘上Ese下面的那个键})
}

或者

handleClick () {this.$router.push({name:`argu`,params:{name:'banana'}})
}

在home页点击"返回上一页"时,浏览器页面显示为

posted @ 2019-05-19 19:09 renpingsheng 阅读(...) 评论(...) 编辑 收藏

Vue开发之基础路由相关推荐

  1. vue路由,解决同一路由页面多次触发不刷新页面【vue开发】

    vue路由,解决同一路由页面多次触发不刷新页面[vue开发] vue路由的机制是这样的: 不同的路由vue会刷新并跳转到相应路由,但如果是下一个点击触发的还是当前路由则当前路由页面不会被刷新 要解决的 ...

  2. vue多页面多路由开发环境

    本人根据实际实战项目配置的vue多页面多路由开发环境,同时也支持单页应用开发.不懂的朋友可以留言. 项目代码链接:http://pan.baidu.com/s/1jI9ji2E

  3. Vue开发实例(15)之动态路由

    引言 Vue是现在前端最流行的框架之一,作为前端开发人员应该要熟练的掌握它,如果你是打算学习Vue的开发流程,那么来吧,明哥带你快速上手.带你飞! 即使你并非前端开发人员,对前端的开发流程进行一定的了 ...

  4. Web前端开发技术:Vue开发基础(1)

    一.实验目的: 掌握Vue开发环境的搭建.开发和调试工具的使用以及Vue项目的创建. 掌握Vue实例的创建及数据的绑定.Vue的事件监听操作.Vue组件的注册及组件之间的数据传递的方法以及Vue生命周 ...

  5. 一个后端童鞋步入 vue 深渊引发的惨案: VSCode Vue开发 目录下多个路由访问重叠不生效问题解决

    文章目录 一.再现 二.破局 入乡随俗 横刀立马 三.开局 一.再现 有时候前端为了维护某个模块[如下文的系统管理],习惯上会将开发的代码都维护在该目录下,无论从业务和开发理解角度都是没错的,无奈vu ...

  6. 唐金州的Vue开发实战学习笔记(基础篇)

    Vue开发实战学习笔记 简易的Vue程序 组件 事件 插槽 单文件组件 双向绑定 虚拟DOM与key属性 组件更新 状态data与属性props vue的响应式更新 计算属性和侦听器 计算属性 com ...

  7. Vue开发入门看这篇文章就够了

    摘要: 很多值得了解的细节. 原文:Vue开发看这篇文章就够了 作者:Random Fundebug经授权转载,版权归原作者所有. 介绍 Vue 中文网 Vue github Vue.js 是一套构建 ...

  8. Vue开发规范1.0

    2019独角兽企业重金招聘Python工程师标准>>> VUE开发规范-V1.0 前提条件 开发环境:Node 开发工具:推荐 WebStorm 同步工具:Git 推荐开发插件 es ...

  9. 2019 Vue开发指南:你都需要学点啥?

    出处:葡萄城官网 链接:https://www.cnblogs.com/powertoolsteam/p/11056531.html 原文:https://dzone.com/articles/vue ...

最新文章

  1. C# 利用Newtonsoft.Json将DataTable进行JSON序列化
  2. WPF Binding
  3. promise原理—一步一步实现一个promise
  4. vue3.0 抽奖 小功能
  5. HTML5七夕情人节表白网页 (浪漫森林落叶钢琴紫色3D相册) HTML+CSS+JS 求婚 html生日快乐祝福代码网页 520情人节告白代码 程序员表白源码 3D旋转相册 js烟花代码
  6. L.G.ALEXANDER 访谈录(ZT)
  7. @Secured()、 @PreAuthorize() 、 @RolesAllowed()
  8. 合并Windows系统镜像教程
  9. 以太坊java_Java调用以太坊智能合约
  10. 小红书种草笔记怎么写?种草笔记标题怎么写比较好
  11. 编译原理:算符优先分析实验
  12. 我的Qt作品(1)高仿海康威视MVS主界面
  13. 请每一个恋爱中的人耐心地看下去
  14. 宿舍管理系统的设计与实现/学生宿舍管理系统
  15. 多位数的各位数数字提取方法
  16. book review----Philosophical Issues in Tourism (Aspects of Tourism)
  17. 抓强势股MACD大牛启动通达信指标公式 无未来 不加密
  18. 【MATLAB】数学建模入门方法综述
  19. JS网页更改背景颜色源代码
  20. 含汞废水的深度处理方法

热门文章

  1. 北邮智能车仿真培训(二)—— 搭建仿真模型
  2. go开发中遇到的问题
  3. AUTOCAD——弧长标注命令、半径标注命令
  4. python内存持续增长_Python 进程内存增长解决方案
  5. 线段树 hdu3265 Posters
  6. Spring Cloud 异常“ Caused by: java.net.UnknownHostException: discovery.host ”
  7. vue中的一个子组件如何在父组件中调动另一个子组件中的方法
  8. html是什么排列规律,单数和双数是什么 有什么排列规律
  9. git did not exit cleanly
  10. c语言stl用法,C STL快速入门!学习使我快乐