Commit cec470ebd5808b155da0a23744626932b0613ced
Committed by
GitHub
Merge pull request #4315 from huanghong1125/input-number
update input-number
Showing
2 changed files
with
48 additions
and
28 deletions
Show diff stats
examples/routers/input-number.vue
| @@ -54,7 +54,24 @@ | @@ -54,7 +54,24 @@ | ||
| 54 | <InputNumber v-model="value3" style="width: 200px" placeholder="Enter something..."></InputNumber> --> | 54 | <InputNumber v-model="value3" style="width: 200px" placeholder="Enter something..."></InputNumber> --> |
| 55 | 55 | ||
| 56 | 56 | ||
| 57 | - <InputNumber v-model="valueNull" style="width: 200px" :min='0' :max='10000' :precision='2' ></InputNumber> | 57 | + <InputNumber v-model="valueNull" style="width: 200px" :min='1' :max='10000' :precision='2' ></InputNumber> |
| 58 | + <InputNumber v-model="valueNull" style="width: 200px" ></InputNumber> | ||
| 59 | + <div style="margin:10px 0px"> | ||
| 60 | + <InputNumber :activeChange="false" v-model="valueNull" style="width: 200px" :min='1' :max='10000' :precision='2' ></InputNumber> | ||
| 61 | + <InputNumber :activeChange="false" v-model="valueNull" style="width: 200px" ></InputNumber> | ||
| 62 | + </div> | ||
| 63 | + <div style="margin:10px 0px"> | ||
| 64 | + <InputNumber | ||
| 65 | + :max="10000" | ||
| 66 | + v-model="value9" | ||
| 67 | + :formatter="value => `$ ${value}`.replace(/B(?=(d{3})+(?!d))/g, ',')" | ||
| 68 | + :parser="value => value.replace(/\$s?|(,*)/g, '')"></InputNumber> | ||
| 69 | + <InputNumber | ||
| 70 | + :max="100" | ||
| 71 | + v-model="value10" | ||
| 72 | + :formatter="value => `${value}%`" | ||
| 73 | + :parser="value => value.replace('%', '')"></InputNumber> | ||
| 74 | + </div> | ||
| 58 | </div> | 75 | </div> |
| 59 | </template> | 76 | </template> |
| 60 | <script> | 77 | <script> |
| @@ -68,16 +85,18 @@ | @@ -68,16 +85,18 @@ | ||
| 68 | formatter: (value) => `$ ${value}`.replace(/\B(?=(\d{3})+(?!\d))/g, ','), | 85 | formatter: (value) => `$ ${value}`.replace(/\B(?=(\d{3})+(?!\d))/g, ','), |
| 69 | parser: (value) => value.replace(/\$\s?|(,*)/g, ''), | 86 | parser: (value) => value.replace(/\$\s?|(,*)/g, ''), |
| 70 | formatter2: (value) => `${value}%`, | 87 | formatter2: (value) => `${value}%`, |
| 71 | - parser2: (value) => value.replace('%', '') | ||
| 72 | - } | 88 | + parser2: (value) => value.replace('%', ''), |
| 89 | + value9: 1000, | ||
| 90 | + value10: 100 | ||
| 91 | + }; | ||
| 73 | }, | 92 | }, |
| 74 | methods: { | 93 | methods: { |
| 75 | focus (e) { | 94 | focus (e) { |
| 76 | - e.target.select() | 95 | + e.target.select(); |
| 77 | }, | 96 | }, |
| 78 | change (v) { | 97 | change (v) { |
| 79 | - console.log(v) | 98 | + console.log(v); |
| 80 | } | 99 | } |
| 81 | } | 100 | } |
| 82 | - } | 101 | + }; |
| 83 | </script> | 102 | </script> |
src/components/input-number/input-number.vue
| @@ -3,13 +3,11 @@ | @@ -3,13 +3,11 @@ | ||
| 3 | <div :class="handlerClasses"> | 3 | <div :class="handlerClasses"> |
| 4 | <a | 4 | <a |
| 5 | @click="up" | 5 | @click="up" |
| 6 | - @mousedown="preventDefault" | ||
| 7 | :class="upClasses"> | 6 | :class="upClasses"> |
| 8 | <span :class="innerUpClasses" @click="preventDefault"></span> | 7 | <span :class="innerUpClasses" @click="preventDefault"></span> |
| 9 | </a> | 8 | </a> |
| 10 | <a | 9 | <a |
| 11 | @click="down" | 10 | @click="down" |
| 12 | - @mousedown="preventDefault" | ||
| 13 | :class="downClasses"> | 11 | :class="downClasses"> |
| 14 | <span :class="innerDownClasses" @click="preventDefault"></span> | 12 | <span :class="innerDownClasses" @click="preventDefault"></span> |
| 15 | </a> | 13 | </a> |
| @@ -82,6 +80,10 @@ | @@ -82,6 +80,10 @@ | ||
| 82 | type: Number, | 80 | type: Number, |
| 83 | default: 1 | 81 | default: 1 |
| 84 | }, | 82 | }, |
| 83 | + activeChange:{ | ||
| 84 | + type:Boolean, | ||
| 85 | + default:true | ||
| 86 | + }, | ||
| 85 | value: { | 87 | value: { |
| 86 | type: Number, | 88 | type: Number, |
| 87 | default: 1 | 89 | default: 1 |
| @@ -252,7 +254,16 @@ | @@ -252,7 +254,16 @@ | ||
| 252 | setValue (val) { | 254 | setValue (val) { |
| 253 | // 如果 step 是小数,且没有设置 precision,是有问题的 | 255 | // 如果 step 是小数,且没有设置 precision,是有问题的 |
| 254 | if (val && !isNaN(this.precision)) val = Number(Number(val).toFixed(this.precision)); | 256 | if (val && !isNaN(this.precision)) val = Number(Number(val).toFixed(this.precision)); |
| 255 | - | 257 | + |
| 258 | + const {min, max} = this; | ||
| 259 | + if (val!==null) { | ||
| 260 | + if (val > max) { | ||
| 261 | + val = max; | ||
| 262 | + } else if (val < min) { | ||
| 263 | + val = min; | ||
| 264 | + } | ||
| 265 | + } | ||
| 266 | + | ||
| 256 | this.$nextTick(() => { | 267 | this.$nextTick(() => { |
| 257 | this.currentValue = val; | 268 | this.currentValue = val; |
| 258 | this.$emit('input', val); | 269 | this.$emit('input', val); |
| @@ -278,42 +289,32 @@ | @@ -278,42 +289,32 @@ | ||
| 278 | } | 289 | } |
| 279 | }, | 290 | }, |
| 280 | change (event) { | 291 | change (event) { |
| 292 | + | ||
| 293 | + if (event.type == 'input' && !this.activeChange) return; | ||
| 281 | let val = event.target.value.trim(); | 294 | let val = event.target.value.trim(); |
| 282 | if (this.parser) { | 295 | if (this.parser) { |
| 283 | val = this.parser(val); | 296 | val = this.parser(val); |
| 284 | } | 297 | } |
| 285 | - | ||
| 286 | - if (event.type == 'input' && val.match(/^\-?\.?$|\.$/)) return; // prevent fire early if decimal. If no more input the change event will fire later | ||
| 287 | - | ||
| 288 | - const {min, max} = this; | 298 | + |
| 289 | const isEmptyString = val.length === 0; | 299 | const isEmptyString = val.length === 0; |
| 290 | - val = Number(val); | ||
| 291 | - | ||
| 292 | if(isEmptyString){ | 300 | if(isEmptyString){ |
| 293 | this.setValue(null); | 301 | this.setValue(null); |
| 294 | return; | 302 | return; |
| 295 | } | 303 | } |
| 296 | - if (event.type == 'change'){ | ||
| 297 | - if (val === this.currentValue && val > min && val < max) return; // already fired change for input event | ||
| 298 | - } | 304 | + if (event.type == 'input' && val.match(/^\-?\.?$|\.$/)) return; // prevent fire early if decimal. If no more input the change event will fire later |
| 305 | + | ||
| 306 | + val = Number(val); | ||
| 299 | 307 | ||
| 300 | - if (!isNaN(val) && !isEmptyString) { | 308 | + if (!isNaN(val)) { |
| 301 | this.currentValue = val; | 309 | this.currentValue = val; |
| 302 | - | ||
| 303 | - if (event.type == 'input' && val < min) return; // prevent fire early in case user is typing a bigger number. Change will handle this otherwise. | ||
| 304 | - if (val > max) { | ||
| 305 | - this.setValue(max); | ||
| 306 | - } else if (val < min) { | ||
| 307 | - this.setValue(min); | ||
| 308 | - } else { | ||
| 309 | - this.setValue(val); | ||
| 310 | - } | 310 | + this.setValue(val); |
| 311 | } else { | 311 | } else { |
| 312 | event.target.value = this.currentValue; | 312 | event.target.value = this.currentValue; |
| 313 | } | 313 | } |
| 314 | }, | 314 | }, |
| 315 | changeVal (val) { | 315 | changeVal (val) { |
| 316 | val = Number(val); | 316 | val = Number(val); |
| 317 | + //this.setValue(val); | ||
| 317 | if (!isNaN(val)) { | 318 | if (!isNaN(val)) { |
| 318 | const step = this.step; | 319 | const step = this.step; |
| 319 | 320 |