liuxiaolong
2019-05-06 2ab7a76a38fbf8fa107bf6371f5410ba54e1d394
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
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
<template>
  <div></div>
</template>
 
<style src="./nouislider.scss" lang="scss"></style>
 
<script>
import noUiSlider from 'nouislider'
 
export default {
  name: 'nouislider',
  props: [
    'value',
    'options',
    'disabled'
  ],
  mounted () {
    this.initSlider(this.options)
  },
  beforeDestroy () {
    this.destroySlider()
    this._oldValue = null
  },
  watch: {
    value (value) {
      if (value.join(';') === this._oldValue) return
 
      this._oldValue = value.join(';')
      this.$el.noUiSlider.set(value)
    },
    options (options) {
      // Reinitialize slider
      this.destroySlider()
      this.initSlider(options)
    },
    disabled (isDisabled) {
      this.disableSlider(isDisabled)
    }
  },
  methods: {
    initSlider (options) {
      // Set start value
      if (options) {
        options.start = this.value
      } else {
        options = { start: this.value }
      }
 
      // Initialize slider
      noUiSlider.create(this.$el, options)
 
      // Update value on slide change
      this.$el.noUiSlider.on('set', (...args) => {
        if (args[0].join(';') === this._oldValue) return
 
        this._oldValue = args[0].join(';')
        this.$emit('input', args[0])
        this.$emit('set', args[0])
      })
 
      // Events
      this.$el.noUiSlider.on('update', (...args) => this.$emit('update', args))
      this.$el.noUiSlider.on('slide', (...args) => this.$emit('slide', args))
      this.$el.noUiSlider.on('change', (...args) => this.$emit('change', args))
      this.$el.noUiSlider.on('start', (...args) => this.$emit('start', args))
      this.$el.noUiSlider.on('end', (...args) => this.$emit('end', args))
 
      // Disable on init
      this.disableSlider(this.disabled)
    },
 
    disableSlider (isDisabled) {
      if (isDisabled) {
        this.$el.setAttribute('disabled', 'disabled')
      } else {
        this.$el.removeAttribute('disabled')
      }
    },
 
    destroySlider () {
      this.$el.noUiSlider.off()
      this.$el.noUiSlider.destroy()
    }
  }
}
</script>