移动端滑动切换组件封装 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 相关文章推荐
javascript和HTML5利用canvas构建猜牌游戏实现算法
Jul 17 Javascript
关于jquery中全局函数each使用介绍
Dec 10 Javascript
jquery引用方法时传递参数原理分析
Oct 13 Javascript
js获取微信版本号的方法
May 12 Javascript
使用grunt合并压缩js和css文件的方法
Mar 02 Javascript
JavaScript实现跟随滚动缓冲运动广告框
Jul 15 Javascript
js使用原型对象(prototype)需要注意的地方
Aug 28 Javascript
Vue2.0中三种常用传值方式(父传子、子传父、非父子组件传值)
Aug 16 Javascript
简化版的vue-router实现思路详解
Oct 19 Javascript
浅谈layui 绑定form submit提交表单的注意事项
Oct 25 Javascript
使用vuex存储用户信息到localStorage的实例
Nov 11 Javascript
详解如何使用Node.js实现热重载页面
May 06 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
DC《神奇女侠2》因疫情推迟上映 温子仁新恐怖片《恶性》撤档
2020/04/09 欧美动漫
php函数的常用方法及注意之处小结
2011/07/10 PHP
php格式化时间戳显示友好的时间实现思路及代码
2014/10/23 PHP
PHP实现通过CURL上传文件功能示例
2018/05/30 PHP
php实现的生成排列算法示例
2019/07/25 PHP
详解phpstorm2020最新破解方法
2020/09/17 PHP
Web 前端设计模式--Dom重构 提高显示性能
2010/10/22 Javascript
javascript getElementsByTagName
2011/01/31 Javascript
前端开发过程中浏览器版本的两种判定方法
2013/10/30 Javascript
html的DOM中Event对象onblur事件用法实例
2015/01/21 Javascript
JavaScript精炼之构造函数 Constructor及Constructor属性详解
2015/11/05 Javascript
ajax级联菜单实现方法实例分析
2016/11/28 Javascript
JS实现根据指定值删除数组中的元素操作示例
2018/08/02 Javascript
使用vue.js在页面内组件监听scroll事件的方法
2018/09/11 Javascript
深入理解 Koa 框架中间件原理
2018/10/18 Javascript
vue中多个倒计时实现代码实例
2019/03/27 Javascript
vue路由教程之静态路由
2019/09/03 Javascript
js+canvas实现画板功能
2020/09/13 Javascript
python应用程序在windows下不出现cmd窗口的办法
2014/05/29 Python
Python中enumerate函数代码解析
2017/10/31 Python
Python编程给numpy矩阵添加一列方法示例
2017/12/04 Python
使用python为mysql实现restful接口
2018/01/05 Python
numpy.ndarray 交换多维数组(矩阵)的行/列方法
2018/08/02 Python
Python设计模式之简单工厂模式实例详解
2019/01/22 Python
Python的赋值、深拷贝与浅拷贝的区别详解
2020/02/12 Python
Python实现计算图像RGB均值方式
2020/06/04 Python
REN Clean Skincare官网:英国本土有机护肤品牌
2019/02/23 全球购物
TOWER London官网:鞋子、靴子、运动鞋等
2019/07/14 全球购物
英国领先的在线高尔夫商店:Gamola Golf
2019/11/16 全球购物
弘扬雷锋精神活动演讲稿
2014/03/04 职场文书
社团活动总结
2014/04/28 职场文书
大型营销活动计划书
2014/04/28 职场文书
大学生迟到检讨书500字
2014/10/17 职场文书
初中毕业感言300字
2015/07/31 职场文书
如何书写你的职业生涯规划书?
2019/06/27 职场文书
深入解析Apache Hudi内核文件标记机制
2022/03/31 Servers