为什么Vue Router没有运行javascript转换挂钩同步?

时间:2017-02-21 13:10:50

标签: vue.js vuejs2 vue-router

我是vue router和vue.js的新手。我只是尝试在vue-router上使用javascript转换。为什么beforeLeave事件在更改路线之前不会触发?但它正如预期的那样与css转换一起工作。它适用于css过渡。但它不适用于javascript转换...这里是jsfiddle示例...输入方法按预期工作。但beforeLeave方法没有按预期工作,并且在路由之间没有转换链。请帮忙..

jsfiddle

<script src="https://npmcdn.com/vue/dist/vue.js"></script>
<script src="https://npmcdn.com/vue-router/dist/vue-router.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/1.19.1/TweenMax.min.js"></script>
<div id="app">
  <router-link to="/">/home</router-link>
  <router-link to="/foo">/foo</router-link>
  <router-view></router-view>
</div>

这是js

    const Home = { template: '<transition v-on:enter="enter" v-on:leave="leave" ><div>Home</div></transition>',
methods:{
    enter:function(el, done){  
    TweenMax.from(el,2,{x:-60,onComplete:done});
  },
  leave:function(el, done){
    TweenMax.to(el,2,{x:60,onComplete:done});
  }
}
}
const Foo = { template: '<transition v-on:enter="enter" v-on:leave="leave" ><div>Foo</div></transition>',
methods:{
    enter:function(el, done){  
    TweenMax.from(el,2,{x:-60,onComplete:done});
  },
  leave:function(el, done){
    TweenMax.to(el,2,{x:60,onComplete:done});
  }
}
}

const router = new VueRouter({
  mode: 'history',
  routes: [
    { path: '/', component: Home },
    { path: '/foo', component: Foo }
  ]
})

new Vue({
    router,
  el: '#app',
  data: {
    msg: 'Hello World'
  }
})

1 个答案:

答案 0 :(得分:0)

我已经解决了。不要使用多个转换进行链接。如果你使用css转换它不是问题。但是,如果您使用javascript转换,它将无法按预期运行。因此,在父元素上使用转换,即“router-view”。如果要更改每个路由的转换,只需使用if块检查route.name并为特定路由进行转换。

这里是jsfiddle

const Home = { template: '<div>Home</div>',
methods:{
    enter:function(el, done){  
    TweenMax.from(el,2,{x:-60,onComplete:done});
  },
  leave:function(el, done){
    TweenMax.to(el,2,{x:60,onComplete:done});
  }
}
}
const Foo = { template: '<div>Foo</div>',
methods:{
    enter:function(el, done){  
    TweenMax.from(el,2,{x:-60,onComplete:done});
  },
  leave:function(el, done){
    TweenMax.to(el,2,{x:60,onComplete:done});
  }
}
}

const router = new VueRouter({
  mode: 'history',
  routes: [
    { path: '/', component: Home },
    { path: '/foo', component: Foo }
  ]
})

new Vue({
    router,
  el: '#app',
  data: {
    msg: 'Hello World'
  },
  methods:{
    enter:function(el, done){  
    TweenMax.from(el,2,{x:-60,onComplete:done});
  },
  leave:function(el, done){
    TweenMax.to(el,2,{x:60,onComplete:done});
  }
}

})