Vue无限滑动周选择日期的组件的示例代码


Posted in Javascript onJuly 18, 2018

之前在做一个手机端项目的时候,需要一个左右滑动(按周滑动)选择日期插件,而且当时这个项目没有用到Vue。当时又没有找到合适的第三方插件,就花了点时间用原生JavaScript写了出来,当时心中就想把它写成基于Vue的组件,这短时间闲了把它弄出来了!,在这个过程中遇到了一个坑,后面会提出来!

先看效果

Vue无限滑动周选择日期的组件的示例代码

 思路

根据用户传入日期(不传默认今天),获取上一周,当周,下一周对应的日期放数组dates里

let vm = this
  this.dates.push(
   {
    date: moment(vm.defaultDate).subtract(7, 'd').format('YYYY-MM-DD'),
   },
   {
    date: vm.defaultDate,
   },
   {
    date: moment(vm.defaultDate).add(7, 'd').format('YYYY-MM-DD'),
   }
  )

根据datas 生成每一周对应的日期

getDaies (date) {
   let vm = this,
    arr = []
   let weekOfDate = Number(moment(date).format('E'))
   let weeks = ['日', '一', '二', '三', '四', '五', '六']
   let today = moment()
   let defaultDay = moment(vm.defaultDate)
   for (var i = 0; i < 7; i++) {
    let _theDate = moment(date).subtract(weekOfDate - i, 'd')
    arr.push({
     date: _theDate.format('YYYY-MM-DD'),
     week: weeks[i],
     isToday: _theDate.format('YYYY-MM-DD') === today.format('YYYY-MM-DD'),
     isDay: _theDate.format('E') === defaultDay.format('E')
    })
   }
   return arr
  }

生成每一个滑动单元的style

getTransform (index) {
   let vm = this
   let style = {}
   if (index === vm.activeIndex) {
    style['transform'] = 'translateX('+ vm.distan.x +'px)'
   }
   if (index < vm.activeIndex) {
    style['transform'] = 'translateX(-100%)'
   }
   if (index > vm.activeIndex) {
    style['transform'] = 'translateX(100%)'
   }
   style['transition'] = vm.isAnimation ? 'transform 0.5s ease-out' : 'transform 0s ease-out'
   return style
  }

然后就是处理touchstart touchend touchmove事件了,这里就不贴代码了,说下逻辑:

  • ouchstart 记录滑动起点位置
  • touchmove 获得滑动距离赋值给 vm.distan.x 实时获得当前周transform
  • touchend 改变activeIndex的值,当然改变activeIndex的值是不够的,要实现无限滑动,就要在操作一下dates,如果是左滑删除dates的第一个元素并且往dates里面push下下周对应日期,如果是右滑删除最后一个元素并网数组前面unshift上上周对应的日期

坑点

因为这个组件是通过css3的transition来实现动画的,最开始我是把所用三个滑动元素在css里面写了transition:transform 0.5s ease-out; 谁知道自己把自己坑了,因为最后我们改变activeIndex后要删除一个日期,还要往数组里面新增一个元素,这样就会引起dates的改变,进而引起Vue去重新更新界面,导致动画又出来了!最后想到的解决办法就是引入一个变量isAnimation来控制transition的值,只有当滑动的时才开启过度动画效果,再侦听transitionend时间重置isAnimation = false后再更新dates

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
URI、URL和URN之间的区别与联系
Dec 20 Javascript
Javascript !!的作用
Dec 04 Javascript
js替换字符串的所有示例代码
Jul 23 Javascript
JavaScript电子时钟倒计时
Jan 09 Javascript
JavaScript隐式类型转换
Mar 15 Javascript
javascript高级选择器querySelector和querySelectorAll全面解析
Apr 07 Javascript
DOM 事件的深入浅出(二)
Dec 05 Javascript
Angularjs中使用指令绑定点击事件的方法
Mar 30 Javascript
JavaScript中this的用法及this在不同应用场景的作用解析
Apr 13 Javascript
node.js中debug模块的简单介绍与使用
Apr 25 Javascript
Vue 拦截器对token过期处理方法
Jan 23 Javascript
利用JavaScript为句子加标题的3种方法示例
Jan 05 Javascript
微信小程序修改swiper默认指示器样式的实例代码
Jul 18 #Javascript
webpack4.x打包过程详解
Jul 18 #Javascript
vue系列之requireJs中引入vue-router的方法
Jul 18 #Javascript
Vue隐藏显示、只读实例代码
Jul 18 #Javascript
详解vue中axios的封装
Jul 18 #Javascript
详解vue2.0监听属性的使用心得及搭配计算属性的使用
Jul 18 #Javascript
微信小程序将字符串生成二维码图片的操作方法
Jul 17 #Javascript
You might like
php中截取字符串支持utf-8
2007/01/18 PHP
ASP和PHP实现生成网站快捷方式并下载到桌面的方法
2014/05/08 PHP
php实现微信支付之退款功能
2018/05/30 PHP
PHP swoole和redis异步任务实现方法分析
2019/08/12 PHP
Yii框架应用组件用法实例分析
2020/05/15 PHP
6个DIV 135或246间隔一秒轮番显示效果
2010/07/24 Javascript
JavaScript聚焦于第一个字段的代码
2010/10/15 Javascript
JavaScript可否多线程? 深入理解JavaScript定时机制
2012/05/23 Javascript
js点击页面其它地方将某个显示的DIV隐藏
2012/07/12 Javascript
使用jquery实现div的tab切换实例代码
2013/05/27 Javascript
weUI应用之JS常用信息提示弹层的封装
2016/11/21 Javascript
JS+canvas动态绘制饼图的方法示例
2017/09/12 Javascript
JS实现的ajax和同源策略(实例讲解)
2017/12/01 Javascript
微信小程序用户位置权限的获取方法(拒绝后提醒)
2018/11/15 Javascript
6行代码实现微信小程序页面返回顶部效果
2018/12/28 Javascript
node.js开发辅助工具nodemon安装与配置详解
2020/02/06 Javascript
使用Protocol Buffers的C语言拓展提速Python程序的示例
2015/04/16 Python
使用Python程序抓取新浪在国内的所有IP的教程
2015/05/04 Python
Python中多个数组行合并及列合并的方法总结
2018/04/12 Python
Flask框架信号用法实例分析
2018/07/24 Python
python3.6的venv模块使用详解
2018/08/01 Python
Django+python服务器部署与环境部署教程详解
2020/03/30 Python
Python读取Excel数据并生成图表过程解析
2020/06/18 Python
用python实现学生管理系统
2020/07/24 Python
西班牙网上书店:Casa del Libro
2016/11/01 全球购物
阿联酋手表和配饰购物网站:Rivolishop
2019/11/25 全球购物
怎样有效的进行自我评价
2013/10/06 职场文书
通息工程毕业生自荐信
2013/10/16 职场文书
技术总监个人的自我评价范文
2013/12/18 职场文书
继电保护工岗位职责
2014/01/05 职场文书
省优秀教师事迹材料
2014/01/30 职场文书
大学毕业感言100字
2014/02/03 职场文书
北京故宫的导游词
2015/01/31 职场文书
护士个人总结范文
2015/02/13 职场文书
浅谈redis缓存在项目中的使用
2021/05/20 Redis
使用springMVC所需要的pom配置
2021/09/15 Java/Android