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 尚未实现错误解决办法
Nov 27 Javascript
JavaScript Math.ceil() 函数使用介绍
Dec 11 Javascript
js获取当前日期时间及其它操作汇总
Apr 17 Javascript
jQuery插件AjaxFileUpload实现ajax文件上传
May 05 Javascript
jquery遍历标签中自定义的属性方法
Sep 17 Javascript
实现一个简单的vue无限加载指令方法
Jan 10 Javascript
原生js实现放大镜
Feb 20 Javascript
vue中如何使用ztree
Feb 06 Javascript
JS求Number类型数组中最大元素方法
Apr 08 Javascript
Node.js 多线程完全指南总结
Mar 27 Javascript
jQuery实现判断滚动条滚动到document底部的方法分析
Aug 27 jQuery
Vue的状态管理vuex使用方法详解
Feb 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
第五节 克隆 [5]
2006/10/09 PHP
如何提高MYSQL数据库的查询统计速度 select 索引应用
2007/04/11 PHP
PHP使用ob_start生成html页面的方法
2014/11/07 PHP
PHP记录和读取JSON格式日志文件
2016/07/07 PHP
php数组实现根据某个键值将相同键值合并生成新二维数组的方法
2017/04/26 PHP
ThinkPHP框架表单验证操作方法
2017/07/19 PHP
Gambit vs ForZe BO3 第三场 2.13
2021/03/10 DOTA
javascript CSS画图之基础篇
2009/07/29 Javascript
jQuery Ajax请求状态管理器打包
2012/05/03 Javascript
纯Javascript实现Windows 8 Metro风格实现
2013/10/15 Javascript
js中直接声明一个对象的方法
2014/08/10 Javascript
jquery.cookie实现的客户端购物车操作实例
2015/12/24 Javascript
Knockoutjs 学习系列(一)ko初体验
2016/06/07 Javascript
JS实现简易换图时钟功能分析
2018/01/04 Javascript
使用Vue组件实现一个简单弹窗效果
2018/04/23 Javascript
NodeJS 中Stream 的基本使用
2018/07/30 NodeJs
在JS循环中使用async/await的方法
2018/10/12 Javascript
VeeValidate 的使用场景以及配置详解
2019/01/11 Javascript
解决vue.js中settimeout遇到的问题(时间参数短效果不稳定)
2020/07/21 Javascript
Python实现获取网站PR及百度权重
2015/01/21 Python
Python卸载模块的方法汇总
2016/06/07 Python
Python增量循环删除MySQL表数据的方法
2016/09/23 Python
Python实现利用163邮箱远程关电脑脚本
2018/02/22 Python
PyQt5每天必学之QSplitter实现窗口分隔
2018/04/19 Python
OpenCV3.0+Python3.6实现特定颜色的物体追踪
2019/07/23 Python
python 直接赋值和copy的区别详解
2019/08/07 Python
基于pytorch的保存和加载模型参数的方法
2019/08/17 Python
Python enumerate函数遍历数据对象组合过程解析
2019/12/11 Python
基于HTML5的齿轮动画特效
2016/02/29 HTML / CSS
ALDO美国官网:加拿大女鞋品牌
2018/12/28 全球购物
波兰汽车配件网上商店:iParts.pl
2020/09/08 全球购物
安全责任书模板
2014/07/22 职场文书
售后客服个人自我评价
2014/09/14 职场文书
仓管员岗位职责
2015/02/03 职场文书
党支部考察意见范文
2015/06/02 职场文书
高老头读书笔记
2015/06/30 职场文书