vue-router学习笔记

配置路由模式

const router=new VueRouter({
   routes
})

hash模式(默认):通过url的hash来模拟一个完整的url,于是当url改变时,页面不会重新加载。
history模式:通过history完成url跳转而不需要重新加载页面。
注意:为了防止404错误,要写个notFound.html来防止页面找不到错误

const router=new VueRouter({
   routes:[
     {path:'*',component:NotFoundComponent}
   ]
})

动态路由匹配
假设当前有路径/data,当你/data/xx,不管xx是什么内容,都需要让他显示某个组件component:A,或者说是路由到某一个页面,就需要使用动态路由配置。
嵌套路由
假如/data下能有两个子路由/data/a和/data/b分别跳转A和B页面,这时就可以使用嵌套路由。
编程式的导航
可以在代码中控制路由,包含了几个跳转函数。
router.push(location) history会有记录
router.replace(location) history不会有记录
router.go(n) 在history记录中向前跳转几页或者向后几页
其中location的值有以下几种类型:
'home'
{path:'home'}
{name:'user',params:{userId:123}} //命名路由,变成/user/123
{path:'register',query:{plan:'private'}} //带查询参数,变成/register?plan=private
重定向和别名

const router=new VueRouter({
  routes:[
    { path:'/a',redirect:'b'}
  ]
}

也可以是命名的路由
const router=new VueRouter({
routes:[

{path:'/a',redirect:{name:'foo'}}

]
})
路由组件传参
使用props将组件和路由解耦:
取代与$route的耦合

const User={
template:'<div>User {{$route.params.id}}</div>'
}
const router=new VueRouter({
  routes:[
     {path:'/user/:id',component:User}
  ]
})

//通过props解耦
const User={
  props:['id'],
  template:'<div>User{{id}}</div>'
}
const router=new VueRouter({
  routes:[
    {path:'/user/id',component:User,props:true},
    {
      path:'/user/:id',
      components:{default:User,sidebar:Sidebar},
      props:{default:false,sidebar:false}
     }
   ]
})

过渡动效
使用<transition>组件添加一些过渡特效

<transition>
  <router-view></router-view>
</transition>

单个路由的过渡
让每个路由组件有各自的过渡效果,解决方法在各路由组件内使用<transition>并设置不同的name。

const Foo={
  template:'
  <transition name="slide">
     <div class="foo">...</div>
  </transition>
'
}
const Bar={
  template:'
    <transition name="fade">
       <div class="bar">...</div>
    </transition>
  '
}

数据获取
分为两种:
(1)导航完成之后获取:先完成导航,然后在接下来的组件生命周期钩子中获取数据,在数据获取期间显示“加载中”。
(2)导航完成之前获取:导航完成前,在路由进入的守卫中获取数据,在数据获取成功后执行导航。

导航完成后获取数据
使用这种方式,马上导航和渲染组件,然后在组件的created钩子中获取数据,可以在数据获取期间展示一个loading状态。
<template>
  <div class="post">
     <div class="loading" v-if="loading">
     Loading...
     </div>
     <div v-if="Error" class="error">
     {{error}}
     </div>
     <div v-if="post" class="content">
       <h2>{{post.title}}</h2>
       <p>{{post.body}}</p>
     </div>
</template>

export default{
  data(){
    return{
      loading:false,
      post:null,
      error:null
    }
  },
  created(){
    //组件创建完后获取数据,此时的数据已经被检测到了
    this.fetchData()
   },
   watch:{
      '$route':'fetchData'
   },
   methods:{
     fetchData(){
       this.error=this.post=null
       this.loading=true
       getPost(this.$route.params.id,(err,post)=>{
         this.loading=false
         if(err){
            this.error=err.loading()
         }else{
           this.post=post
          }
        })
      }
     }
   }

相关推荐