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 相关文章推荐
js实现鼠标拖动图片并兼容IE/FF火狐/谷歌等主流浏览器
Jun 06 Javascript
基于jquery实现图片放大功能
May 07 Javascript
js 上传文件预览的简单实例
Aug 16 Javascript
canvas仿iwatch时钟效果
Mar 06 Javascript
小发现之浅谈location.search与location.hash的问题
Jun 23 Javascript
详解利用jsx写vue组件的方法示例
Jul 17 Javascript
jQuery实现的电子时钟效果完整示例
Apr 28 jQuery
iview通过Dropdown(下拉菜单)实现的右键菜单
Oct 26 Javascript
React通过redux-persist持久化数据存储的方法示例
Feb 14 Javascript
JavaScript JSON数据处理全集(小结)
Aug 15 Javascript
基于JavaScript获取base64图片大小
Oct 18 Javascript
jquery实现进度条状态展示
Mar 26 jQuery
微信小程序修改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
mcrypt启用 加密以及解密过程详细解析
2013/08/07 PHP
解决file_get_contents无法请求https连接的方法
2013/12/17 PHP
json 定义
2008/06/10 Javascript
js操作ajax返回的json的注意问题!
2010/02/23 Javascript
用JQuery调用Session的实现代码
2010/10/29 Javascript
兼容IE和Firefox的javascript获取iframe文档内容的函数
2011/08/15 Javascript
用nodejs访问ActiveX对象,以操作Access数据库为例。
2011/12/15 NodeJs
js中parseFloat(参数1,参数2)定义和用法及注意事项
2013/01/27 Javascript
JS Replace()的高级使用方法介绍
2013/06/29 Javascript
ES6中Proxy与Reflect实现重载(overload)的方法
2017/03/30 Javascript
详解Vue.js基于$.ajax获取数据并与组件的data绑定
2017/05/26 Javascript
实战node静态文件服务器的示例代码
2018/03/08 Javascript
node puppeteer(headless chrome)实现网站登录
2018/05/09 Javascript
IE9 elementUI文件上传的问题解决
2018/10/17 Javascript
Javascript数组方法reduce的妙用之处分享
2019/06/10 Javascript
js实现小球在页面规定的区域运动
2020/06/16 Javascript
[57:29]Alliance vs KG 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/17 DOTA
python处理json数据中的中文
2014/03/06 Python
python之文件的读写和文件目录以及文件夹的操作实现代码
2016/08/28 Python
Python GUI布局尺寸适配方法
2018/10/11 Python
Python代码太长换行的实现
2019/07/05 Python
Python定时任务APScheduler的实例实例详解
2019/07/22 Python
python绘制动态曲线教程
2020/02/24 Python
python TCP包注入方式
2020/05/05 Python
pycharm第三方库安装失败的问题及解决经验分享
2020/05/09 Python
css3中flex布局宽度不生效的解决
2020/12/09 HTML / CSS
长辈证婚人证婚词
2014/01/09 职场文书
团日活动策划书
2014/02/01 职场文书
幼儿教师求职信
2014/05/24 职场文书
女生节标语
2014/06/26 职场文书
2014年教师节红领巾广播稿
2014/09/10 职场文书
银行求职自荐信范文
2015/03/04 职场文书
观看《杨善洲》宣传教育片心得体会
2016/01/23 职场文书
宪法宣传标语100条
2019/10/15 职场文书
MySQL8.0.18配置多主一从
2021/06/21 MySQL
php访问对象中的成员的实例方法
2021/11/17 PHP