运行时依赖vue-router
把原作者文档放在这里,除了该文档以外的内容,均属于作者自己理解,如有错误敬请指正。 嵌套路由 | Vue Router (vuejs.org)
引入:
#1.创建文件时进行选择
#2.ui界面在运行时依赖中搜索vue-router添加
#3.npm install vue-router
随后在vue的main.js文件中引入:
import router from './router'
new Vue({
router,
render: h => h(App)
}).$mount('#app')
src/router/index.js
import Vue from 'vue'
import VueRouter from 'vue-router'
import Home from '../views/Home.vue'
Vue.use(VueRouter)
const routes = [
{
path: '/',
name: 'Home',
component: Home
},
{
path: '/about',
name: 'About',
component: () => import( '../views/About.vue')
}
]
const router = new VueRouter({
mode: 'history',
base: process.env.BASE_URL,
routes
})
export default router
路由跳转
在App.vue中实现简单的路由跳转:
<template>
<div id="app">
<div id="nav">
<router-link to="/">Home</router-link> |
<!-- 不建议使用 -->
<a href="/about">About</a> |
<router-link to="/me">我的</router-link>
</div>
<!-- 在此处显示路由信息 -->
<router-view/>
</div>
</template>
在组件开发中,我们常常把组件信息放入component,把页面放入view
方法的方式:
goto: function () {
this.$router.push({
path: '/'
})
}
路由嵌套
有时候我们需要用到嵌套路由,也就是子路由的形式比如user路由下可能由用户信息增加,用户信息查找,用户信息编辑等组成。
此时访问/me是Me组件,访问/me/weather是Weather组件
{
path: '/me',
name: 'Me',
component: Me,
children: [
{
path: 'weather',
name: 'Weather',
component: Weather
}
]
}
动态路由
我们需要在一个路由中,想要通过传入数据的不同来显示不同的信息,也就是动态路由。想要做到其实很简单,
我们需要在路径加入动态参数
{
path: '/me',
name: 'Me',
alias: '/my',
props: true,
component: Me,
children: [
{
path: 'weather/:city',
name: 'Weather',
props: true,
component: Weather
}
]
}
如上述代码,:city便是一个动态参数,我们可以通过/me/weather/cityname来实现动态路由,它的值被存放在
this.city = this.$route.params.city
路由传参
在动态路由中,我们看到接受传参其实是一个很麻烦的事情,$route会使之与其对应路由形成高度耦合
我们在学组件传值时用到了props,此时我们也想那么做:
{
path: '/about/:id',
name: 'About',
props: true,
}
此时我们传递的参数会在about组件的props属性中
export default {
props: ['id']
}
利用对象的方式传递参数:
代表该对象可以传值到props,其实就是个静态传参
props: { obj: '张三' },
接收:
export default {
props: ['obj'],
mounted(){
console.log(this.obj)
}
}
利用函数的方式传递参数:
{
path: '/about/:obj',
name: 'About',
props: true,
props: (route) => ({
params: route.params,
query: route.query
}),
},
接收:
export default {
props: ['params', 'query']
}
编程式路由导航
其实就是通过js代码实现路由跳转和信息传递。
gotopage () {
},
replacepage () {
this.$router.replace({ name: 'Weather', params: { city: '深圳' }, query: { plan: 'now' } })
},
gotopre () {
this.$router.go(1)
},
gotonext () {
this.$router.go(-1)
}
路由命名
其实路由命名这个我们已经见过了,此处主要是说一下作用:
{
path: '/',
name: 'Home',
components: {
nav: navView,
default: Home
}
}
在进行跳转的时候可以通过名称:
<router-link :to="{ name: 'user'}">User</router-link>
视图命名
有时候同级需要展示多个视图时使用
<router-view name="nav"></router-view>//指定名称
<router-view/>//默认视图
js
{
path: '/',
name: 'Home',
components: {
nav: navView,
default: Home
}
}
重定向
打个比方访问/a,实际访问的是/b,显示的也是/b
{
path: '/ws',
redirect: '/about'
},
{
path: '/wc',
redirect: (to) => {
if (to.path === '/wc') {
return '/about'
}
}
},
别名
访问/a,实则访问/b,但是显示/a
{
path: '/me',
name: 'Me',
alias: '/my',
props: true,
component: Me,
}
上述例子,访问/me和/my是一样的。
导肮守卫
跳转前
router.beforeEach((to,from,next)=>{
if(to.path === '/') {
next()
} else {
next('/')
}
})
跳转后
用于信息记录
router.afterEach((to,from,next)=>{
})
有时候我们的有些路由需要这个操作,大部分页面是游客也可以访问的,一部分路由独享守卫就可以通过:
{
path: '/',
name: 'Home',
components: {
nav: navView,
default: Home
},
beforeEnter:(to,from,next)=>{
console.log(1);
}
},
组件内进行操作
export default {
beforeRouteEnter(to, from, next) {
console.log('进入前');
},
beforeRouteUpdate(to, from, next) {
console.log('更新前');
},
beforeRouteLeave(to, from, next) {
console.log('离开前');
}
}
路由元信息
给路由一些信息,比如说想跳转该路由是不是需要登录等等
{
path: '/',
name: 'Home',
components: Home,
meta: { requiredLogin: true }
},
路由跳转时做判断:
router.beforeEach((from,to,next)=>{
let isLogin = true;
if(to.matched.some(record=>record.meta.requiredLogin)){
if (!auth.loggedIn()) {
next({
path: '/login',
query: { redirect: to.fullPath }
})
} else {
next()
}
} else {
next()
}
})
过渡动画
给animate.css打个广告
<transition mode="out-in" name="slider" enter-active-class="animated bounceInRight" leave-active-class="animated bounceOutRight">
<router-view></router-view>
</transition>
动态的
<transition :name="transitionName">
<router-view></router-view>
</transition>
watch: {
'$route' (to, from) {
const toDepth = to.path.split('/').length
const fromDepth = from.path.split('/').length
this.transitionName = toDepth < fromDepth ? 'slide-right' : 'slide-left'
}
}
滚动行为
比如你看到了一百多行,然后弹了个广告,你关掉回到当前页面想要继续看那么:
const router = new VueRouter({
mode: 'history',
base: process.env.BASE_URL,
routes,
scrollBehavior (to, from, savedPosition) {
if(to.path==='/list'){
return savedPosition
}
}
})
路由懒加载
路由其实就相当于一个页面所呈现的一部分了,当我们制作一个单页面应用,如果有很多页面一次性加载当然是不好的,最好的方法是懒加载,即第一次使用时加载
即使用的时候再导入:
{
path: '/list',
name: 'List',
component: ()=>import('@/views/List.vue')
}
同时一些常用页面或者是相关联的页面,我们想要让他们一起加载:
这是我们创建项目的时候带的,
/* webpackChunkName: "about" */ 这句注释就是一起加载的关键,about相当于是他们的组名称
其实原理就是webpack打包的时候一起打包
{
path: '/about/:obj',
name: 'About',
component: () => import( '../views/About.vue')
},
{
path: '/list',
name: 'List',
component: ()=>import( '@/views/List.vue')
}
导航故障
redirected :在导航守卫中调用了 next(newLocation) 重定向到了其他地方。aborted :在导航守卫中调用了 next(false) 中断了本次导航。cancelled :在当前导航还没有完成之前又有了一个新的导航。比如,在等待导航守卫的过程中又调用了 router.push 。duplicated :导航被阻止,因为我们已经在目标位置了。
router.push('/about').catch(failure => {
if (isNavigationFailure(failure, NavigationFailureType.redirected)) {
failure.to.path
failure.from.path
}
})
开发依赖less-loader
|