Commit ce176e21900ee3fa7da22e75dec49779ea38193c
1 parent
4f2dc7e3
fixed #3081
Showing
2 changed files
with
71 additions
and
28 deletions
Show diff stats
examples/routers/input-number.vue
| 1 | +<!--<template>--> | |
| 2 | + <!--<div>--> | |
| 3 | + <!--<!–<Input-number :max="max" name="he" :min="-1" v-model="v1" :autofocus="autofocus"></Input-number>–>--> | |
| 4 | + <!--<!–{{ v1 }}–>--> | |
| 5 | + <!--<!–<div @click="c">change v1</div>–>--> | |
| 6 | + <!--<!–<div @click="changeMax">change max</div>–>--> | |
| 7 | + <!--<!–<Input-number disabled :max="10" :min="1" :step="1.2" v-model="v2"></Input-number>–>--> | |
| 8 | + <!--<!–<Input-number :max="10" :min="1" v-model="obj.v"></Input-number>–>--> | |
| 9 | + <!--<InputNumber :editable="false" :max="10" :min="1" :step="1.2" v-model="value2"></InputNumber>--> | |
| 10 | + <!--<InputNumber :precision="1" :max="10" :min="1" :step="0.1" v-model="value1"></InputNumber>--> | |
| 11 | + <!--</div>--> | |
| 12 | +<!--</template>--> | |
| 13 | +<!--<script>--> | |
| 14 | + <!--export default {--> | |
| 15 | + <!--props: {},--> | |
| 16 | + <!--data () {--> | |
| 17 | + <!--return {--> | |
| 18 | + <!--v1: 1,--> | |
| 19 | + <!--v2: 1,--> | |
| 20 | + <!--max: 10,--> | |
| 21 | + <!--autofocus: true,--> | |
| 22 | + <!--obj: {--> | |
| 23 | + | |
| 24 | + <!--},--> | |
| 25 | + <!--value1: 1.0,--> | |
| 26 | + <!--value2: 1--> | |
| 27 | + <!--};--> | |
| 28 | + <!--},--> | |
| 29 | + <!--computed: {},--> | |
| 30 | + <!--methods: {--> | |
| 31 | + <!--c () {--> | |
| 32 | + <!--this.v1 = 5;--> | |
| 33 | + <!--},--> | |
| 34 | + <!--changeMax () {--> | |
| 35 | + <!--this.max++;--> | |
| 36 | + <!--}--> | |
| 37 | + <!--}--> | |
| 38 | + <!--};--> | |
| 39 | +<!--</script>--> | |
| 40 | + | |
| 41 | + | |
| 1 | 42 | <template> |
| 2 | 43 | <div> |
| 3 | - <!--<Input-number :max="max" name="he" :min="-1" v-model="v1" :autofocus="autofocus"></Input-number>--> | |
| 4 | - <!--{{ v1 }}--> | |
| 5 | - <!--<div @click="c">change v1</div>--> | |
| 6 | - <!--<div @click="changeMax">change max</div>--> | |
| 7 | - <!--<Input-number disabled :max="10" :min="1" :step="1.2" v-model="v2"></Input-number>--> | |
| 8 | - <!--<Input-number :max="10" :min="1" v-model="obj.v"></Input-number>--> | |
| 9 | - <InputNumber :editable="false" :max="10" :min="1" :step="1.2" v-model="value2"></InputNumber> | |
| 10 | - <InputNumber :precision="1" :max="10" :min="1" :step="0.1" v-model="value1"></InputNumber> | |
| 44 | + <InputNumber :max="1000000000" :min="1" v-model="value1" :formatter="formatter" :parser="parser" @on-change="change" style="width: 200px"></InputNumber> | |
| 45 | + <InputNumber :max="1000000000" :min="1" v-model="value2" :formatter="formatter2" :parser="parser2" @on-change="change" style="width: 200px"></InputNumber> | |
| 11 | 46 | </div> |
| 12 | 47 | </template> |
| 13 | 48 | <script> |
| 14 | 49 | export default { |
| 15 | - props: {}, | |
| 16 | 50 | data () { |
| 17 | 51 | return { |
| 18 | - v1: 1, | |
| 19 | - v2: 1, | |
| 20 | - max: 10, | |
| 21 | - autofocus: true, | |
| 22 | - obj: { | |
| 23 | - | |
| 24 | - }, | |
| 25 | - value1: 1.0, | |
| 26 | - value2: 1 | |
| 27 | - }; | |
| 52 | + value1: 1800000, | |
| 53 | + value2: 55, | |
| 54 | + formatter: (value) => `$ ${value}`.replace(/\B(?=(\d{3})+(?!\d))/g, ','), | |
| 55 | + parser: (value) => value.replace(/\$\s?|(,*)/g, ''), | |
| 56 | + formatter2: (value) => `${value}%`, | |
| 57 | + parser2: (value) => value.replace('%', '') | |
| 58 | + } | |
| 28 | 59 | }, |
| 29 | - computed: {}, | |
| 30 | 60 | methods: { |
| 31 | - c () { | |
| 32 | - this.v1 = 5; | |
| 33 | - }, | |
| 34 | - changeMax () { | |
| 35 | - this.max++; | |
| 61 | + change (v) { | |
| 62 | + console.log(v) | |
| 36 | 63 | } |
| 37 | 64 | } |
| 38 | - }; | |
| 39 | -</script> | |
| 40 | 65 | \ No newline at end of file |
| 66 | + } | |
| 67 | +</script> | ... | ... |
src/components/input-number/input-number.vue
| ... | ... | @@ -29,7 +29,7 @@ |
| 29 | 29 | @change="change" |
| 30 | 30 | :readonly="readonly || !editable" |
| 31 | 31 | :name="name" |
| 32 | - :value="precisionValue"> | |
| 32 | + :value="formatterValue"> | |
| 33 | 33 | </div> |
| 34 | 34 | </div> |
| 35 | 35 | </template> |
| ... | ... | @@ -113,6 +113,12 @@ |
| 113 | 113 | }, |
| 114 | 114 | elementId: { |
| 115 | 115 | type: String |
| 116 | + }, | |
| 117 | + formatter: { | |
| 118 | + type: Function | |
| 119 | + }, | |
| 120 | + parser: { | |
| 121 | + type: Function | |
| 116 | 122 | } |
| 117 | 123 | }, |
| 118 | 124 | data () { |
| ... | ... | @@ -170,6 +176,13 @@ |
| 170 | 176 | precisionValue () { |
| 171 | 177 | // can not display 1.0 |
| 172 | 178 | return this.precision ? this.currentValue.toFixed(this.precision) : this.currentValue; |
| 179 | + }, | |
| 180 | + formatterValue () { | |
| 181 | + if (this.formatter) { | |
| 182 | + return this.formatter(this.precisionValue); | |
| 183 | + } else { | |
| 184 | + return this.precisionValue; | |
| 185 | + } | |
| 173 | 186 | } |
| 174 | 187 | }, |
| 175 | 188 | methods: { |
| ... | ... | @@ -256,6 +269,9 @@ |
| 256 | 269 | }, |
| 257 | 270 | change (event) { |
| 258 | 271 | let val = event.target.value.trim(); |
| 272 | + if (this.parser) { | |
| 273 | + val = this.parser(val); | |
| 274 | + } | |
| 259 | 275 | |
| 260 | 276 | if (event.type == 'input' && val.match(/^\-?\.?$|\.$/)) return; // prevent fire early if decimal. If no more input the change event will fire later |
| 261 | 277 | ... | ... |