美文网首页
原生侧滑、H5自定义侧滑、系统后退、H5自定义后退 四者冲突如何

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

作者: 冰Q | 来源:发表于2019-08-06 16:01 被阅读0次

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

    解决方法:对系统返回做特殊处理
    • 原生侧滑、H5自定义侧滑、系统后退、H5自定义后退四种方式可简单划分成两种,原生侧滑 和 系统后退键后退 可划分成系统后退,其原理基于历史栈。H5自定义开发的侧滑返回 和 H5自定义后退 可划分成项目内部返回,不一定遵循历史栈。
    • 本方法基于本人的项目方法封装$pageBack,具体可参考(https://www.jianshu.com/p/dc23829ec9f3)(这也是本人比较喜欢封装的方法的原因,对于框架使用频率高的方法进行进一步封装,有利于后期进行一些统一化改造及测试)
    1. H5自定义开发的侧滑返回 和 H5自定义后退 共用一个方法 (如果项目中不存在H5自定义右滑返回功能请忽略该点)
    • 在页面开发时,退后方法用同一个名称命名,如goBack
    methods: {
        goBack() {
            this.$pageBack(); // 重定义方法
        }
    }
    
    • 在入口文件中把每个页面中的goBack方法暴露出来
    Vue.mixin({
      activated() {
        if(typeof(this.goBack) == 'function') {
          window._currentPageBack = this.goBack;
        } else {
          window._currentPageBack = null;
        }
      }
    })
    
    • 在app.vue中增加右滑功能(这里我使用了vue-directive-touch插件)
    <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方法,均通过一个状态isOperateBack来监控
    在$pageBack中增加   
    store.commit('CHANGE_STATE', {isOperateBack: true});
    

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

    • 由于页面路由切换都是通过操作history的,故可通过监听popstate来统一处理
    在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,故只能改成目前并不完美的方案,毕竟非微信浏览器的系统返回的动画效果统一取消了。

    相关文章

      网友评论

          本文标题:原生侧滑、H5自定义侧滑、系统后退、H5自定义后退 四者冲突如何

          本文链接:https://www.haomeiwen.com/subject/edkwdctx.html