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判读浏览器是否支持html5的canvas的代码
Nov 18 Javascript
使用jQuery实现星级评分代码分享
Dec 09 Javascript
高性能JavaScript 重排与重绘(2)
Aug 11 Javascript
JavaScript获取当前cpu使用率的方法
Dec 15 Javascript
AngularJS入门教程之表格实例详解
Jul 27 Javascript
微信小程序之滚动视图容器的实现方法
Sep 26 Javascript
vue父组件向子组件(props)传递数据的方法
Jan 02 Javascript
js+canvas实现滑动拼图验证码功能
Mar 26 Javascript
详解angularjs4部署文件过大解决过程
Dec 05 Javascript
vue实现拖拽的简单案例 不超出可视区域
Jul 25 Javascript
vue路由分文件拆分管理详解
Aug 13 Javascript
详解Java中String JSONObject JSONArray List转换
Nov 13 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仿微信红包分配算法的实现方法
2016/05/13 PHP
PHP实现适用于文件内容操作的分页类
2016/06/15 PHP
Linux平台php命令行程序处理管道数据的方法
2016/11/10 PHP
TP3.2框架分页相关实现方法分析
2020/06/03 PHP
使用Modello编写JavaScript类
2006/12/22 Javascript
JS 密码强度验证(兼容IE,火狐,谷歌)
2010/03/15 Javascript
JS弹出窗口代码大全(详细整理)
2012/12/21 Javascript
div当滚动到页面顶部的时候固定在顶部实例代码
2013/05/27 Javascript
解决JS请求服务器gbk文件乱码的问题
2015/10/16 Javascript
详解JavaScript函数对象
2015/11/15 Javascript
JS 组件系列之Bootstrap Table的冻结列功能彻底解决高度问题
2017/06/30 Javascript
JS设计模式之惰性模式(二)
2017/09/29 Javascript
使用NestJS开发Node.js应用的方法
2018/12/03 Javascript
前端Vue项目详解--初始化及导航栏
2019/06/24 Javascript
Vue动态加载图片在跨域时无法显示的问题及解决方法
2020/03/10 Javascript
JavaScript随机数的组合问题案例分析
2020/05/16 Javascript
js+canvas实现五子棋小游戏
2020/08/02 Javascript
Javascript confirm多种使用方法解析
2020/09/25 Javascript
利用js canvas实现五子棋游戏
2020/10/11 Javascript
python基础教程之循环介绍
2014/08/29 Python
python实现类之间的方法互相调用
2018/04/29 Python
Python使用get_text()方法从大段html中提取文本的实例
2019/08/27 Python
Python的Lambda函数用法详解
2019/09/03 Python
Python3 A*寻路算法实现方式
2019/12/24 Python
python 读取二进制 显示图片案例
2020/04/24 Python
python实现逻辑回归的示例
2020/10/09 Python
html2canvas生成的图片偏移不完整的解决方法
2020/05/19 HTML / CSS
世界各地的当地人的食物体验:Eatwith
2019/07/26 全球购物
小学生演讲稿
2014/01/12 职场文书
公司授权委托书范本
2014/04/03 职场文书
党的群众路线教育实践活动批评与自我批评发言稿
2014/10/16 职场文书
盗窃罪辩护词范文
2015/05/21 职场文书
创业计划书之韩国烧烤店
2019/09/19 职场文书
Vue3.0 手写放大镜效果
2021/07/25 Vue.js
最新动漫情报:2022年7月新番定档超过30部, OVERLORD骨王第四季也在其中噢
2022/05/04 日漫
Linux中一对多配置日志服务器的详细步骤
2022/07/23 Servers