原生侧滑、H5自定义侧滑、系统后退、H5自定义后退 四者冲突如何

2019-08-06  本文已影响0人  冰Q

现阶段,基本上手机浏览器上都实现了侧滑返回或前进功能。当我们用上了vue的动画效果时,便意味着存在一个BUG,那就是原生侧滑、H5自定义侧滑、系统后退、H5自定义后退四者皆能实现后退功能,导致了IOS原生侧滑返回动画效果重复执行BUG。

解决方法:对系统返回做特殊处理
  1. H5自定义开发的侧滑返回 和 H5自定义后退 共用一个方法 (如果项目中不存在H5自定义右滑返回功能请忽略该点)
methods: {
    goBack() {
        this.$pageBack(); // 重定义方法
    }
}
Vue.mixin({
  activated() {
    if(typeof(this.goBack) == 'function') {
      window._currentPageBack = this.goBack;
    } else {
      window._currentPageBack = null;
    }
  }
})
<div id="app" v-touch:right="onSwipeRight">
</div>

onSwipeRight(event, start, end) {
  if((end.X - start.X) > 100) {
    if(typeof(window._currentPageBack) == 'function') {
      window._currentPageBack();
    }
  }
}

2.区分系统返回和项目自定义返回

在$pageBack中增加   
store.commit('CHANGE_STATE', {isOperateBack: true});

3.在测试中发现,微信浏览器右滑直接退出应用,但如百度浏览器等却是返回上一页,故需要区别对待

在app.vue中
data() {
    return {
        isSystemBack :  false
    }
},
mounted(){
  let $this = this;
  //处理原生右边侧滑返回和系统返回键返回的动画效果BUG
  window.addEventListener("popstate", function(){
    if($this.isOperateBack) {
      this.isSystemBack = false;
    } else if($this.$config.iBrowser.weixin) {
      // 微信浏览器打开的
      $this.isSystemBack = false;
    } else if($this.$config.iBrowser.pc) {
      // PC浏览器打开的系统后退
      $this.isSystemBack = false;
    } else {
      // 非微信浏览器打开的系统后退
      $this.isSystemBack = true;
    }
  }, false);
}
//  监听路由变化
$route(to, from) {
    to = to || {};
    // 需要判断是否为系统后退,如果是,不执行动画效果
    this.CHANGE_STATE({isOperateBack: false});
    if(this.isSystemBack) {
      this.transitionName = '';
    } else {
      if (to.name == 'index') {
          this.transitionName = 'fade'
      } else {
          this.transitionName = 'pop-' + (this.direction === 'forward' ? 'in' : 'out');
      }
    }
    this.isSystemBack = false;
}

结语: 本来想对原生侧滑返回和系统返回做区别的,却发现,原生侧滑返回过程touchend不一定会触发,很难做区别,容易出BUG,故只能改成目前并不完美的方案,毕竟非微信浏览器的系统返回的动画效果统一取消了。

上一篇 下一篇

猜你喜欢

热点阅读