vue路由vue-router

1.同步路由

  a.引入你想跳转的文件 import payment from './app/payment'

  b.在路由里配置你的页面

  const router = new VueRouter({
   routes: [
  {name:'payment',path:'/payment',component: payment} //path里的路径是指你浏览器显示的路径(例如http://localhost:9000/#/payment)
  })
 c.调用你的路由(我的实例代码是写在一个方法里的)
  
payMent(){
   var obj={total:this.totalPrice}

    router.push({
       name:"payment",
     params:obj //如果需要传参时写(这必须传对象,不然界面会获取不到你想要传的值
) 调用传过来的参数 TitleValue: this.$route.params.item.name,
    })
   }
2.异步路由
  使用异步路由不需要引入文件,也就是同步路由中的a步骤不需要,
  a.配置你要跳转的界面路由
    const router = new VueRouter({
      routes: [{name:'payment',path:'/payment',component:(resolve)=>{
  
        require.ensure(['./app/payment'],()=>{

          resolve(require('./app/payment'))
          })
   }},

   ],
  })
3.动态路由的配置
const User = {
  template:'<div>User</div>'  
}

const router = new VueRouter({
   routes:[
      //动态路径参数,以冒号开头
      {path:'/user/:id',component:User}    
    ] 
})
   <router-link to="/user/bar">/user/bar</router-link> 

可以在路由中设置多段路径参数,对应的值会设置到$route.params中

模式 匹配路径 $route.params
/user/:username /user/evan {username:'even'}
/user/:username/post/:post_id /user/evan/post/123 {username:'even',post_id:123}

当两个路由使用同一组件的时候,切换时原来的组件实例会被复用。因为两个路由都渲染同个组件,比起销毁再创建,复用则显得更加高效。不过,这也意味着组件的生命周期钩子不会再被调用。

4.嵌套路由

const router = new VueRouter({
   routes: [
      {path: '/user/:id',component: User,
         children: [
           {
              //当/user/:id/profile匹配成功
              //UserProfile会被渲染在User的<router-view>中
              path:'profile',
              component:UserProfile
           },
           {
              //当/user/:id/posts匹配成功
              //UserPosts会被渲染在User的<router-view>中
              path: 'posts',
              component: UserPosts
           }
         ]
      }    
   ]
})
  要注意,以/开头的嵌套路径会被当作根路径。这让你充分的使用嵌套组件而无须设置嵌套的路径

5.命名路由

const router = new VueRouter({
    routers: [
       {
         path: '/user/:userId',
         name: 'user',
         component:User 
       }
     ] 
})

<router-link :to="{ name: 'user', params: { userId: 123 }}">User</router-link>

router.push({ name: 'user', params: { userId: 123 }})

6.编程式的导航

声明式 编程式
<router-link :to=''>

router.push()  //window.history.pushState

router.replace()//window.history.replaceState

导航到不同的url时,router.push方法会向history栈添加一个新的记录,所以,当用户点击浏览器后腿按钮时,则回到之前的url。router.replace()跟push很像,但是它不会向history添加新记录,而是跟它的方法名一样替换掉当前的history记录

//字符串
router.push('home')
//对象
router.push({path:'home'})
//命名的路由
router.push({name:'user',params:{userId:123}})
//带查询参数,生成/register?plan=private
router.push({path:'register',query:{plan:'private'}})

router.go(n)类似于window.history.go(n)

//在浏览器记录中前进一步,等同于history.forward()
router.go(1)
//后退一步记录,等同于history.back()
router.go(-1)
//前进3步记录
router.go(3)

7.命名视图

不写名字的默认为default,使用时components(带上s)

<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
     }
  }
 ]
})    

8.重定向

/a重定向到/b
const router = new VueRouter({
   routes: [
     {path:'a',redirect:'/b'}
   ]
})

//重定向的目标也可以是一个命名的路由
const router = new VueRouter({
  routers: [
    {path:'/a',redirect:{name:'foo'}} 
  ]
})
//也可以是一个方法,动态返回重定向目标
const router = new VueRouter({
routes: [
{path:'/a',redirect: to =>{
//方法接收目标路由作为参数
//return 重定向的字符串路径/路径对象
}}
]
})

9.别名


const router =new VueRouter({
  routes:[
    {path:'/a',component:A,alias:'/b'}
   ]
})

10.导航钩子:路由发生变化是触发

钩子方法的参数介绍:

1.to(route):即将要进入的目标路由对象

2.from(route):当前导航正要离开的路由

3.next(Function):一定要调用该方法来resolve这个钩子。执行效果依赖next方法的调用参数(确保要调用next方法,否则钩子就不会被resolved)

   3.1.next():进行管道中的下一个钩子。如果全部钩子执行完了,则导航的状态就是confirmed(确认的)

   3.2.next(false):中断当前的导航。如果浏览器的URL改变了(可能是用户手动或浏览器后腿按钮),那么URL地址会重复到from路由对应的地址

   3.3.next('/')或next({path:'/'}):跳转到一个不同的地址。当前的导航被中断,然后进行一个新的导航

全局钩子

const router = new VueRouter({})
router.beforeEach((to,from,next)=>{})
同样可以注册一个全局的after钩子,不过它不像before钩子那样,它没有next方法
router.afterEach(route=>{})

某个路由独享的钩子

const router = new VueRouter({
   routes:[
     {path:'/foo',
       component:Foo,
      beforeEnter:(to,from,next)=>{}
     }
   ]
})

组件内的钩子

beforeRouteEnter:它不能访问this,因为钩子在导航确认前被调用,因此即将登场的新组件还没被创建,。不过你可以通过传一个回调给next来访问组件实例。在导航被确认的时候执行回调,并且把组件实例作为回调方法的参数

      beforeRouteEnter(to,from,next){next(vm=>{//通过vm访问组件实例})}

beforeRouteUpdate

beforeRouteLeave:直接访问this。这个leave钩子通常用来禁止用户在还未保存修改之前突然离开。可以通过next(false)来取消导航

const Foo = {
  template:'.....',
  beforeRouteEnter(to,from,next){
    //在渲染该组件的对应路由被confirm前调用
    //不能获取组件实例this
   //因为钩子执行前,组件实例还没被调用
  },
  beforeRouteUpdate(to,from,next){
   //在当前路由改变,但是该组件被复用时调用
  //举例来说,对于一个带有动态参数路径/foo/:id,在/foo/1和/foo/2之间跳转的时候,
  //由于会渲染同样的Foo组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用。
  //可以访问组件实例this
  },
   beforeRouteLeave(to,from,next){
     //导航离开该组件的对应路由时调用
    //可以访问组件实例this
  }
}

路由元信息:详细查看API

11.过渡动效

全局:

 

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

 

单个路由的过渡:需设置不同的name

const Foo = {
   template:`<transition name="slide">
                     <div class="foo"></div>
                   </transition>
                 `
}

const Bar= {
   template:`<transition name="fade">
                     <div class="bar"></div>
                   </transition>
                 `
}

基于路由的动态过渡

//使用动态的transition name
<transition :name="transitionName">
   <router-view></router-view>
</transition>

//接着在父组件内
//watch $route 决定使用哪种过渡
watch:{
   '$route'(to,from){
        const toDepth = to.path.split('/').length
        const fromDepth = from.path.split('/').length
        this.transitionName = toDepth<fromDepth ? 'slide-right' : 'slide-left'
   }
}

 数据获取

12.滚动行为:vue-router可以让你自定义切换时页面如何滚动(注意:这个功能只在html5 history模式下可用)

滚动的方法scrollBehavior:

  接收的参数:路由对象(to from),第三个参数savedPosition当且仅当popstate导航(通过浏览器的前进/后退按钮触发)时才可用

     savedPosition方法返回滚动位置的对象信息:

      {x:number,y:number}   {selector:string}  (如果返回一个布尔假值,或空对象,就不会发生滚动)  

 
使用例子:
const router = new VueRouter({
   routes:[...],
   scrollBehavior(to,from,savedPosition){
       //return 期望滚动到哪个的位置
   } 
})

不会发生滚动的例子:
scrollBehavior(to,from,savePosition){
  return {x:0,y:0}  
}

按下前进/后退时:
scrollBehavior(to,from,savedPosition){
 if(savePosition){
   return savedPosition
 }else{
    return {x:0,y:0}
 }
}

模拟滚动到锚点的行为:
scrollBehavior(to,from,savedPosition){
  if(to.hash){
    return{
       selector:to.hash
    }
  }
}

13.路由懒加载:结合Vue的异步组件和webpack的code splitting feature,实现路由组件的懒加载


 
posted @ 2017-03-31 18:00  吃草的虾米  阅读(322)  评论(0编辑  收藏  举报