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 相关文章推荐
抽出www.templatemonster.com的鼠标悬停加载大图模板的代码
Jul 11 Javascript
js触发asp.net的Button的Onclick事件应用
Feb 02 Javascript
JS 添加千分位与去掉千分位的示例
Jul 11 Javascript
javascript字符串替换及字符串分割示例代码
Dec 12 Javascript
谷歌浏览器调试JavaScript小技巧
Dec 29 Javascript
JQuery实现Ajax加载图片的方法
Dec 24 Javascript
基于jQuery实现选取月份插件附源码下载
Dec 28 Javascript
原生js实现键盘控制div移动且解决停顿问题
Dec 05 Javascript
AngularJS动态菜单操作指令
Apr 25 Javascript
get  post jsonp三种数据交互形式实例详解
Aug 25 Javascript
js合并两个数组生成合并后的key:value数组
May 09 Javascript
ES6基础之数组和对象的拓展实例详解
Aug 22 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
剧场版动画《PSYCHO-PASS 3 FIRST INSPECTOR》3月27日日本上映!
2020/03/06 日漫
安装PHP可能遇到的问题“无法载入mysql扩展” 的解决方法
2007/04/16 PHP
php使用pdo连接mssql server数据库实例
2014/12/25 PHP
php使用cookie实现记住用户名和密码实现代码
2015/04/27 PHP
php实现在新浪云中使用imagick生成缩略图并上传的方法
2016/09/26 PHP
AutoSave/自动存储功能实现
2007/03/24 Javascript
asp.net中System.Timers.Timer的使用方法
2013/03/20 Javascript
JQuery获取或设置ckeditor的数据(示例代码)
2013/11/15 Javascript
Javascript中arguments对象详解
2014/10/22 Javascript
jquery带有索引按钮且自动轮播切换特效代码分享
2015/09/15 Javascript
javascript仿京东导航左侧分类导航下拉菜单效果
2020/11/25 Javascript
浅谈Jquery中Ajax异步请求中的async参数的作用
2016/06/06 Javascript
浅谈jQuery中的eq()与DOM中element.[]的区别
2016/10/28 Javascript
JavaScript实现两个select下拉框选项左移右移
2017/03/09 Javascript
Node.js开发第三方微信公众平台
2017/06/05 Javascript
浅谈React Native 中组件的生命周期
2017/09/08 Javascript
Vue-cli 使用json server在本地模拟请求数据的示例代码
2017/11/02 Javascript
详解js的作用域、预解析机制
2018/02/05 Javascript
浅谈node.js 命令行工具(cli)
2018/05/10 Javascript
js使用Promise实现简单的Ajax缓存
2018/11/14 Javascript
JS简单判断是否在微信浏览器打开的方法示例
2019/01/08 Javascript
微信小程序事件 bindtap bindinput代码实例
2019/08/26 Javascript
js 函数性能比较方法
2020/08/24 Javascript
[04:52]第二届DOTA2亚洲邀请赛主赛事第一天比赛集锦:OG娜迦海妖放大配合谜团大中3人
2017/04/02 DOTA
Python的装饰器模式与面向切面编程详解
2015/06/21 Python
Python操作mongodb数据库进行模糊查询操作示例
2018/06/09 Python
python使用 request 发送表单数据操作示例
2019/09/25 Python
纯CSS3实现绘制各种图形实现代码详细整理
2012/12/26 HTML / CSS
详解Canvas实用库Fabric.js使用手册
2019/01/07 HTML / CSS
加拿大建筑和装修专家:Reno-Depot
2017/12/21 全球购物
员工教育培训协议书
2014/09/27 职场文书
小兵张嘎电影观后感
2015/06/03 职场文书
实验室安全管理制度
2015/08/05 职场文书
浅谈克隆 JavaScript
2021/11/02 Javascript
请求模块urllib之PYTHON爬虫的基本使用
2022/04/08 Python
Java代码规范与质量检测插件SonarLint的使用
2022/08/05 Java/Android