想学习Vue的SPA应用,路由这一块是必不可少的。相信不少和我同样刚接触前端的朋友对于路由这玩意是很困惑的。因此在我学习并成功使用了vue-router后,将个人我的经验分享出来,但愿可让一样对路由不知所措的同窗有所帮助。html
本文demo的项目结构用的是最新的命令行工具建立的webpack项目模板;前端
本文知识点是基于Vue2.0和vue-route 2的,更多内容请参考Vue.js官网和vue-router 2官方文档:vue
可使用npm直接安装插件webpack
npm install vue-router --save
执行命令完成vue-router的安装,并在package.json中添加了vue-router的依赖。当咱们在其余电脑上安装项目时只须要执行npm install
便可完成安装。(感谢 @waynezheng、@昊哥哥 指出的关于dependency的问题,已更正^-^。)ios
package.jsongit
"dependencies": { ... "vue-router": "^2.1.1" ... },
若是是要安装在开发环境下,则使用如下命令行:github
npm install vue-router --save-dev
package.jsonweb
"devDependencies": { ... "vue-router": "^2.1.1", ... },
下面让咱们来配置路由并实现咱们的第一次页面跳转。
官方提供的demo很简单,复制到HTML中也的确能跑,可是问题是不知道如何在SPA应用中使用,这坑了我很多时间。在看了很多他人的项目后,完成了SPA路由的简单实现demo(基于vue-cli的webpack模板)。
main.jsvue-router
import Vue from 'vue' import App from './App' import VueRouter from 'vue-router' import Page01 from './components/page01' import Page02 from './components/page02' Vue.use(VueRouter)//全局安装路由功能 //定义路径 const routes = [ { path: '/', component: Page01 }, { path: '/02', component: Page02 }, ] //建立路由对象 const router = new VueRouter({ routes }) new Vue({ el: '#app', template: '<App/>', components: { App }, router })
App.vuevuex
<template> <div id="app"> <router-link to="/">01</router-link> <router-link to="/02">02</router-link> <br/> <router-view></router-view> </div> </template>
page01.vue
<template> <div> <h1>page02</h1> </div> </template>
page02.vue
<template> <div> <h1>page02</h1> </div> </template>
代码很简单,具体能够看下DEMO
实现步骤:
npm
安装vue-router
Vue.use(VueRouter)
全局安装路由功能
定义路径数组routes
并建立路由对象router
将路由注入到Vue对象中
在根组件中使用<router-link>
定义跳转路径
在根组件中使用<router-view>
来渲染组件
建立子组件
router-link
标签用于页面的跳转,简单用法如上demo
<router-link to="/page01">page01</router-link>
点击这个router-link
标签router-view
就会渲染路径为/page01
的页面。
注意:router-link
默认是一个a标签的形式,若是须要显示不一样的样子,能够在router-link
标签中写入不一样标签元素,以下显示为button
按钮。
<router-link to="/04"> <button>to04</button> </router-link>
下面咱们经过JS代码控制路由的界面渲染,官方是写法以下:
// 字符串 router.push('home') // 对象 router.push({ path: 'home' }) // 命名的路由 router.push({ name: 'user', params: { userId: 123 }}) // 带查询参数,变成 /register?plan=private router.push({ path: 'register', query: { plan: 'private' }})
那么问题来了,若是是全局注册的路由Vue.use(VueRouter)
,应该怎么写呢?
// 字符串 this.$router.push('home') // 对象 this.$router.push({ path: 'home' }) // 命名的路由 this.$router.push({ name: 'user', params: { userId: 123 }}) // 带查询参数,变成 /register?plan=private this.$router.push({ path: 'register', query: { plan: 'private' }})
push方法其实和<router-link :to="...">
是等同的。
注意:push方法的跳转会向 history 栈添加一个新的记录,当咱们点击浏览器的返回按钮时能够看到以前的页面。
push方法会向 history 栈添加一个新的记录,而replace方法是替换当前的页面,不会向 history 栈添加一个新的记录。用法以下
template
<router-link to="/05" replace>05</router-link>
script
this.$router.replace({ path: '/05' })
go方法用于控制history记录的前进和后退
// 在浏览器记录中前进一步,等同于 history.forward() this.$router.go(1) // 后退一步记录,等同于 history.back() this.$router.go(-1) // 前进 3 步记录router.go(3) // 若是 history 记录不够用,那就默默地失败呗 this.$router.go(-100) this.$router.go(100)
其实很好理解:go方法就是浏览器上的前进后退按钮,后面的参数就是前进和后退的次数
在路由跳转的过程当中会传递一个object,咱们能够经过watch
方法查看路由信息对象。
watch: { '$route' (to, from) { console.log(to); console.log(from); }, },
console中看到的路由信息对象
{ ... params: { id: '123' }, query: { name: 'jack' }, ... }
这两个参数会在页面跳转后写在路径中,路径至关于/page/123?name=jack
其实这个params我仍是有一些疑惑的,就好比下面的写法:
<router-link :to="{ path: '/05', params: { sex: 'hello param', sex2: 'hello param2' }, query: { name: 'hello query', name2: 'hello query2' }}">05</router-link>
传递过去的数据却没有包含params的数据。
{ ... params: {}, query: { name: 'hello query', name2: 'hello query2' } ... }
下面是我暂时调试成功的一些结论。
在路由配置文件中定义参数
//命名路由&路由传参 { name: 'com03', path: '/03/:sex', component: Page03 },
路径后面的/:sex
就是咱们要传递的参数。
this.$router.push({ path: '/03/441'})
此时路由跳转的路径
http://localhost:8080/#/03/441
此时咱们看到查看路由信息对象:
{ ... params: { sex: '441' } ... }
template
<h2> {{ $route.params.sex }} </h2>
script
console.log(this.$route.params.sex)
注:暂时我只发如今动态路由匹配中传入数据能够获取到params。而使用{ path: '/', params: { sex: '123' }, query: { ...}}
传递的数据使用没有传递给下一个页面组件。若是有使用成功的同窗欢迎在留言,我会及时更正的。
query传递数据的方式就是URL常见的查询参数,如/foo?user=1&name=2&age=3
。很好理解,下面就简单写一下用法以及结果
template
<router-link :to="{ path: '/05', query: { name: 'query', type: 'object' }}" replace>05</router-link>
script
this.$router.replace({ path: '/05', query: { name: 'query', type: 'object' }})
路径结果
http://localhost:8080/#/05?name=query&type=object
路由信息对象
{ ... query: { name: "query", type: "object" } ... }
获取数据和params是同样的。
template
<h2> {{ $route.query.name }} </h2>
script
console.log(this.$route.query.type)
做者最近正在恶补Vue的各类知识,但愿可以系统的掌握Vue的开发知识。有兴趣的同窗能够查看以前发布的文章:
Vue.js学习系列一 —— vue-router2学习实践笔记(附DEMO)
Vue.js学习系列二 —— vuex学习实践笔记(附DEMO)
Vue.js学习系列三——axios和网络传输相关知识的学习实践
Vue.js学习系列四——Webpack打包工具的使用
Vue.js学习系列五 —— 从VUE-CLI来聊聊ESLint
本文源码已收入到GitHub中,以供参考,固然能留下一个star更好啦^-^。
https://github.com/violetjack...
VioletJack,移动、前端工程师,两年移动端工做经验、一年前端工做经验。现专一于移动前端的学习和开发。擅长Android开发和Vue前端开发。会按期产出关于Android、Vue、移动前端相关的博文。欢迎你们关注我,我会用心维护和经营好博客,多产出高质量文章。同时也但愿我所写的东西能够帮到有须要的朋友。
新浪微博: http://weibo.com/u/2640909603
掘金:https://gold.xitu.io/user/571...
CSDN: http://blog.csdn.net/violetja...
简书: http://www.jianshu.com/users/...
Github: https://github.com/violetjack