移动端滑动切换组件封装 vue-swiper-router实例详解


Posted in Javascript onNovember 25, 2018

具体代码如下所述:

<strong>组件部分</strong>
<template>
  <div class="main">
    <div class="page-tab">
      <div 
        :class="nowPath == item.path ? 'tab-item tab-item_active' : 'tab-item'"
        v-for='(item, index) in tabList'
        :key="index">
        <router-link 
          mode="out-in"
          :to="item.path">{{item.name}}
        </router-link>
      </div>    
    </div>
    <transition :name="slideDirection">
      <slot>
      </slot> 
    </transition>
  </div>
</template>
<script>
export default {
  props: {
    tabList: Array
  },
  mounted() {
    this.nowPath = this.$route.path;
    this.initTouchedEvent();
  },
  data() {
    return {
      tabSwiper: {},
      slideDirection: 'slideforward',
      nowPath: '',
      startX: '',
      startY:''
    };
  },
  methods: {
    touchedstartHandler(e) {
      this.startX = e.changedTouches[0].pageX;
      this.startY = e.changedTouches[0].pageY;
    },
    touchendHandler(e) {
      let direction = this.startX - e.changedTouches[0].pageX;
      let directionY = this.startY - e.changedTouches[0].pageY;
      let nowRouteIndex = 0;
      this.tabList.forEach((v, index) => {
        if (v.path == this.nowPath) {
          nowRouteIndex = index;
        }
      });
      var disXY = Math.abs(direction)>Math.abs(directionY);
      if (disXY&&direction >= 0 && nowRouteIndex < this.tabList.length - 1) {
        //设置向前动画
        this.slideDirection = 'slideforward';
        this.$router.push({'path': this.tabList[nowRouteIndex + 1].path});
      } 
      if (disXY&&direction < 0 && nowRouteIndex > 0) {
        //设置向后动画
        this.slideDirection = 'slideback';
        this.$router.push({'path': this.tabList[nowRouteIndex - 1].path});
      }
    },
    initTouchedEvent() {
      this.$el.addEventListener('touchstart', this.touchedstartHandler.bind(this));
      this.$el.addEventListener('touchend', this.touchendHandler.bind(this));
    },
  },
  watch: {
    '$route' (to, from) {
      this.nowPath = to.path;
    }
  }
};
</script>
<style>
  * {
    margin: 0;
    padding: 0;
  }
  body {
    height: 100%;
    width: 100%;
    background-color: #fbf9fe;
  }
  a {
    color: #333;
    text-decoration: none;
  }
  .page {
    display: flex;
    justify-content: center;
    align-items: center;
  }
  .page-tab {
    display: flex;
    justify-content: center;
  }
  .tab-item {
    text-align: center;
    align-items: center;
    height: 44px;
    line-height: 44px;
    flex: 1;
    height: 100%;
    background-color: #fff;
  }
  .tab-item_active {
    border-bottom: 3px solid #f90;
  }
  .tab-item_active a {
    color: #f90;
  }
  .slideforward-enter-active, .slideforward-leave-active {
    position: absolute;
    transition: all .5s;
    transform: translate3d(0px, 0px, 0px);
  }
  .slideforward-enter, .slideforward-leave-to {
    position: absolute;
    transform: translate3d(200px, 0px, 0px);
  }
  .slideback-enter-active, .slideback-leave-active {
    position: absolute;
    transition: all .5s;
    transform: translate3d(0px, 0px, 0px);
  }
  .slideback-enter, .slideback-leave-to {
    position: absolute;
    transform: translate3d(-200px, 0px, 0px);
  }
</style>
<strong>router部分</strong>
import Vue from 'vue';
import Router from 'vue-router';
import Page1 from '@/pages/page1/index';
import Page2 from '@/pages/page2/index';
import Page3 from '@/pages/page3/index';
import Page4 from '@/pages/page4/index';
Vue.use(Router)
export default new Router({
 routes: [
  {
   path: '/',
   name: 'index',
   component: Page1
  },
  {
   path: '/page2',
   name: 'Page2',
   component: Page2
  },
  {
   path: '/page3',
   name: 'Page3',
   component: Page3
  },
  {
   path: '/page4',
   name: 'Page4',
   component: Page4
  }
 ]
});
<strong>调用组件部分</strong>
<template>
 <div id="app">
   <TabPages 
         :tab-list='tabList'>
     <router-view/>
   </TabPages>
 </div>
</template>
<script>
import TabPages from './components/index';
export default {
 name: 'app',
 data() {
   return {
    tabList: [{
      name: 'tab1',
      path: '/'
    }, {
      name: 'tab2',
      path: '/page2'
    }, {
      name: 'tab3',
      path: '/page3'
    }, {
      name: 'tab4',
      path: '/page4'
    }]
   }
 },
 components: {
   TabPages
 }
}
</script>
<style>
</style>

完整代码 --> 代码地址    移动端滑动切换   

移动端滑动切换组件封装 vue-swiper-router实例详解

 总结

以上所述是小编给大家介绍的移动端滑动切换组件封装 vue-swiper-router实例详解,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

Javascript 相关文章推荐
jQuery学习7 操作JavaScript对象和集合的函数
Feb 07 Javascript
javascript小数四舍五入多种方法实现
Dec 23 Javascript
js jquery获取随机生成id的服务器控件的三种方法
Jul 11 Javascript
简单的js表单验证函数
Oct 28 Javascript
JS如何将数字类型转化为没3个一个逗号的金钱格式
Jan 27 Javascript
jQuery获取剪贴板内容的方法
Jun 16 Javascript
JS限制条件补全问题实例分析
Dec 16 Javascript
vue组件间的参数传递实例详解
Apr 26 Javascript
Vue 页面权限控制和登陆验证功能的实例代码
Jun 20 Javascript
vue-router之实现导航切换过渡动画效果
Oct 31 Javascript
vue之debounce属性被移除及处理详解
Nov 13 Javascript
微信小程序返回上一级页面的实现代码
Jun 19 Javascript
vue中选项卡点击切换且能滑动切换功能的实现代码
Nov 25 #Javascript
vue中tab选项卡的实现思路
Nov 25 #Javascript
Cookbook组件形式:优化 Vue 组件的运行时性能
Nov 25 #Javascript
vscode 开发Vue项目的方法步骤
Nov 25 #Javascript
浅谈Vue.js 中的 v-on 事件指令的使用
Nov 25 #Javascript
electron + vue项目实现打印小票功能及实现代码
Nov 25 #Javascript
vue组件实践之可搜索下拉框功能
Nov 25 #Javascript
You might like
PHP的switch判断语句的“高级”用法详解
2014/10/01 PHP
php使用memcoder将视频转成mp4格式的方法
2015/03/12 PHP
zend框架实现支持sql server的操作方法
2016/12/08 PHP
IIS 7.5 asp Session超时时间设置方法
2017/04/17 PHP
IE6,IE7下js动态加载图片不显示错误
2010/07/17 Javascript
仅IE6/7/8中innerHTML返回值忽略英文空格的问题
2011/04/07 Javascript
imgAreaSelect 中文文档帮助说明
2011/10/08 Javascript
关于锚点跳转及jQuery下相关操作与插件
2012/10/01 Javascript
jquery入门—选择器实现隔行变色实例代码
2013/01/04 Javascript
js取消单选按钮选中并判断对象是否为空
2013/11/14 Javascript
asm.js使用示例代码
2013/11/28 Javascript
JS日期格式化之javascript Date format
2015/10/01 Javascript
Javascript中Date类型和Math类型详解
2016/02/27 Javascript
JS实现页面进入和返回定位到具体位置
2016/12/08 Javascript
angularjs实现的前端分页控件示例
2017/02/10 Javascript
js实现添加删除表格(两种方法)
2017/04/27 Javascript
JS 实现banner图片轮播效果(鼠标事件)
2017/08/04 Javascript
修改npm全局安装模式的路径方法
2018/05/15 Javascript
vue-cli2.x项目优化之引入本地静态库文件的方法
2018/06/19 Javascript
[48:41]VP vs VG Supermajor小组赛 B组胜者组决赛 BO3 第二场 6.2
2018/06/03 DOTA
python网络编程示例(客户端与服务端)
2014/04/24 Python
python在linux系统下获取系统内存使用情况的方法
2015/05/11 Python
Python实现网络端口转发和重定向的方法
2016/09/19 Python
python实现发送邮件及附件功能
2021/03/02 Python
Empty test suite.(PyCharm程序运行错误的解决方法)
2018/11/30 Python
如何使用repr调试python程序
2020/02/28 Python
django实现日志按日期分割
2020/05/21 Python
应聘自荐书
2013/10/08 职场文书
财务会计专业推荐信
2013/11/30 职场文书
机电专业个人求职信范文
2013/12/30 职场文书
应届大学生简历中的自我评价
2014/01/15 职场文书
澳大利亚商务邀请函
2014/01/17 职场文书
小学校园广播稿(3篇)
2014/09/19 职场文书
艺术节开幕词
2015/01/28 职场文书
质检员工作总结2015
2015/04/25 职场文书
公司员工离职感言
2015/08/03 职场文书