JavaScript

超轻量级php框架startmvc

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

更新时间:2020-09-30 02:54:01 作者:startmvc
数字输入框组件实现功能:只允许输入数字(包括小数)、允许设置初始值、最大值、最小值

数字输入框组件

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

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

实现快速原型开发

首先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数字输入框组件示例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持! 如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

vue 数字输入框 vue输入框组件