<!-- 入口页面 -->
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>input number</title>
</head>
<body>
<div id="app">
{{value}}
<input-number v-model="value" :max="100" :min="-100" :step="5"></input-number>
</div>
<script src="https://unpkg.com/vue/dist/vue.min.js"></script>
<script src="./input-number.js"></script>
<script src="./index.js"></script>
</body>
</html>
// 根实例
var app = new Vue({
el: '#app',
data: {
value: 0
}
});
// 数字输入框组件
function isValueNumber(value) {
return (/(^-?[0-9]+\.{1}\d+$)|(^-?[1-9][0-9]*$)|(^-?0{1}$)/).test(value);
}
Vue.component('input-number', {
template: '\
<div class = "input-number">\
<input \
type="text"\
:value="currentValue"\
@change="handleChange">\
<button \
@click="handleDown"\
:disabled="currentValue<=min">-</button> \
<button \
@click="handleUp" \
:disabled="currentValue>=max">+</button>\
</div>',
props: {
max: {
type: Number,
default: Infinity
},
min: {
type: Number,
default: -Infinity
},
//默认值
value: {
type: Number,
default: 0
},
step: {
type: Number,
default: 1
}
},
data: function() {
return {
currentValue: this.value
}
},
watch: {
currentValue: function(val) {
this.$emit('input', val);
},
//监听value 将新值赋给currentValue
value: function(val) {
this.updateValue(val);
}
},
methods: {
updateValue: function(val) {
if (val > this.max) val = this.max;
if (val < this.min) val = this.min;
this.currentValue = val;
},
handleDown: function() {
if (this.currentValue <= this.min) return;
this.currentValue -= this.step;
},
handleUp: function() {
if (this.currentValue >= this.max) return;
this.currentValue += this.step;
},
handleChange: function(event) {
var val = event.target.value.trim();
var max = this.max;
var min = this.min;
if (isValueNumber(val)) {
val = Number(val);
this.currentValue = val;
if (val > max) {
this.currentValue = max;
} else if (val < min) {
this.currentValue = min;
}
} else {
event.target.value = this.currentValue;
}
},
},
mounted: function() {
this.updateValue(this.value);
}
})
参考
- 《Vue.js 实战》
网友评论