开发一个数字输入框组件
数字输入框是对普通输入框的扩展,用来快捷键入一个标准的数字。
业务需求:数字输入框只能输入数字,而且有两个快捷按钮,可以直接减1或加1。除此之外,还可以设置初始值、最大值、最小值,在数值改变时,触发一个自定义事件来通知父组件。
了解需求以后,定义目录文件:
- index.html 入口页
- input-number.js 数字输入框组件
- index.js 根实例
index.html:
数字输入框组件
index.js
var app = new Vue({
el: '#app',
data: {
value: 5
}
});
input-number.js
function isValueNumber (value) {
return (/(^-?[0-9]+\.{1}\d+$)|(^-?[1-9][0-9]*$)|(^-?0{1}$)/).test(value+'');
}
Vue.component('input-number', {
template:'\
\
\
\
\
',
props: {
// 从父组件处传递了以下这些参数
max: {
type: Number,
default: Infinity
},
min: {
type: Number,
default: -Infinity
},
value: {
type: Number,
default: 0
}
},
// Vue组件是单向数据流,所以无法从组件内部直接修改prop value的值。
// 解决办法:给组件声明一个data,默认引用value的值,然后在组件内部维护这个data。
// 完成了初始化时引用父组件value
data: function() {
return {
currentValue: this.value
}
},
// 监听(watch)选项用来监听某个prop或data的改变,当它们发生变化时,就会触发watch配置的函数。
// 我们需要监听两个量:value和currentValue。
// 监听value是要知晓从父组件修改了value。
// 监听currentValue是为了当currentValue改变时,更新value。
watch: {
// 新的值
currentValue: function(val) {
this.$emit('input',val);
this.$emit('on-change',val);
},
// 旧的值
value: function(val) {
this.updateValue(val)
}
},
methods: {
handleDown: function(){
if (this.currentValue <= this.min) return;
this.currentValue -= 1;
},
handleUp: function(){
if (this.currentValue >= this.max) return;
this.currentValue += 1;
},
updateValue: function(val){
if (val>this.max) val=this.max;
if (val max) {
this.currentValue = max;
} else if (val < min) {
this.currentValue = min;
}
} else {
event.target.value = this.currentValue
}
}
},
// 在生命周期mounted钩子里也调用了updateValue()方法。是因为第一次初始化时,也对value进行了过滤。
mouted: function() {
this.updateValue(this.value);
}
});