Commit cec470ebd5808b155da0a23744626932b0613ced

Authored by Aresn
Committed by GitHub
2 parents 164f7bcb 457d6c69

Merge pull request #4315 from huanghong1125/input-number

update input-number
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  
... ...