前天,一个同事像我咨询一个问题:
“hi, shunzi,你弄过vux中的那种range没有,但是比那个要复杂一点,需要支持左右两边滑,取中间的区间值?”
“没有呢”
“啊,我们有这样一个需求,需要支持左右滑动,取区间,我改vux的range改得有bug哇,你能不能帮我看看,或者封装一个”
“给你个眼神自己体会,刚好我现在不是很忙,可以看看”
“好的,麻烦你了,到时请你吃饭哇”

背景

背景需求大概就是这样,需要一个vue的插件,支持左右滑动,取他的区间值,vux的range,最开始,我也准备改造一下这个插件,发现自己太渣了,改了半天,事件绑定都乱套了,就自己写一个算了。

思路讲解

  • 插件其实就好比在一个管道里,有两个小球,两个小球,在获取焦点的时候,能够左右滑动
  • 在管道长度固定的情况下(100%),
    • 左边的小球不可能滚到右边小球的右边,右边小球不能滚到左边小球的左边,临界点在于他们相碰
    • 左边小球相对管道左端距离的百分比(left)乘以管道的总长(maxNumber-minNumber),就是最小值【min】
    • 右边小球相对管道右端距离的百分比(right)乘以管道的总长(maxNumber-minNumber),就是球距右端的距离,然后用管长减去这个距离(maxNumber-minNumber)*(1-right)就是【max】

- 最后取得的min/max,有可能是小数,那么,我们应该还要支持用户自定义保留几位小数【pointLen】

核心代码展示

# 父组件
<div class="contanier"><vueRange :min-num="0" :max-num="5000" point-len="0"/>
</div>components: {
'vueRange': () =>import ('@/component/vue_range/range.vue'),
},# 子组件
export default {props: {minNum: "",maxNum: "",pointLen: 0},data() {return {minNumber: this.minNum || 0, //最小值maxNumber: this.maxNum || 100, //最大值_width: 0, //屏幕的宽度dist: 0, //矫正系数left: 0, //handle min 的left偏移量right: 0, //handle max 的right偏移量};},mounted() {this._width = this.$refs.bar.clientWidththis.dist = this.$refs.min.clientWidth / this._width * 100},methods: {move(event, type) {var _left = (event.targetTouches[0].clientX - 10) / this._width * 100;if (type == 'min') {// 当前最小值不能大于最大值,且不能小于0if ((_left + this.right) > 100 || _left < 0) {return;} else {this.left = _left;}} else {// 当前最大值不能小于最小值,且不能大于100if (this.left > _left || _left >= 100) {return;} else {this.right = 100 - _left;}}},},computed: {min() {return ((this.maxNumber - this.minNumber) * this.left / 100).toFixed(this.pointLen);},max() {return ((this.maxNumber - this.minNumber) * (100 - this.right) / 100).toFixed(this.pointLen);}}
}

待优化

  • 在区间很大的情况下,左右小球滑动到一起,虽然不能在向中间靠拢,但是最小值并不等于最大值
  • 在手机上面,小球获取焦点,不是那么顺畅,有时感觉按不住
  • 实际中,最后计算出的最大值、最小值,应该传值到父组件中,这个暂时没有涉及,如果需要,可以传递一个方法,在这个组件中,对min/max进行计算,只要一个发生改变,就emit这个方法,然后在父组件中接收

参考

vux的Range
vux的Range源码
源码地址
更多精彩,请关注订阅号韶华随记

ps: 如果你也有一些搞不定的小需求,可以联系我,如果时间允许,我也是很乐意能帮助到你(微信号与昵称相同)。当然,如果你不想让我死宅在家里,可以面个基or吃个饭or喝个茶,当然最好是给我介绍个女朋友

vue range 双向滚动 取中间值相关推荐

  1. vue:实现锚点双向滚动/文章章节联动滚动效果

    需求描述 需要实现类似doc中文档大纲的效果,点击对应章节的名称时定位到相应的正文:而当正文滚动时,高亮显示对应的章节名称 实现思路 其实笔者一开始想到的是利用a标签页内跳转(也就是"锚点& ...

  2. vue中过滤器比较两个数组取相同值

    在vue中需要比较两个数组取相同值 一个大数组一个 小数组,小数组是大数组的一部分取相同ID的不同name值 有两种写法,两个for循环和map写法 const toName = (ids, arr) ...

  3. 学习vue的双向数据绑定的原理

    1. vue数据双向绑定的原理. 2. 实现简单版vue的过程,主要实现{{}}.v-model和事件指令的功能. vue数据双向绑定原理 vue数据双向绑定是通过数据劫持结合发布者-订阅者模式的方式 ...

  4. vue的双向绑定原理及实现

    前言 使用vue也好有一段时间了,虽然对其双向绑定原理也有了解个大概,但也没好好探究下其原理实现,所以这次特意花了几晚时间查阅资料和阅读相关源码,自己也实现一个简单版vue的双向绑定版本,先上个成果图 ...

  5. vue的双向数据绑定的原理

    VUE实现双向数据绑定的原理就是利用了 Object.defineProperty() 这个方法重新定义了对象获取属性值(get)和设置属性值(set)的操作来实现的. 代码演示:defineProp ...

  6. 记录vue的双向绑定原理及实现

    这里写自定义目录标题 思路分析 实现过程 1.实现一个Observer 2.实现Watcher 此文章是学习以为大神____chen的 <vue的双向绑定原理及实现> vue数据双向绑定是 ...

  7. vue做数字滚动效果

    vue实现数字滚动效果 近期在做项目的时候,产品要求实现数字滚动效果如下: 用jquery实现 html: <div class="develop"> <!--滚 ...

  8. Vue.js双向绑定的实现原理

    Vue.js 最核心的功能有两个,一是响应式的数据绑定系统,二是组件系统.本文仅探究双向绑定是怎样实现的.先讲涉及的知识点,再用简化得不能再简化的代码实现一个简单的 hello world 示例. 一 ...

  9. Scrapy Learning笔记(四)- Scrapy双向爬取

    摘要:介绍了使用Scrapy进行双向爬取(对付分类信息网站)的方法. 所谓的双向爬取是指以下这种情况,我要对某个生活分类信息的网站进行数据爬取,譬如要爬取租房信息栏目,我在该栏目的索引页看到如下页面, ...

最新文章

  1. 小马智行最新估值曝光
  2. linux cp -d复制软链接文件
  3. POJ 1222 EXTENDED LIGHTS OUT(高斯消元)
  4. Pycharm(社区版) 创建Flask项目
  5. python预测股票价格tushare_用tushare对股票进行简单分析
  6. php备份mysql页面_如何用PHP的页面备份、恢复Mysql数据库_php
  7. 第八课 魔棒 画笔工具和铅笔工具
  8. Linux防火墙之介绍
  9. Unity下载文件一(www协程下载)
  10. VMware资源集合,分享一波
  11. print( )函数调用——pytnon小练
  12. java oracle 乱码_oracle中的数据库乱码的原因与解决
  13. 《促进大数据发展行动纲要》发布 部署三大任务助力经济转型
  14. CPRI vs eCPRI
  15. tftp命令文件传输
  16. 中国金属包装容器制造行业竞争格局分析与投资规划深度研究报告2022-2028年版
  17. 你吃的外卖,半年前就做好了
  18. Python每日一记127文本型数字转化为数值型数字(eval函数)
  19. 详解SOME/IP测试
  20. 那些年我做的毕业设计

热门文章

  1. 5.14——教你把ssh抄成ssm
  2. 【OCR】AspriseOCR 条码识别 C++
  3. 股票基础知识(入市必读)
  4. 什么是Visa payWave
  5. python处理word_Python操作word手册
  6. 【转】Web实现前后端分离,前后端解耦
  7. 详解BiLSTM及代码实现
  8. 基于微信小程序的毕业设计题目(20)php校园二手交易小程序(含开题报告、任务书、中期报告、答辩PPT、论文模板)
  9. Date: 7 Dec, Saturday 佳能交流空间
  10. 小学计算机合作教学设计,小学信息技术教学设计