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 | 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 | 75 | </div> |
59 | 76 | </template> |
60 | 77 | <script> |
... | ... | @@ -68,16 +85,18 @@ |
68 | 85 | formatter: (value) => `$ ${value}`.replace(/\B(?=(\d{3})+(?!\d))/g, ','), |
69 | 86 | parser: (value) => value.replace(/\$\s?|(,*)/g, ''), |
70 | 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 | 93 | methods: { |
75 | 94 | focus (e) { |
76 | - e.target.select() | |
95 | + e.target.select(); | |
77 | 96 | }, |
78 | 97 | change (v) { |
79 | - console.log(v) | |
98 | + console.log(v); | |
80 | 99 | } |
81 | 100 | } |
82 | - } | |
101 | + }; | |
83 | 102 | </script> | ... | ... |
src/components/input-number/input-number.vue
... | ... | @@ -3,13 +3,11 @@ |
3 | 3 | <div :class="handlerClasses"> |
4 | 4 | <a |
5 | 5 | @click="up" |
6 | - @mousedown="preventDefault" | |
7 | 6 | :class="upClasses"> |
8 | 7 | <span :class="innerUpClasses" @click="preventDefault"></span> |
9 | 8 | </a> |
10 | 9 | <a |
11 | 10 | @click="down" |
12 | - @mousedown="preventDefault" | |
13 | 11 | :class="downClasses"> |
14 | 12 | <span :class="innerDownClasses" @click="preventDefault"></span> |
15 | 13 | </a> |
... | ... | @@ -82,6 +80,10 @@ |
82 | 80 | type: Number, |
83 | 81 | default: 1 |
84 | 82 | }, |
83 | + activeChange:{ | |
84 | + type:Boolean, | |
85 | + default:true | |
86 | + }, | |
85 | 87 | value: { |
86 | 88 | type: Number, |
87 | 89 | default: 1 |
... | ... | @@ -252,7 +254,16 @@ |
252 | 254 | setValue (val) { |
253 | 255 | // 如果 step 是小数,且没有设置 precision,是有问题的 |
254 | 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 | 267 | this.$nextTick(() => { |
257 | 268 | this.currentValue = val; |
258 | 269 | this.$emit('input', val); |
... | ... | @@ -278,42 +289,32 @@ |
278 | 289 | } |
279 | 290 | }, |
280 | 291 | change (event) { |
292 | + | |
293 | + if (event.type == 'input' && !this.activeChange) return; | |
281 | 294 | let val = event.target.value.trim(); |
282 | 295 | if (this.parser) { |
283 | 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 | 299 | const isEmptyString = val.length === 0; |
290 | - val = Number(val); | |
291 | - | |
292 | 300 | if(isEmptyString){ |
293 | 301 | this.setValue(null); |
294 | 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 | 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 | 311 | } else { |
312 | 312 | event.target.value = this.currentValue; |
313 | 313 | } |
314 | 314 | }, |
315 | 315 | changeVal (val) { |
316 | 316 | val = Number(val); |
317 | + //this.setValue(val); | |
317 | 318 | if (!isNaN(val)) { |
318 | 319 | const step = this.step; |
319 | 320 | ... | ... |