起步
- HTML
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
<div id="app">
<h1>Hello App!</h1>
<p>
<!-- 运用 router-link 组件来导航. -->
<!-- 经由过程传入 `to` 属性指定链接. -->
<!-- <router-link> 默许会被衬着成一个 `<a>` 标签 -->
<router-link to="/foo">Go to Foo</router-link>
<router-link to="/bar">Go to Bar</router-link>
</p>
<!-- 路由出口 -->
<!-- 路由婚配到的组件将衬着在这里 n内置组件-->
<router-view></router-view>
</div>
- JavaScript
// 0. 假如运用模块化机制编程,导入Vue和VueRouter,要挪用 Vue.use(VueRouter)
// 1. 定义 (路由) 组件。
// 能够从其他文件 import 进来
const Foo = { template: '<div>foo</div>' }
const Bar = { template: '<div>bar</div>' }
// 2. 定义路由
// 每一个路由应当映照一个组件。 个中"component" 能够是
// 经由过程 Vue.extend() 建立的组件组织器,
// 或许,只是一个组件设置对象。
// 我们晚点再议论嵌套路由。
const routes = [
{ path: '/foo', component: Foo },
{ path: '/bar', component: Bar }
]
// 3. 建立 router 实例,然后传 `routes` 设置
// 你还能够传别的设置参数, 不过先这么简朴着吧。
const router = new VueRouter({
routes // (缩写) 相当于 routes: routes
})
// 4. 建立和挂载根实例。
// 记得要经由过程 router 设置参数注入路由,
// 从而让全部运用都有路由功用
const app = new Vue({
router
}).$mount('#app')
// 如今,运用已启动了!
经由过程注入路由器,我们能够在任何组件内经由过程 this.$router 接见路由器,也能够经由过程 this.$route 接见当前路由:
export default {
computed: {
username () {
// 我们很快就会看到 `params` 是什么
return this.$route.params.username
}
},
methods: {
goBack () {
window.history.length > 1
? this.$router.go(-1)
: this.$router.push('/')
}
}
}
routes 选项 (Array)
redirect(重定向 )
//此时接见/a会跳转到/b
const router = new VueRouter({
routes: [
{ path: '/a', redirect: '/b' }
]
})
//重定向的目的也能够是一个定名的路由:
const router = new VueRouter({
routes: [
{ path: '/a', redirect: { name: 'foo' }}
]
})
//以至是一个要领,动态返回重定向目的:
const router = new VueRouter({
routes: [
{ path: '/a', redirect: to => {
// 要领吸收 目的路由 作为参数
// return 重定向的 字符串途径/途径对象
}}
]
})
定名路由
export default [
{
path:'/',
redirect:'/app' //默许跳转路由
},
{
path: '/app',
//路由定名,可用于跳转
name: 'app',
}
]
//可用于跳转
<router-link :to="{name:'app'}">app</router-link>
路由元信息
定义路由的时刻能够设置 meta 字段:
export default [
{
path:'/',
redirect:'/app' //默许跳转路由
},
{
path: '/app',
//**相当于HTML的meta标签**
meta: {
title: 'this is app',
description: 'asdasd'
},
}
]
嵌套路由
export default [
{
path:'/',
redirect:'/app' //默许跳转路由
},
{
path: '/app',
//子路由 婚配 /app/test
children: [
{
path: 'test',
component: Login
}
]
}
]
路由组件传参
export default [
{
path:'/',
redirect:'/app' //默许跳转路由
},
{
path: '/app/:id', // /app/xxx ,组件内部能够经由过程$route.params.id拿到这个值
// 会把:背面的参数经由过程props传递给组件Todozhong 中
//布尔形式
props: true,
//对象形式
props:{id:456}
//函数形式
props: (route) => ({ id: route.query.b }),
component: Todo,
}
]
mode选项(string)
vue-router 默许 hash 形式 —— 运用 URL 的 hash 来模仿一个完整的 URL,因而当 URL 转变时,页面不会从新加载。
假如不想要很丑的 hash,我们能够用路由的 history 形式,这类形式充分利用 history.pushState API 来完成 URL 跳转而无须从新加载页面。
const router = new VueRouter({
mode: 'history',
routes: [...]
})
这类形式要玩好,还须要背景设置支撑。
base(string)
运用的基途径。比方,假如全部单页运用服务在 /app/ 下,然后 base 就应当设为 “/app/”
return new Router({
routes,
mode: 'history',//默许运用hash#
base: '/base/', //在path前面都邑加上/base/,基途径
})
linkActiveClass(string)
默许值: “router-link-active”
全局设置 <router-link> 的默许“激活 class 类名”。
return new Router({
routes,
mode: 'history',//默许运用hash#
base: '/base/', //在path前面都邑加上/base/,基途径
// 点击calss名字
linkActiveClass: 'active-link', //婚配到个中一个子集
linkExactActiveClass: 'exact-active-link',//完整婚配
})
linkExactActiveClass(string)
默许值: “router-link-exact-active”
全局设置 <router-link> 准确激活的默许的 class。
scrollBehavior(Function)
路由跳转后是不是转动
export default () => {
return new Router({
routes,
mode: 'history',//默许运用hash#
base: '/base/', //在path前面都邑加上/base/,基途径
//页面跳转是不是须要转动
/*
to:去处路由,完整路由对象
from:泉源路由
savedPosition:保留的转动位置
*/
scrollBehavior (to, from, savedPosition) {
if (savedPosition) {
return savedPosition
} else {
return { x: 0, y: 0 }
}
},
})
}
parseQuery / stringifyQuery (Function)
/每次import都邑建立一个router,防止每次都是同一个router
export default () => {
return new Router({
routes,
mode: 'history',//默许运用hash#
base: '/base/', //在path前面都邑加上/base/,基途径
// 路由背面的参数?a=2&b=3,string->object
parseQuery (query) {
},
//object->string
stringifyQuery (obj) {
}
})
}
fallback(boolean)
当浏览器不支撑 history.pushState 掌握路由是不是应当回退到 hash 形式。默许值为 true。
假如设置为false,则跳转后革新页面,相当于多页运用
<router-link>
过渡动效
<router-view> 是基础的动态组件,所以我们能够用 <transition> 组件给它增加一些过渡结果:
<transition>
<router-view></router-view>
</transition>
高等用法
定名视图
<router-view class="view one"></router-view>
<router-view class="view two" name="a"></router-view>
<router-view class="view three" name="b"></router-view>
const router = new VueRouter({
routes: [
{
path: '/',
components: {
//默许组件
default: Foo,
//定名组件
a: Bar,
b: Baz
}
}
]
})
导航守御
- 全局守御
import Vue from 'vue'
import VueRouter from 'vue-router'
import App from './app.vue'
import './assets/styles/global.styl'
// const root = document.createElement('div')
// document.body.appendChild(root)
import createRouter from './config/router'
Vue.use(VueRouter)
const router = createRouter()
// 全局导航守御(钩子)
// 考证一些用户是不是登录
router.beforeEach((to, from, next) => {
console.log('before each invoked')
next()
// if (to.fullPath === '/app') {
// next({ path: '/login' })
// console.log('to.fullPath :'+to.fullPath )
// } else {
// next()
// }
})
router.beforeResolve((to, from, next) => {
console.log('before resolve invoked')
next()
})
// 每次跳转后触发
router.afterEach((to, from) => {
console.log('after each invoked')
})
new Vue({
router,
render: (h) => h(App)
}).$mount("#root")
- 路由独享的守御
能够在路由设置上直接定义 beforeEnter 守御:
export default [
{
path:'/',
redirect:'/app' //默许跳转路由
},
{
path: '/app',
// 路由独享的守御钩子
beforeEnter(to, from, next) {
console.log('app route before enter')
next()
}
component: Todo,
}
]
- 组件内的守御
export default {
//进来之前
beforeRouteEnter(to, from, next) {
// 不!能!猎取组件实例 `this`
// 由于当守御实行前,组件实例还没被建立
console.log("todo before enter", this); //todo before enter undefined
//能够经由过程传一个回调给 next来接见组件实例。在导航被确认的时刻实行回调,而且把组件实例作为回调要领的参数。
next(vm => {
// 经由过程 `vm` 接见组件实例
console.log("after enter vm.id is ", vm.id);
});
},
//更新的时刻
beforeRouteUpdate(to, from, next) {
console.log("todo update enter");
next();
},
// 路由脱离
beforeRouteLeave(to, from, next) {
console.log("todo leave enter");
const answer = window.confirm('Do you really want to leave? you have unsaved changes!')
if (answer) {
next()
} else {
//以经由过程 next(false) 来作废。
next(false)
}
},
props:['id'],
components: {
Item,
Tabs
},
mounted() {
console.log(this.id)
},
};
路由懒加载
参考:路由懒加载