fix input-number

pull/2/head
baiyaaaaa 2016-09-01 15:56:04 +08:00
parent 66c68d1527
commit 2d177056ff
3 changed files with 85 additions and 34 deletions

View File

@ -11,6 +11,7 @@
- 修复 TimePicker 的 `picker-options` 属性 - 修复 TimePicker 的 `picker-options` 属性
- 修复一些组件图标丢失的问题 - 修复一些组件图标丢失的问题
- 修复远程搜索的 Select 在 Form 中的显示问题 - 修复远程搜索的 Select 在 Form 中的显示问题
- 修复 input-number 输入小数和非数字值时的问题
### 1.0.0-rc.1 ### 1.0.0-rc.1

View File

@ -6,6 +6,11 @@
num2: 1, num2: 1,
num3: 5 num3: 5
} }
},
methods: {
handleChange(value) {
console.log(value);
}
} }
}; };
</script> </script>
@ -16,20 +21,19 @@
} }
} }
</style> </style>
## Input Number 数字输入框 ## Input Number 数字输入框
通过鼠标或键盘输入字符
### 基础使用 仅允许输入标准的数字值,可定义范围
需要标准的数字值时可以用到 Input Number 组件,你提供了数值输入提供了范围控制和递增递减的步数控制。 ### 基础用法
值得一提的是,你可以不用通过连续点击增减,可以直接输入数字或者长按按钮进行数字的改变。
需要标准的数字值时可以用到 Input Number 组件,它提供了数值输入,范围控制和递增递减的步数控制等功能。
:::demo 要使用它,只需要在`el-input-number`元素中使用`v-model`绑定变量即可,变量的初始值即为默认值。 :::demo 要使用它,只需要在`el-input-number`元素中使用`v-model`绑定变量即可,变量的初始值即为默认值。
```html ```html
<template> <template>
<el-input-number v-model="num1"></el-input-number> <el-input-number v-model="num1" @change="handleChange"></el-input-number>
</template> </template>
<script> <script>
export default { export default {
@ -53,9 +57,9 @@
``` ```
::: :::
### 步 ### 步
让组件按照步长来增减。 允许定义递增递减的步数控制
:::demo 设置`step`属性可以控制步长,接受一个`Number`。 :::demo 设置`step`属性可以控制步长,接受一个`Number`。
@ -80,8 +84,14 @@
### Attributes ### Attributes
| 参数 | 说明 | 类型 | 可选值 | 默认值 | | 参数 | 说明 | 类型 | 可选值 | 默认值 |
|----------|-------------- |----------|-------------------------------- |-------- | |----------|-------------- |----------|-------------------------------- |-------- |
| min | 设置计数器允许的最小值 | number | | 0 | | value | 绑定值 | number | — | — |
| max | 设置计数器允许的最大值 | number | | Infinity | | min | 设置计数器允许的最小值 | number | — | 0 |
| step | 计数器步长 | number | | 1 | | max | 设置计数器允许的最大值 | number | — | Infinity |
| size | 计数器尺寸 | string | large, small | | | step | 计数器步长 | number | — | 1 |
| disabled | 是否禁用计数器 | boolean | | false | | size | 计数器尺寸 | string | large, small | — |
| disabled | 是否禁用计数器 | boolean | — | false |
### Events
| 事件名称 | 说明 | 回调参数 |
|---------|--------|---------|
| change | 绑定值被改变时触发 | 最后变更的值 |

View File

@ -7,7 +7,6 @@
> >
<el-input <el-input
v-model="currentValue" v-model="currentValue"
@onchange="handleChange"
:disabled="disabled" :disabled="disabled"
:size="size" :size="size"
:number="true" :number="true"
@ -41,7 +40,7 @@
name: 'ElInputNumber', name: 'ElInputNumber',
props: { props: {
value: { value: {
type: Number default: 1
}, },
step: { step: {
type: Number, type: Number,
@ -91,42 +90,86 @@
}, },
data() { data() {
return { return {
currentValue: null, currentValue: this.value,
inputActive: false inputActive: false
}; };
}, },
watch: { watch: {
value: { currentValue(newVal, oldVal) {
immediate: true, if (!isNaN(newVal) && newVal <= this.max && newVal >= this.min) {
handler(val) { this.$emit('change', newVal);
this.currentValue = val; this.$emit('input', newVal);
} } else {
}, this.$nextTick(() => {
currentValue(val) { this.currentValue = oldVal;
if (!isNaN(parseInt(val, 10))) { });
this.$emit('input', parseInt(val, 10));
} }
} }
}, },
computed: { computed: {
minDisabled() { minDisabled() {
return this.value - this.step < this.min; return this.currentValue - this.step < this.min;
}, },
maxDisabled() { maxDisabled() {
return this.value + this.step > this.max; return this.currentValue + this.step > this.max;
} }
}, },
methods: { methods: {
accSub(arg1, arg2) {
var r1, r2, m, n;
try {
r1 = arg1.toString().split('.')[1].length;
} catch (e) {
r1 = 0;
}
try {
r2 = arg2.toString().split('.')[1].length;
} catch (e) {
r2 = 0;
}
m = Math.pow(10, Math.max(r1, r2));
n = (r1 >= r2) ? r1 : r2;
return parseFloat(((arg1 * m - arg2 * m) / m).toFixed(n));
},
accAdd(arg1, arg2) {
var r1, r2, m, c;
try {
r1 = arg1.toString().split('.')[1].length;
} catch (e) {
r1 = 0;
}
try {
r2 = arg2.toString().split('.')[1].length;
} catch (e) {
r2 = 0;
}
c = Math.abs(r1 - r2);
m = Math.pow(10, Math.max(r1, r2));
if (c > 0) {
var cm = Math.pow(10, c);
if (r1 > r2) {
arg1 = Number(arg1.toString().replace('.', ''));
arg2 = Number(arg2.toString().replace('.', '')) * cm;
} else {
arg1 = Number(arg1.toString().replace('.', '')) * cm;
arg2 = Number(arg2.toString().replace('.', ''));
}
} else {
arg1 = Number(arg1.toString().replace('.', ''));
arg2 = Number(arg2.toString().replace('.', ''));
}
return (arg1 + arg2) / m;
},
increase() { increase() {
if (this.value + this.step > this.max || this.disabled) return; if (this.currentValue + this.step > this.max || this.disabled) return;
this.currentValue += this.step; this.currentValue = this.accAdd(this.step, this.currentValue);
if (this.maxDisabled) { if (this.maxDisabled) {
this.inputActive = false; this.inputActive = false;
} }
}, },
decrease() { decrease() {
if (this.value - this.step < this.min || this.disabled) return; if (this.currentValue - this.step < this.min || this.disabled) return;
this.currentValue -= this.step; this.currentValue = this.accSub(this.currentValue, this.step);
if (this.minDisabled) { if (this.minDisabled) {
this.inputActive = false; this.inputActive = false;
} }
@ -140,9 +183,6 @@
if (!this.disabled && !disabled) { if (!this.disabled && !disabled) {
this.inputActive = false; this.inputActive = false;
} }
},
handleChange(value) {
this.$emit('onchange', value);
} }
} }
}; };