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 相关文章推荐
图解js图片轮播效果
Dec 20 Javascript
理解javascript中DOM事件
Dec 25 Javascript
TypeOf这些知识点你了解吗
Feb 21 Javascript
基于jquery编写分页插件
Mar 07 Javascript
详解Vue.js 2.0 如何使用axios
Apr 21 Javascript
vue.js源代码core scedule.js学习笔记
Jul 03 Javascript
react native与webview通信的示例代码
Sep 25 Javascript
微信小程序实现获取自己所处位置的经纬度坐标功能示例
Nov 30 Javascript
vue.js配合$.post从后台获取数据简单demo分享
Aug 11 Javascript
微信小程序实现文字无限轮播效果
Dec 28 Javascript
原生javascript实现类似vue的数据绑定功能示例【观察者模式】
Feb 24 Javascript
解决VUE项目使用Element-ui 下拉组件的验证失效问题
Nov 07 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
长波有什么东西
2021/03/01 无线电
WINDOWS服务器安装多套PHP的另类解决方案
2006/10/09 PHP
Yii2实现增删改查后留在当前页的方法详解
2017/01/13 PHP
PHP面向对象五大原则之依赖倒置原则(DIP)详解
2018/04/08 PHP
JavaScript学习点滴 call、apply的区别
2010/10/22 Javascript
jQuery插件分享之分页插件jqPagination
2014/06/06 Javascript
手机端网页点击链接触发自动拨打或保存电话的示例代码
2014/08/15 Javascript
简单的JS轮播图代码
2016/07/18 Javascript
Node.js中如何合并两个复杂对象详解
2016/12/31 Javascript
JavaScript全屏和退出全屏事件总结(附代码)
2017/08/17 Javascript
Angular实现的内置过滤器orderBy排序与模糊查询功能示例
2017/12/29 Javascript
vue中v-for加载本地静态图片方法
2018/03/03 Javascript
layui问题之模拟select点击事件的实例讲解
2018/08/15 Javascript
Spring boot 和Vue开发中CORS跨域问题解决
2018/09/05 Javascript
详解angular2 控制视图的封装模式
2018/12/27 Javascript
Layui table field初始化加载时进行隐藏的方法
2019/09/19 Javascript
在vue中使用cookie记住用户上次选择的实例(本次例子中为下拉框)
2020/09/11 Javascript
antd vue table跨行合并单元格,并且自定义内容实例
2020/10/28 Javascript
[02:43]2014DOTA2国际邀请赛 官方Alliance战队纪录片
2014/07/14 DOTA
浅谈Pandas 排序之后索引的问题
2018/06/07 Python
python3读取excel文件只提取某些行某些列的值方法
2018/07/10 Python
Selenium鼠标与键盘事件常用操作方法示例
2018/08/13 Python
解决Python一行输出不显示的问题
2018/12/03 Python
这可能是最好玩的python GUI入门实例(推荐)
2019/07/19 Python
python内存管理机制原理详解
2019/08/12 Python
全球领先的鞋类零售商:The Walking Company
2016/07/21 全球购物
照片礼物和装饰:MyPhoto
2019/11/02 全球购物
linux面试题参考答案(9)
2016/01/29 面试题
办公室文秘自我评价
2013/09/21 职场文书
个人求职信范文分享
2014/01/31 职场文书
质量安全标语
2014/06/07 职场文书
2014房屋登记授权委托书
2014/10/13 职场文书
2014年施工员工作总结
2014/11/18 职场文书
公司前台接待岗位职责
2015/04/03 职场文书
优秀创业计划书分享
2019/07/19 职场文书
MySQL 逻辑备份 into outfile
2022/05/15 MySQL