Commit 1c803cdfb06c4f423f7186615517f6801cebee4f
1 parent
79288d43
support Slider
support Slider
Showing
3 changed files
with
85 additions
and
87 deletions
Show diff stats
src/components/base/popper.js
src/components/slider/slider.vue
... | ... | @@ -5,10 +5,10 @@ |
5 | 5 | :min="min" |
6 | 6 | :max="max" |
7 | 7 | :step="step" |
8 | - :value="value" | |
8 | + :value="currentValue" | |
9 | 9 | :disabled="disabled" |
10 | 10 | @on-change="handleInputChange"></Input-number> |
11 | - <div :class="[prefixCls + '-wrap']" v-el:slider @click.self="sliderClick"> | |
11 | + <div :class="[prefixCls + '-wrap']" ref="slider" @click.self="sliderClick"> | |
12 | 12 | <template v-if="showStops"> |
13 | 13 | <div :class="[prefixCls + '-stop']" v-for="item in stops" :style="{ 'left': item + '%' }" @click.self="sliderClick"></div> |
14 | 14 | </template> |
... | ... | @@ -18,7 +18,7 @@ |
18 | 18 | :class="[prefixCls + '-button-wrap']" |
19 | 19 | :style="{left: firstPosition + '%'}" |
20 | 20 | @mousedown="onFirstButtonDown"> |
21 | - <Tooltip :controlled="firstDragging" placement="top" :content="tipFormat(value[0])" :disabled="tipDisabled" :always="showTip === 'always'" v-ref:tooltip> | |
21 | + <Tooltip :controlled="firstDragging" placement="top" :content="tipFormat(currentValue[0])" :disabled="tipDisabled" :always="showTip === 'always'" ref="tooltip"> | |
22 | 22 | <div :class="button1Classes"></div> |
23 | 23 | </Tooltip> |
24 | 24 | </div> |
... | ... | @@ -26,7 +26,7 @@ |
26 | 26 | :class="[prefixCls + '-button-wrap']" |
27 | 27 | :style="{left: secondPosition + '%'}" |
28 | 28 | @mousedown="onSecondButtonDown"> |
29 | - <Tooltip :controlled="secondDragging" placement="top" :content="tipFormat(value[1])" :disabled="tipDisabled" :always="showTip === 'always'" v-ref:tooltip2> | |
29 | + <Tooltip :controlled="secondDragging" placement="top" :content="tipFormat(currentValue[1])" :disabled="tipDisabled" :always="showTip === 'always'" ref="tooltip2"> | |
30 | 30 | <div :class="button2Classes"></div> |
31 | 31 | </Tooltip> |
32 | 32 | </div> |
... | ... | @@ -36,7 +36,7 @@ |
36 | 36 | :class="[prefixCls + '-button-wrap']" |
37 | 37 | :style="{left: singlePosition + '%'}" |
38 | 38 | @mousedown="onSingleButtonDown"> |
39 | - <Tooltip :controlled="dragging" placement="top" :content="tipFormat(value)" :disabled="tipDisabled" :always="showTip === 'always'" v-ref:tooltip> | |
39 | + <Tooltip :controlled="dragging" placement="top" :content="tipFormat(currentValue)" :disabled="tipDisabled" :always="showTip === 'always'" ref="tooltip"> | |
40 | 40 | <div :class="buttonClasses"></div> |
41 | 41 | </Tooltip> |
42 | 42 | </div> |
... | ... | @@ -103,6 +103,7 @@ |
103 | 103 | data () { |
104 | 104 | return { |
105 | 105 | prefixCls: prefixCls, |
106 | + currentValue: this.value, | |
106 | 107 | dragging: false, |
107 | 108 | firstDragging: false, |
108 | 109 | secondDragging: false, |
... | ... | @@ -118,6 +119,22 @@ |
118 | 119 | secondPosition: (this.value[1] - this.min) / (this.max - this.min) * 100 |
119 | 120 | }; |
120 | 121 | }, |
122 | + watch: { | |
123 | + value (val) { | |
124 | + this.currentValue = val; | |
125 | + }, | |
126 | + currentValue (val) { | |
127 | + this.$nextTick(() => { | |
128 | + this.$refs.tooltip.updatePopper(); | |
129 | + if (this.range) { | |
130 | + this.$refs.tooltip2.updatePopper(); | |
131 | + } | |
132 | + }); | |
133 | + this.updateValue(val); | |
134 | + this.$emit('input', val); | |
135 | + this.$emit('on-input', val); | |
136 | + } | |
137 | + }, | |
121 | 138 | computed: { |
122 | 139 | classes () { |
123 | 140 | return [ |
... | ... | @@ -158,12 +175,12 @@ |
158 | 175 | |
159 | 176 | if (this.range) { |
160 | 177 | style = { |
161 | - width: (this.value[1] - this.value[0]) / (this.max - this.min) * 100 + '%', | |
162 | - left: (this.value[0] - this.min) / (this.max - this.min) * 100 + '%' | |
178 | + width: (this.currentValue[1] - this.currentValue[0]) / (this.max - this.min) * 100 + '%', | |
179 | + left: (this.currentValue[0] - this.min) / (this.max - this.min) * 100 + '%' | |
163 | 180 | }; |
164 | 181 | } else { |
165 | 182 | style = { |
166 | - width: (this.value - this.min) / (this.max - this.min) * 100 + '%' | |
183 | + width: (this.currentValue - this.min) / (this.max - this.min) * 100 + '%' | |
167 | 184 | }; |
168 | 185 | } |
169 | 186 | |
... | ... | @@ -179,22 +196,10 @@ |
179 | 196 | return result; |
180 | 197 | }, |
181 | 198 | sliderWidth () { |
182 | - return parseInt(getStyle(this.$els.slider, 'width'), 10); | |
199 | + return parseInt(getStyle(this.$refs.slider, 'width'), 10); | |
183 | 200 | }, |
184 | 201 | tipDisabled () { |
185 | - return this.tipFormat(this.value[0]) === null || this.showTip === 'never'; | |
186 | - } | |
187 | - }, | |
188 | - watch: { | |
189 | - value (val) { | |
190 | - this.$nextTick(() => { | |
191 | - this.$refs.tooltip.updatePopper(); | |
192 | - if (this.range) { | |
193 | - this.$refs.tooltip2.updatePopper(); | |
194 | - } | |
195 | - }); | |
196 | - this.updateValue(val); | |
197 | - this.$emit('on-input', this.value); | |
202 | + return this.tipFormat(this.currentValue[0]) === null || this.showTip === 'never'; | |
198 | 203 | } |
199 | 204 | }, |
200 | 205 | methods: { |
... | ... | @@ -224,23 +229,23 @@ |
224 | 229 | } |
225 | 230 | if (this.value[0] === value[0] && this.value[1] === value[1]) return; |
226 | 231 | |
227 | - this.value = value; | |
228 | - this.setFirstPosition(this.value[0]); | |
229 | - this.setSecondPosition(this.value[1]); | |
232 | + this.currentValue = value; | |
233 | + this.setFirstPosition(this.currentValue[0]); | |
234 | + this.setSecondPosition(this.currentValue[1]); | |
230 | 235 | } else { |
231 | 236 | if (val < this.min) { |
232 | - this.value = this.min; | |
237 | + this.currentValue = this.min; | |
233 | 238 | } |
234 | 239 | if (val > this.max) { |
235 | - this.value = this.max; | |
240 | + this.currentValue = this.max; | |
236 | 241 | } |
237 | - this.setSinglePosition(this.value); | |
242 | + this.setSinglePosition(this.currentValue); | |
238 | 243 | } |
239 | 244 | }, |
240 | 245 | sliderClick (event) { |
241 | 246 | if (this.disabled) return; |
242 | 247 | const currentX = event.clientX; |
243 | - const sliderOffsetLeft = this.$els.slider.getBoundingClientRect().left; | |
248 | + const sliderOffsetLeft = this.$refs.slider.getBoundingClientRect().left; | |
244 | 249 | const newPos = (currentX - sliderOffsetLeft) / this.sliderWidth * 100; |
245 | 250 | |
246 | 251 | if (this.range) { |
... | ... | @@ -297,13 +302,14 @@ |
297 | 302 | const lengthPerStep = 100 / ((this.max - this.min) / this.step); |
298 | 303 | const steps = Math.round(newPos / lengthPerStep); |
299 | 304 | |
300 | - this.value = Math.round(steps * lengthPerStep * (this.max - this.min) * 0.01 + this.min); | |
301 | - this.setSinglePosition(this.value); | |
305 | + this.currentValue = Math.round(steps * lengthPerStep * (this.max - this.min) * 0.01 + this.min); | |
306 | + this.setSinglePosition(this.currentValue); | |
302 | 307 | if (!this.dragging) { |
303 | - if (this.value !== this.oldSingleValue) { | |
304 | - this.$emit('on-change', this.value); | |
305 | - this.$dispatch('on-form-change', this.value); | |
306 | - this.oldSingleValue = this.value; | |
308 | + if (this.currentValue !== this.oldSingleValue) { | |
309 | + this.$emit('on-change', this.currentValue); | |
310 | + // todo 事件 | |
311 | +// this.$dispatch('on-form-change', this.currentValue); | |
312 | + this.oldSingleValue = this.currentValue; | |
307 | 313 | } |
308 | 314 | } |
309 | 315 | } |
... | ... | @@ -312,10 +318,11 @@ |
312 | 318 | this.singlePosition = (val - this.min) / (this.max - this.min) * 100; |
313 | 319 | }, |
314 | 320 | handleInputChange (val) { |
315 | - this.value = val; | |
321 | + this.currentValue = val; | |
316 | 322 | this.setSinglePosition(val); |
317 | - this.$emit('on-change', this.value); | |
318 | - this.$dispatch('on-form-change', this.value); | |
323 | + this.$emit('on-change', this.currentValue); | |
324 | + // todo 事件 | |
325 | +// this.$dispatch('on-form-change', this.currentValue); | |
319 | 326 | }, |
320 | 327 | // for range use first |
321 | 328 | onFirstButtonDown (event) { |
... | ... | @@ -353,13 +360,14 @@ |
353 | 360 | const lengthPerStep = 100 / ((this.max - this.min) / this.step); |
354 | 361 | const steps = Math.round(newPos / lengthPerStep); |
355 | 362 | |
356 | - this.value = [Math.round(steps * lengthPerStep * (this.max - this.min) * 0.01 + this.min), this.value[1]]; | |
357 | - this.setFirstPosition(this.value[0]); | |
363 | + this.currentValue = [Math.round(steps * lengthPerStep * (this.max - this.min) * 0.01 + this.min), this.currentValue[1]]; | |
364 | + this.setFirstPosition(this.currentValue[0]); | |
358 | 365 | if (!this.firstDragging) { |
359 | - if (this.value[0] !== this.oldFirstValue) { | |
360 | - this.$emit('on-change', this.value); | |
361 | - this.$dispatch('on-form-change', this.value); | |
362 | - this.oldFirstValue = this.value[0]; | |
366 | + if (this.currentValue[0] !== this.oldFirstValue) { | |
367 | + this.$emit('on-change', this.currentValue); | |
368 | + // todo 事件 | |
369 | +// this.$dispatch('on-form-change', this.currentValue); | |
370 | + this.oldFirstValue = this.currentValue[0]; | |
363 | 371 | } |
364 | 372 | } |
365 | 373 | } |
... | ... | @@ -403,13 +411,14 @@ |
403 | 411 | const lengthPerStep = 100 / ((this.max - this.min) / this.step); |
404 | 412 | const steps = Math.round(newPos / lengthPerStep); |
405 | 413 | |
406 | - this.value = [this.value[0], Math.round(steps * lengthPerStep * (this.max - this.min) * 0.01 + this.min)]; | |
407 | - this.setSecondPosition(this.value[1]); | |
414 | + this.currentValue = [this.currentValue[0], Math.round(steps * lengthPerStep * (this.max - this.min) * 0.01 + this.min)]; | |
415 | + this.setSecondPosition(this.currentValue[1]); | |
408 | 416 | if (!this.secondDragging) { |
409 | - if (this.value[1] !== this.oldSecondValue) { | |
410 | - this.$emit('on-change', this.value); | |
411 | - this.$dispatch('on-form-change', this.value); | |
412 | - this.oldSecondValue = this.value[1]; | |
417 | + if (this.currentValue[1] !== this.oldSecondValue) { | |
418 | + this.$emit('on-change', this.currentValue); | |
419 | + // todo 事件 | |
420 | +// this.$dispatch('on-form-change', this.currentValue); | |
421 | + this.oldSecondValue = this.currentValue[1]; | |
413 | 422 | } |
414 | 423 | } |
415 | 424 | } |
... | ... | @@ -418,19 +427,19 @@ |
418 | 427 | this.secondPosition = (val - this.min) / (this.max - this.min) * 100; |
419 | 428 | } |
420 | 429 | }, |
421 | - ready () { | |
430 | + mounted () { | |
422 | 431 | if (this.range) { |
423 | - const isArray = Array.isArray(this.value); | |
424 | - if (!isArray || (isArray && this.value.length != 2) || (isArray && (isNaN(this.value[0]) || isNaN(this.value[1])))) { | |
425 | - this.value = [this.min, this.max]; | |
432 | + const isArray = Array.isArray(this.currentValue); | |
433 | + if (!isArray || (isArray && this.currentValue.length != 2) || (isArray && (isNaN(this.currentValue[0]) || isNaN(this.currentValue[1])))) { | |
434 | + this.currentValue = [this.min, this.max]; | |
426 | 435 | } else { |
427 | - this.updateValue(this.value, true); | |
436 | + this.updateValue(this.currentValue, true); | |
428 | 437 | } |
429 | 438 | } else { |
430 | - if (typeof this.value !== 'number') { | |
431 | - this.value = this.min; | |
439 | + if (typeof this.currentValue !== 'number') { | |
440 | + this.currentValue = this.min; | |
432 | 441 | } |
433 | - this.updateValue(this.value); | |
442 | + this.updateValue(this.currentValue); | |
434 | 443 | } |
435 | 444 | } |
436 | 445 | }; | ... | ... |
test/routers/slider.vue
1 | 1 | <template> |
2 | - <div style="width: 140px;margin:100px;"> | |
3 | - {{ value }} | |
4 | - <Slider @on-change="change" @on-input="input" :step="15"></Slider> | |
5 | - <Slider :value="40" :tip-format="format"></Slider> | |
6 | - <Slider :value.sync="value" show-input show-stops range @on-change="change" @on-input="input" :step="13"></Slider> | |
7 | - <Slider :max="10"></Slider> | |
8 | - <Slider :step="13"></Slider> | |
9 | - <Slider :step="13" :max="60"></Slider> | |
10 | - <Icon type="checkmark-circled" size="40" color="#f60"></Icon> | |
11 | - <p>附近的首付款是东方红看就是</p> | |
12 | - <div class="ivu-article"> | |
13 | - <a href="http://www.iviewui.com" target="_blank">iView</a> | |
14 | - </div> | |
15 | - <Slider :value="75"></Slider> | |
16 | - <Slider :value="[20, 50]" range></Slider> | |
17 | - <Slider :value="[20, 50]" show-tip="always"></Slider> | |
18 | - <Slider :value="[20, 50]" show-tip="hover"></Slider> | |
19 | - <Slider :value="[20, 50]" show-tip="never"></Slider> | |
2 | + <div style="margin: 100px;"> | |
3 | + <Slider v-model="value1" :step="5" show-input></Slider> | |
4 | + <Slider v-model="value2" range></Slider> | |
5 | + <Slider v-model="value3" range disabled></Slider> | |
6 | + {{ value1 }}{{value2}} | |
7 | + <div @click="value1 = 13">change value1</div> | |
8 | + <br> | |
9 | + <Slider :value="value9" :tip-format="format"></Slider> | |
10 | + <Slider :value="value10" :tip-format="hideFormat"></Slider> | |
20 | 11 | </div> |
21 | 12 | </template> |
22 | 13 | <script> |
23 | - import { Slider, Icon } from 'iview'; | |
24 | 14 | export default { |
25 | - components: { Slider, Icon }, | |
26 | 15 | data () { |
27 | 16 | return { |
28 | - value: [20, 50] | |
17 | + value1: 25, | |
18 | + value2: [20, 50], | |
19 | + value3: [20, 50], | |
20 | + value9: 25, | |
21 | + value10: 25 | |
29 | 22 | } |
30 | 23 | }, |
31 | 24 | methods: { |
32 | 25 | format (val) { |
33 | - return null; | |
34 | - return `进度:${val}%` | |
35 | - }, | |
36 | - change (data) { | |
37 | - console.log(data) | |
26 | + return '进度' + val + '%'; | |
38 | 27 | }, |
39 | - input (value) { | |
40 | - console.log(value) | |
28 | + hideFormat () { | |
29 | + return null; | |
41 | 30 | } |
42 | 31 | } |
43 | 32 | } | ... | ... |