Vue数字输入框组件示例代码详解


Posted in Javascript onJanuary 15, 2020

数字输入框组件

实现功能:只允许输入数字(包括小数)、允许设置初始值、最大值、最小值。

为了方便,这里选用Vue的 cli-service

Vue数字输入框组件示例代码详解

实现快速原型开发

首先template部分代码

<template>
 <div class="demo">
  <input-number v-model="value" :max="10" :min="0"></input-number>
 </div>
</template>

这部分没有什么特别说明的,分别传入 value、max、min 作为子组件的原始值最大值和最小值。在子组件中用 props 接收,独立组件,对每个传入的prop进行类型验证

主要JS部分代码

<script>
import Vue from 'vue'
Vue.component('input-number',{
 props: {
  value: {
   type: Number,
   default: 0
  },
  max: {
   type: Number,
   default: Infinity
  },
  min: {
   type: Number,
   default: -Infinity
  }
 },
 data() {
  return {
   currentValue: this.value
  }
 },
 render(cr) {
  let _this = this
  ...
 }
})
export default {
 data() {
  return {
   value: 5
  }
 }
}
</script>

在这里不能使用字符串的方式定义组件模板,所以使用 render() 函数的方式

render(cr) {
 let _this = this
 return cr('div',{'class': 'input-number'},[
  cr('button',{'class': {'down-btn':true,'dis':this.currentValue<=this.min},on: {click: _this.handleDown},},['-']),
  cr('input',{'class': 'change-input',domProps: {value: _this.currentValue}, on: {change: _this.handleChange}}),
  cr('button',{'class': {'down-btn':true,'dis':this.currentValue>=this.max},on: {click: _this.handleUp},},['+']),
 ])
}

定义 watch 和 methods

watch: {
 value(val) {
  this.updateValue(val)
 },
 currentValue(val) {
  this.$emit('input', val)
  this.$emit('on-change', val)
 }
},
methods: {
 updateValue(val) {
  if(val > this.max) val = this.max
  if(val < this.min) val = this.min
  this.currentValue = val
 },
 handleDown() {
  if(this.currentValue<=this.min) return
  this.currentValue-=1
 },
 handleUp() {
  if(this.currentValue>=this.max) return
  this.currentValue+=1
 },
 handleChange(ev) {
  let val = ev.target.value.trim()
  let max = this.max
  let min = this.min
  if(this.isValueNumber(val)) {
   val = Number(val)
   this.currentValue = val
   if(val > max) {
    this.currentValue = max
   } else if(val < min) {
    this.currentValue = min
   }
  }else {
   ev.target.value = this.currentValue
  }
 },
 isValueNumber(val) {
  return (/(^-?[0-9]+\.{1}\d+$)|(^-?[1-9][0-9]*$)|(^-?0{1}$)/).test(val+'')
 }
}

最后是Less部分代码

<style lang="less">
* {
 box-sizing: border-box;
}
.demo {
 width: 200px;
 margin: 0 auto;
}
.input-number {
 width: 100%;
 display: flex;
 height: 40px;
 align-items: center;
 justify-content: space-between;
 .down-btn,.up-btn {
  font-size: 18px;
  width: 40px;
  height: 40px;
  background-color: #f5f7fa;
  color: #606266;
  border: 1px solid #dcdfe6;
  border-radius: 4px 0 0 4px;
  cursor: pointer;
  outline: none;
  &.up-btn {
   border-radius: 0 4px 4px 0;
  }
  &.dis {
   cursor: not-allowed;
  }
 }
 .change-input {
  flex: 1;
  max-width: 100px;
  outline: none;
  border: none;
  text-align: center;
  height: 40px;
 }
}
</style>

总结

以上所述是小编给大家介绍的Vue数字输入框组件示例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
Extjs学习笔记之三 extjs form更多的表单项
Jan 07 Javascript
js取两个数组的交集|差集|并集|补集|去重示例代码
Aug 07 Javascript
js+html5实现canvas绘制圆形图案的方法
Jun 05 Javascript
JS判断页面是否出现滚动条的方法
Jul 17 Javascript
基于JavaScript判断浏览器到底是关闭还是刷新(超准确)
Feb 01 Javascript
基于jQuery实现select下拉选择可输入附源码下载
Feb 03 Javascript
基于javascript制作经典传统的拼图游戏
Mar 22 Javascript
jQuery操作动态生成的内容的方法
May 28 Javascript
jQuery实现鼠标响应式透明度渐变动画效果示例
Feb 13 jQuery
vue双向数据绑定知识点总结
Apr 18 Javascript
小程序实现短信登录倒计时
Jul 12 Javascript
js实现图片实时时钟
Jan 15 Javascript
Vue v-bind动态绑定class实例方法
Jan 15 #Javascript
JS 事件机制完整示例分析
Jan 15 #Javascript
JS实现滑动插件
Jan 15 #Javascript
JS实现滑动导航效果
Jan 14 #Javascript
解决 window.onload 被覆盖的问题方法
Jan 14 #Javascript
vue quill editor 使用富文本添加上传音频功能
Jan 14 #Javascript
JavaScript事件冒泡机制原理实例解析
Jan 14 #Javascript
You might like
php重定向的三种方法分享
2012/02/22 PHP
PHP 将逗号、空格、回车分隔的字符串转换为数组的函数
2012/06/07 PHP
php实现XML和数组的相互转化功能示例
2017/02/08 PHP
php使用curl伪造浏览器访问操作示例
2019/09/30 PHP
php框架知识点的整理和补充
2021/03/01 PHP
基于jQuery实现表格数据的动态添加与统计的代码
2011/01/31 Javascript
jQuery 和 CSS 的文本特效插件集锦
2014/12/12 Javascript
js实现精确到秒的日期选择器完整实例
2016/04/30 Javascript
jQuery弹出层插件popShow(改进版)用法示例
2017/01/23 Javascript
ES6学习之变量的解构赋值
2017/02/12 Javascript
使用vue的v-for生成table并给table加上序号的实例代码
2017/10/27 Javascript
在vue中使用v-bind:class的选项卡方法
2018/09/27 Javascript
Vue中的基础过渡动画及实现原理解析
2018/12/04 Javascript
JS工厂模式开发实践案例分析
2019/10/17 Javascript
[15:56]Heroes18_暗影萨满(完美)
2014/10/31 DOTA
[38:39]完美世界DOTA2联赛循环赛 IO vs GXR BO2第二场 11.04
2020/11/05 DOTA
python创建和删除目录的方法
2015/04/29 Python
在Python的Django框架中创建语言文件
2015/07/27 Python
python中的lambda表达式用法详解
2016/06/22 Python
浅谈Python中的可变对象和不可变对象
2017/07/07 Python
Windows平台Python连接sqlite3数据库的方法分析
2017/07/12 Python
django中使用Celery 布式任务队列过程详解
2019/07/29 Python
使用python绘制二维图形示例
2019/11/22 Python
python集成开发环境配置(pycharm)
2020/02/14 Python
python 密码学示例——凯撒密码的实现
2020/09/21 Python
python向xls写入数据(包括合并,边框,对齐,列宽)
2021/02/02 Python
Lookfantastic台湾:英国彩妆美发保养购物网
2018/03/26 全球购物
什么是用户模式(User Mode)与内核模式(Kernel Mode) ?
2015/09/07 面试题
学生会主席演讲稿
2014/04/25 职场文书
市级优秀班主任事迹材料
2014/05/13 职场文书
建设工程授权委托书
2014/09/22 职场文书
应届毕业生求职信范文
2015/03/19 职场文书
SpringCloud Alibaba项目实战之nacos-server服务搭建过程
2021/06/21 Java/Android
SQLServer 错误: 15404,无法获取有关 Windows NT 组/用户 WIN-8IVSNAQS8T7\Administrator 的信息
2021/06/30 SQL Server
利用JavaScript写一个简单计算器
2021/11/27 Javascript
virtualenv隔离Python环境的问题解析
2022/06/21 Python