Blame view

src/components/input-number/input-number.vue 8.15 KB
7fa943eb   梁灏   init
1
2
3
4
5
6
7
  <template>
      <div :class="wrapClasses">
          <div :class="handlerClasses">
              <a
                  @click="up"
                  @mouse.down="preventDefault"
                  :class="upClasses">
95436eeb   梁灏   add InputNumber UI
8
                  <span :class="innerUpClasses" @click="preventDefault"></span>
7fa943eb   梁灏   init
9
10
11
12
13
              </a>
              <a
                  @click="down"
                  @mouse.down="preventDefault"
                  :class="downClasses">
95436eeb   梁灏   add InputNumber UI
14
                  <span :class="innerDownClasses" @click="preventDefault"></span>
7fa943eb   梁灏   init
15
16
17
18
19
20
              </a>
          </div>
          <div :class="inputWrapClasses">
              <input
                  :class="inputClasses"
                  :disabled="disabled"
c7a67856   子凡   fix
21
                  autocomplete="off"
7fa943eb   梁灏   init
22
23
24
25
26
27
28
29
30
31
32
33
                  @focus="focus"
                  @blur="blur"
                  @keydown.stop="keyDown"
                  @change="change"
                  :value="value">
          </div>
      </div>
  </template>
  <script>
      import { oneOf } from '../../utils/assist';
  
      const prefixCls = 'ivu-input-number';
95436eeb   梁灏   add InputNumber UI
34
      const iconPrefixCls = 'ivu-icon';
7fa943eb   梁灏   init
35
36
  
      function isValueNumber (value) {
8df29435   Rijn   changed regular e...
37
          return (/(^-?[0-9]+\.{1}\d+$)|(^-?[1-9][0-9]*$)|(^-?0{1}$)/).test(value + '');
7fa943eb   梁灏   init
38
39
      }
      function addNum (num1, num2) {
17e1fcf1   梁灏   init DatePicker
40
          let sq1, sq2, m;
7fa943eb   梁灏   init
41
          try {
b0893113   jingsam   :art: add eslint
42
              sq1 = num1.toString().split('.')[1].length;
7fa943eb   梁灏   init
43
44
45
46
47
          }
          catch (e) {
              sq1 = 0;
          }
          try {
b0893113   jingsam   :art: add eslint
48
              sq2 = num2.toString().split('.')[1].length;
7fa943eb   梁灏   init
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
          }
          catch (e) {
              sq2 = 0;
          }
  //        if (sq1 === 0 || sq2 === 0) {
  //            return num1 + num2;
  //        } else {
  //            m = Math.pow(10, Math.max(sq1, sq2));
  //            return (num1 * m + num2 * m) / m;
  //        }
          m = Math.pow(10, Math.max(sq1, sq2));
          return (num1 * m + num2 * m) / m;
      }
  
      export default {
          props: {
              max: {
                  type: Number,
                  default: Infinity
              },
              min: {
                  type: Number,
                  default: -Infinity
              },
              step: {
                  type: Number,
                  default: 1
              },
              value: {
                  type: Number,
                  default: 1
              },
              size: {
                  validator (value) {
                      return oneOf(value, ['small', 'large']);
                  }
              },
              disabled: {
                  type: Boolean,
                  default: false
              }
          },
          data () {
              return {
                  focused: false,
                  upDisabled: false,
c97c42ab   梁灏   support InputNumber
95
96
                  downDisabled: false,
                  currentValue: this.value
b0893113   jingsam   :art: add eslint
97
              };
7fa943eb   梁灏   init
98
99
100
101
102
103
104
105
106
107
          },
          computed: {
              wrapClasses () {
                  return [
                      `${prefixCls}`,
                      {
                          [`${prefixCls}-${this.size}`]: !!this.size,
                          [`${prefixCls}-disabled`]: this.disabled,
                          [`${prefixCls}-focused`]: this.focused
                      }
b0893113   jingsam   :art: add eslint
108
                  ];
7fa943eb   梁灏   init
109
110
111
112
113
114
115
116
117
118
119
              },
              handlerClasses () {
                  return `${prefixCls}-handler-wrap`;
              },
              upClasses () {
                  return [
                      `${prefixCls}-handler`,
                      `${prefixCls}-handler-up`,
                      {
                          [`${prefixCls}-handler-up-disabled`]: this.upDisabled
                      }
b0893113   jingsam   :art: add eslint
120
                  ];
7fa943eb   梁灏   init
121
122
              },
              innerUpClasses () {
95436eeb   梁灏   add InputNumber UI
123
                  return `${prefixCls}-handler-up-inner ${iconPrefixCls} ${iconPrefixCls}-ios-arrow-up`;
7fa943eb   梁灏   init
124
125
126
127
128
129
130
131
              },
              downClasses () {
                  return [
                      `${prefixCls}-handler`,
                      `${prefixCls}-handler-down`,
                      {
                          [`${prefixCls}-handler-down-disabled`]: this.downDisabled
                      }
b0893113   jingsam   :art: add eslint
132
                  ];
7fa943eb   梁灏   init
133
134
              },
              innerDownClasses () {
95436eeb   梁灏   add InputNumber UI
135
                  return `${prefixCls}-handler-down-inner ${iconPrefixCls} ${iconPrefixCls}-ios-arrow-down`;
7fa943eb   梁灏   init
136
137
138
              },
              inputWrapClasses () {
                  return `${prefixCls}-input-wrap`;
95436eeb   梁灏   add InputNumber UI
139
140
141
              },
              inputClasses () {
                  return `${prefixCls}-input`;
7fa943eb   梁灏   init
142
143
144
145
146
147
              }
          },
          methods: {
              preventDefault (e) {
                  e.preventDefault();
              },
1ff55186   梁灏   optimize InputNum...
148
149
150
              up (e) {
                  const targetVal = Number(e.target.value);
                  if (this.upDisabled && isNaN(targetVal)) {
7fa943eb   梁灏   init
151
152
                      return false;
                  }
1ff55186   梁灏   optimize InputNum...
153
                  this.changeStep('up', e);
7fa943eb   梁灏   init
154
              },
1ff55186   梁灏   optimize InputNum...
155
156
157
              down (e) {
                  const targetVal = Number(e.target.value);
                  if (this.downDisabled && isNaN(targetVal)) {
7fa943eb   梁灏   init
158
159
                      return false;
                  }
1ff55186   梁灏   optimize InputNum...
160
                  this.changeStep('down', e);
7fa943eb   梁灏   init
161
              },
1ff55186   梁灏   optimize InputNum...
162
              changeStep (type, e) {
7fa943eb   梁灏   init
163
164
165
166
                  if (this.disabled) {
                      return false;
                  }
  
1ff55186   梁灏   optimize InputNum...
167
                  const targetVal = Number(e.target.value);
c97c42ab   梁灏   support InputNumber
168
                  let val = Number(this.currentValue);
7fa943eb   梁灏   init
169
170
171
172
173
                  const step = Number(this.step);
                  if (isNaN(val)) {
                      return false;
                  }
  
1ff55186   梁灏   optimize InputNum...
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
                  // input a number, and key up or down
                  if (!isNaN(targetVal)) {
                      if (type === 'up') {
                          if (addNum(targetVal, step) <= this.max) {
                              val = targetVal;
                          } else {
                              return false;
                          }
                      } else if (type === 'down') {
                          if (addNum(targetVal, -step) >= this.min) {
                              val = targetVal;
                          } else {
                              return false;
                          }
                      }
                  }
  
                  if (type === 'up') {
7fa943eb   梁灏   init
192
                      val = addNum(val, step);
1ff55186   梁灏   optimize InputNum...
193
                  } else if (type === 'down') {
7fa943eb   梁灏   init
194
195
196
197
198
                      val = addNum(val, -step);
                  }
                  this.setValue(val);
              },
              setValue (val) {
0b94936a   梁灏   fixed #28
199
                  this.$nextTick(() => {
c97c42ab   梁灏   support InputNumber
200
201
                      this.currentValue = val;
                      this.$emit('input', val);
4a260ed5   梁灏   update InputNumber
202
                      this.$emit('on-change', val);
c97c42ab   梁灏   support InputNumber
203
204
                      // todo 事件
  //                    this.$dispatch('on-form-change', val);
0b94936a   梁灏   fixed #28
205
                  });
7fa943eb   梁灏   init
206
207
208
209
210
211
212
213
214
215
              },
              focus () {
                  this.focused = true;
              },
              blur () {
                  this.focused = false;
              },
              keyDown (e) {
                  if (e.keyCode === 38) {
                      e.preventDefault();
1ff55186   梁灏   optimize InputNum...
216
                      this.up(e);
7fa943eb   梁灏   init
217
218
                  } else if (e.keyCode === 40) {
                      e.preventDefault();
1ff55186   梁灏   optimize InputNum...
219
                      this.down(e);
7fa943eb   梁灏   init
220
221
222
223
224
225
226
227
228
229
                  }
              },
              change (event) {
                  let val = event.target.value.trim();
  
                  const max = this.max;
                  const min = this.min;
  
                  if (isValueNumber(val)) {
                      val = Number(val);
c97c42ab   梁灏   support InputNumber
230
                      this.currentValue = val;
0b94936a   梁灏   fixed #28
231
  
7fa943eb   梁灏   init
232
233
234
235
236
237
238
239
                      if (val > max) {
                          this.setValue(max);
                      } else if (val < min) {
                          this.setValue(min);
                      } else {
                          this.setValue(val);
                      }
                  } else {
c97c42ab   梁灏   support InputNumber
240
                      event.target.value = this.currentValue;
7fa943eb   梁灏   init
241
                  }
0b94936a   梁灏   fixed #28
242
243
              },
              changeVal (val) {
7fa943eb   梁灏   init
244
245
246
                  if (isValueNumber(val) || val === 0) {
                      val = Number(val);
                      const step = this.step;
0b94936a   梁灏   fixed #28
247
248
249
  
                      this.upDisabled = val + step > this.max;
                      this.downDisabled = val - step < this.min;
7fa943eb   梁灏   init
250
251
252
253
254
                  } else {
                      this.upDisabled = true;
                      this.downDisabled = true;
                  }
              }
0b94936a   梁灏   fixed #28
255
          },
c97c42ab   梁灏   support InputNumber
256
257
          mounted () {
              this.changeVal(this.currentValue);
0b94936a   梁灏   fixed #28
258
259
260
          },
          watch: {
              value (val) {
c97c42ab   梁灏   support InputNumber
261
262
263
                  this.currentValue = val;
              },
              currentValue (val) {
0b94936a   梁灏   fixed #28
264
265
                  this.changeVal(val);
              }
7fa943eb   梁灏   init
266
          }
b0893113   jingsam   :art: add eslint
267
      };
c7a67856   子凡   fix
268
  </script>