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 相关文章推荐
extjs 学习笔记(三) 最基本的grid
Oct 15 Javascript
40个有创意的jQuery图片和内容滑动及弹出插件收藏集之三
Jan 03 Javascript
FF火狐下获取一个元素同类型的相邻元素实现代码
Dec 15 Javascript
js冒泡、捕获事件及阻止冒泡方法详细总结
May 08 Javascript
checkbox勾选判断代码分析
Jun 11 Javascript
javaScript中两个等于号和三个等于号之间的区别介绍
Jun 27 Javascript
5个书写JavaScript代码的坏习惯,看看你中枪了没?
Nov 06 Javascript
JavaScript中的toLocaleLowerCase()方法使用详解
Jun 06 Javascript
基于jquery步骤进度条源码分享
Nov 12 Javascript
js Canvas实现的日历时钟案例分享
Dec 25 Javascript
iview form清除校验状态的实现
Sep 19 Javascript
Vue实现穿梭框效果
Sep 30 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验证码实现代码
2014/05/10 PHP
php实现通过stomp协议连接ActiveMQ操作示例
2020/02/23 PHP
控制打印时页眉角的代码
2007/02/08 Javascript
javascript 写类方式之八
2009/07/05 Javascript
javascript hashtable 修正版 下载
2010/12/30 Javascript
由Javascript实现的页面日历
2011/11/04 Javascript
JQquery的一些使用心得分享
2012/08/01 Javascript
nodejs中exports与module.exports的区别详细介绍
2013/01/14 NodeJs
Node.js实现兼容IE789的文件上传进度条
2016/09/02 Javascript
详解JS对象封装的常用方式
2016/12/30 Javascript
探索webpack模块及webpack3新特性
2017/09/18 Javascript
微信小程序如何获取用户信息
2018/01/26 Javascript
利用angular、react和vue实现相同的面试题组件
2018/02/19 Javascript
详解Vue Elementui中的Tag与页面其它元素相互交互的两三事
2018/09/25 Javascript
使用vue开发移动端管理后台的注意事项
2019/03/07 Javascript
ssm+vue前后端分离框架整合实现(附源码)
2020/07/08 Javascript
[03:52]显微镜下的DOTA2第三期——英雄在无聊的时候干什么
2014/06/20 DOTA
[59:15]EG vs LGD 2018国际邀请赛淘汰赛BO3 第一场 8.26
2018/08/29 DOTA
[00:52]玛尔斯技能全介绍
2019/03/06 DOTA
python使用post提交数据到远程url的方法
2015/04/29 Python
python 链接和操作 memcache方法
2017/03/04 Python
Python 稀疏矩阵-sparse 存储和转换
2017/05/27 Python
django 解决manage.py migrate无效的问题
2018/05/27 Python
python匹配两个短语之间的字符实例
2018/12/25 Python
python爬虫-模拟微博登录功能
2019/09/12 Python
Python调用Windows API函数编写录音机和音乐播放器功能
2020/01/05 Python
浅谈opencv自动光学检测、目标分割和检测(连通区域和findContours)
2020/06/04 Python
Python多线程threading创建及使用方法解析
2020/06/17 Python
Timberland法国官网:购买靴子、鞋子、衣服、夹克和配饰
2019/11/30 全球购物
命名空间(namespace)和程序集(Assembly)有什么区别
2015/09/25 面试题
爱心活动计划书
2014/04/26 职场文书
办护照工作证明
2014/10/01 职场文书
办公室主任个人对照检查材料思想汇报
2014/10/11 职场文书
一般基层干部群众路线教育实践活动个人对照检查材料
2014/11/04 职场文书
pandas中关于apply+lambda的应用
2022/02/28 Python
Go语言入门exec的基本使用
2022/05/20 Golang