Vue.js的一大特点就是构建单页面应用十分方便,既然要方便构建单页面应用那么天然少不了路由,vue-router就是vue官方提供的一个路由框架。整体来讲,vue-router设计得简单好用,下面就来聊聊我实际用到过的一些方法,文章没有提到的能够去查看官方文档。vue-router的安装这里就不提了,相信会来看这篇博客同窗,这些基本能力都是有的。javascript
<!-- html部分,省略head --> <div id="app"> <div class="content"> <router-link to="/goods">商品</router-link> <router-link to="/ratings">评论</router-link> <router-link to="/seller">商家</router-link> </div> <router-view></router-view> </div> <script src="path-to-vue"></script> <script src="path-to-vue-router"></script>
// 首先定义或者引入路由的组件 // 方法一:直接定义路由组件 const goods = { template: '<p>goods</p>' }; const ratings = { template: '<p>ratings</p>' }; const seller = { template: '<p>seller</p>' }; // 方法二:import引入路由组件 import goods from 'components/goods/goods'; import ratings from 'components/ratings/ratings'; import seller from 'components/seller/seller'; // 而后定义路由(routes),components还能够是Vue.extend()建立的 const routes = [ { path: '/goods', component: goods }, { path: '/ratings', component: ratings }, { path: '/seller', component: seller } ]; // 接着建立路由实例 const router = new VueRouter({ // ES6缩写语法,至关于routes:routes routes }); // 最后建立vue实例并挂载 const app = new Vue({ el: '#app', router }); // 或者 const app = new Vue({ router }).$mount('#app')
到这里就能够用vue-router轻松搭建一个单页面应用了。我通常都是使用模块化编程的形式,用.vue单文件,不知道在模块化编程里怎么加载vue-router的能够参考个人某个项目源码。html
看了上面的例子,必定对router-link和router-view很感兴趣。vue
从上面例子中的书写形式就能够看出,router-link是一个组件,它默认会被渲染成一个带有连接的a标签,经过to属性指定连接地址。
注意:被选中的router-link将自动添加一个class属性值.router-link-active
。java
这是一个必须设置的属性,不然路由没法生效。它表示路由的连接,能够是一个字符串也能够是一个描述目标位置的对象。git
<router-link to="goods"></router-link> <router-link to="{path='goods'}"></router-link>
一个布尔类型,默认为false。若是replace设置为true,那么导航不会留下history记录,点击浏览器回退按钮不会再回到这个路由。github
<router-link to="goods" replace></router-link>
router-link默认渲染成a标签,也有方法让它渲染成其余标签,tag属性就用来设置router-link渲染成什么标签的。vue-router
<!-- 渲染成li标签 --> <router-link to="goods" tag="li"></router-link>
上面说了被选中的router-link将自动添加一个class属性值.router-link-active
,这个属性就是来修改这个class值的。编程
这个组件十分关键,它就是用来渲染匹配到的路由的。
能够给router-view组件设置transition过渡,具体用法见Vue2.0 Transition常见用法全解惑。
还能够配合<keep-alive>
使用,keep-alive能够缓存数据,这样不至于从新渲染路由组件的时候,以前那个路由组件的数据被清除了。好比对当前的路由组件a进行了一些DOM操做以后,点击进入另外一个路由组件b,再回到路由组件a的时候以前的DOM操做还保存在,若是不加keep-alive再回到路由组件a时,以前的DOM操做就没有了,得从新进行。若是你的应用里有一个购物车组件,就须要用到keep-alive。浏览器
<transition> <keep-alive> <router-view></router-view> </keep-alive> </transition>
多页面应用咱们能够给每个页面都设置一个不一样的标题,可是若是是单页面应用的路由呢?其实也是能够实现的,实现的方法不止一种,我以前用的是结合命名路由和导航钩子函数的方法。以下:缓存
// 定义路由的时候以下定义,name也可为中文 const routes = [ { path: '/goods', component: goods, name: 'goods' }, { path: '/ratings', component: ratings, name: 'ratings' }, { path: '/seller', component: seller, name: 'seller' } ]; // 建立路由实例 const router = new VueRouter({ routes: routes }) // 关键在这里,设置afterEach钩子函数 router.afterEach((to, from, next) => { document.title = to.name; })
既然用到了命名路由,这里就提一下吧。命名路由就是用一个名称来标识一个路由,在定义路由的时候设置一个name属性便可。在router-link中也能够用路由的名字来连接到一个路由。
<router-link :to="{ name: 'seller'}">seller</router-link>
这个我还没怎么用过,它主要是用来拦截导航的,想使用的参考官方文档吧。
刚进入应用都是进入到“/”这个路由的,若是想直接进入到“/goods”怎么办,这里提供两种方法。一种是利用重定向,另外一种是利用vue-router的导航式编程。
const routes = [ { path: '/', redirect: '/goods'} ]
是否是很简单呢?重定向的目标也能够是一个命名的路由。
const routes = [ { path: '/', redirect: { name: 'goods' }} ]
利用vue-router的导航式编程的router.push方法也能够实现上面的需求。
// 在建立vue实例并挂载后调用 router.push('/goods')
router.push方法就是用来动态导航到不一样的连接的。它会向history栈添加一个新的记录,点击<router-link :to="...">
等同于调用router.push(...)。
vue-router中还有router.replace方法和router.go方法,概念及用法可参考https://router.vuejs.org/zh-cn/essentials/navigation.html。