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 相关文章推荐
如何确保JavaScript的执行顺序 之实战篇
Mar 03 Javascript
Extjs优化(二)Form表单提交通用实现
Apr 15 Javascript
一个简单的jQuery插件ajaxfileupload.js实现ajax上传文件例子
Jun 26 Javascript
Vue.js基础知识汇总
Apr 27 Javascript
手机端图片缩放旋转全屏查看PhotoSwipe.js插件实现
Aug 25 Javascript
AngularJS中关于ng-class指令的几种实现方式详解
Sep 17 Javascript
jquery实现静态搜索功能(可输入搜索文字)
Mar 28 jQuery
用jquery获取select标签中选中的option值及文本的示例
Jan 25 jQuery
JavaScript变量声明var,let.const及区别浅析
Apr 23 Javascript
vuex2中使用mapGetters/mapActions报错的解决方法
Oct 20 Javascript
vue轮播组件实现$children和$parent 附带好用的gif录制工具
Sep 26 Javascript
JavaScript, select标签元素左右移动功能实现
May 14 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读取数据库信息的几种方法
2008/05/24 PHP
ThinkPHP3.1.3版本新特性概述
2014/06/19 PHP
PHP文件锁函数flock()详细介绍
2014/11/18 PHP
解决phpcms更换javascript的幻灯片代码调用图片问题
2014/12/26 PHP
PHP二维数组实现去除重复项的方法【保留各个键值】
2017/12/21 PHP
解javascript 混淆加密收藏
2009/01/16 Javascript
jquery中的mouseleave和mouseout的区别 模仿下拉框效果
2012/02/07 Javascript
jQuery垂直多级导航菜单代码分享
2015/08/18 Javascript
浅析AngularJs HTTP响应拦截器
2015/12/28 Javascript
微信小程序 实战小程序实例
2016/10/08 Javascript
JavaScript实现垂直向上无缝滚动特效代码
2016/11/23 Javascript
详解NodeJs支付宝移动支付签名及验签
2017/01/06 NodeJs
vue页面切换过渡transition效果
2018/10/08 Javascript
JS编写兼容IE6,7,8浏览器无缝自动轮播
2018/10/12 Javascript
echarts实现词云自定义形状的示例代码
2019/02/20 Javascript
微信小程序实现渐入渐出动画效果
2019/06/13 Javascript
vue中实现上传文件给后台实例详解
2019/08/22 Javascript
微信小程序实现购物车功能
2020/11/18 Javascript
Win10下Python环境搭建与配置教程
2016/11/18 Python
python障碍式期权定价公式
2019/07/19 Python
python使用Geany编辑器配置方法
2020/02/21 Python
解决在keras中使用model.save()函数保存模型失败的问题
2020/05/21 Python
keras 自定义loss损失函数,sample在loss上的加权和metric详解
2020/05/23 Python
Django rest framework分页接口实现原理解析
2020/08/21 Python
ONLY德国官方在线商店:购买时尚女装
2017/09/21 全球购物
乌克兰在线电子产品商店:MTA
2019/11/14 全球购物
家长对孩子评语
2014/01/30 职场文书
初二学习计划书范文
2014/04/27 职场文书
信电学院毕业生自荐书
2014/05/24 职场文书
社会实践的活动方案
2014/08/22 职场文书
工作时间擅自离岗检讨书
2014/10/24 职场文书
2014年流动人口工作总结
2014/11/26 职场文书
婚礼父母答谢词
2015/01/04 职场文书
2016廉政教育学习心得体会
2016/01/25 职场文书
django注册用邮箱发送验证码的实现
2021/04/18 Python
Python批量将csv文件转化成xml文件的实例
2021/05/10 Python