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 相关文章推荐
jquery 最简单的属性菜单
Oct 08 Javascript
jquery提示 &quot;object expected&quot;的解决方法
Dec 13 Javascript
在JavaScript中typeof的用途介绍
Apr 11 Javascript
jQuery的attr与prop使用介绍
Oct 10 Javascript
javascript笛卡尔积算法实现方法
Apr 08 Javascript
jQuery实现Email邮箱地址自动补全功能代码
Nov 03 Javascript
javascript创建对象、对象继承的实用方式详解
Mar 08 Javascript
详解Vue 开发模式下跨域问题
Jun 06 Javascript
微信小程序冒泡事件及其阻止方法实例分析
Dec 06 Javascript
解决vue cli4升级sass-loader(v8)后报错问题
Jul 30 Javascript
vue使用keep-alive实现组件切换时保存原组件数据方法
Oct 30 Javascript
手写实现JS中的new
Nov 07 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生成静态页
2006/11/25 PHP
在yii中新增一个用户验证的方法详解
2013/06/20 PHP
服务器迁移php版本不同可能诱发的问题
2015/12/22 PHP
使用PHP下载CSS文件中的所有图片【几行代码即可实现】
2016/12/14 PHP
Jquery中Ajax 缓存带来的影响的解决方法
2011/05/19 Javascript
jQuery中操控hidden、disable等无值属性的方法
2014/01/06 Javascript
JS获取鼠标选中的文字
2016/08/10 Javascript
Validform表单验证总结篇
2016/10/31 Javascript
移动端基础事件总结与应用
2017/01/12 Javascript
Bootstrap模态框插件使用详解
2017/05/11 Javascript
jQuery扩展方法实现Form表单与Json互相转换的实例代码
2018/09/05 jQuery
Vue.set()动态的新增与修改数据,触发视图更新的方法
2018/09/15 Javascript
vue 指令之气泡提示效果的实现代码
2018/10/18 Javascript
Nuxt默认模板、默认布局和自定义错误页面的实现
2020/05/11 Javascript
Python浅拷贝与深拷贝用法实例
2015/05/09 Python
Python实现字典依据value排序
2016/02/24 Python
Python实现购物程序思路及代码
2017/07/24 Python
Python Process多进程实现过程
2019/10/22 Python
python实现身份证实名认证的方法实例
2019/11/08 Python
Tensorflow 卷积的梯度反向传播过程
2020/02/10 Python
python和pywin32实现窗口查找、遍历和点击的示例代码
2020/04/01 Python
python如何查看网页代码
2020/06/07 Python
Java byte数组操纵方式代码实例解析
2020/07/22 Python
python request 模块详细介绍
2020/11/10 Python
html5音频_动力节点Java学院整理
2018/08/22 HTML / CSS
wordpress添加Html5的表单验证required方法小结
2020/08/18 HTML / CSS
AmazeUI的JS表单验证框架实战示例分享
2020/08/21 HTML / CSS
小学防溺水制度
2014/01/29 职场文书
产品质量承诺书范文
2014/03/27 职场文书
原告离婚代理词
2015/05/23 职场文书
学习杨善洲同志先进事迹心得体会
2016/01/23 职场文书
优秀范文:读《红岩》有感3篇
2019/10/14 职场文书
Python如何利用正则表达式爬取网页信息及图片
2021/04/17 Python
node.js使用express-fileupload中间件实现文件上传
2021/07/16 Javascript
Java org.w3c.dom.Document 类方法引用报错
2021/08/07 Java/Android
使用 Apache Dubbo 实现远程通信(微服务架构)
2022/02/12 Servers