<transition name="fade" >
<router-view name="a" class="template"></router-view>
</transition>
简单的一个路由,有一个动画。
现在我用的是fade这个动画,
我现在想要浏览器前进或者后退调用不同的动画应该怎么做。。
<transition name="fade" >
<router-view name="a" class="template"></router-view>
</transition>
简单的一个路由,有一个动画。
现在我用的是fade这个动画,
我现在想要浏览器前进或者后退调用不同的动画应该怎么做。。
<!-- 使用动态的 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'
我已经做出了这样的效果
用的确实是楼上监听 $route 的方法
但是由于我的view都处于同级,并不能使用楼上的方法
我的组件 都是
/aaa/id /bbb/id
这种形式
所以我只能在 router-link 里面加入一个key value 是timestamp
然后在watch $route 的时候对比 timestamp
watch: {
'$route' (to, from) {
console.log('前一页 from = ' + from.query.key)
console.log('准备进入的页面是 to = ' + to.query.key)
if (from.query.key) {
if (to.query.key > from.query.key) {
this.transitionName = 'slide-fade'
} else {
this.transitionName = 'slide-left'
}
} else {
this.transitionName = 'slide-fade'
}
}
}
view 页面必须要有一个 computed
computed: {
key () {
return (new Date()).valueOf()
}
}
router link 必须要携带 query
<router-link :to="{ name: 'user', params: { id: list.user_id },query: {key:key}}">
</<router-link>
效果可以实现 ,但是会增加url 长度
如果有人有其他方法实现,希望能提出
简单的说,就是自己维护一份浏览记录,每次路由切换时跟浏览记录对比下就知道是前进还是后退了。
更详细的请移步基于vue的移动web app页面缓存解决方案。
可以参考下vue-navigation的实现方式,现在更新到1.0了,支持重复的路由出现在路由栈中了。
VueRouter.prototype.goBack = function () { //重点,给VueRoute添加一个goBack方法,用于记录路由的前进后退状态 this.isBack = true
this.isBack = true
window.history.go(-1)
}
返回就调用这个函数
<template>
<div>
<transition :name="transitionName"> //动态绑定路由动画
<router-view class="Router"></router-view>
</transition>
</div>
</template>
<script>
export default {
data() {
return {
transitionName: ‘slide-right‘ // 默认动态路由变化为slide-right
}
},
watch: {
‘$route‘ (to, from) {
let isBack = this.$router.isBack // 监听路由变化时的状态为前进还是后退
if(isBack) {
this.transitionName = ‘slide-right‘
} else {
this.transitionName = ‘slide-left‘
}
this.$router.isBack = false
}
}
}
</script>
<style>
.Router {
position: absolute;
width: 100%;
transition: all .8s ease;
top: 40px;
}
.slide-left-enter,
.slide-right-leave-active {
opacity: 0;
-webkit-transform: translate(100%, 0);
transform: translate(100%, 0);
}
.slide-left-leave-active,
.slide-right-enter {
opacity: 0;
-webkit-transform: translate(-100%, 0);
transform: translate(-100% 0);
}
</style>
router.go = function (n) { // 后退。
this.history.go(n);
this._recede = true;
};
watch: {
$route(to) {
this.transitions = this.$router._recede ? "rightLeft" : "about";
this.$router._recede = false;
return false;
}
}
6 回答2.8k 阅读✓ 已解决
6 回答2.1k 阅读
5 回答6.2k 阅读✓ 已解决
2 回答1.9k 阅读✓ 已解决
2 回答1.4k 阅读✓ 已解决
4 回答2.5k 阅读
2 回答903 阅读✓ 已解决
网上搜索的方法都有点问题:
前进到存在的路由将被识别为返回行为
https://github.com/zack24q/vu...
我的方法是:
定义个全局变量pageDirection(这里用store),而且默认值是'slide-right',表示返回状态;
document事件委托给<a/>标签,点击时说明触发了路由这个时候设置pageDirection='slide-left';
在路由钩子routeEnter里,设置回pageDirection='slide-right'。
关键代码
根组件App.vue
入口文件main.js
store/index.js
希望有人给出更加好的方法。
最后我还是用这种方法,样式还是用原来的
问题是在当前目录点击上一个页面的时候,会当作返回。这个问题,好像也不是问题。