index.vue 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. <template>
  2. <el-select ref="dragSelect" v-model="selectVal" v-bind="$attrs" class="drag-select" multiple v-on="$listeners">
  3. <slot />
  4. </el-select>
  5. </template>
  6. <script>
  7. import Sortable from 'sortablejs'
  8. export default {
  9. name: 'DragSelect',
  10. props: {
  11. value: {
  12. type: Array,
  13. required: true
  14. }
  15. },
  16. computed: {
  17. selectVal: {
  18. get() {
  19. return [...this.value]
  20. },
  21. set(val) {
  22. this.$emit('input', [...val])
  23. }
  24. }
  25. },
  26. mounted() {
  27. this.setSort()
  28. },
  29. methods: {
  30. setSort() {
  31. const el = this.$refs.dragSelect.$el.querySelectorAll('.el-select__tags > span')[0]
  32. this.sortable = Sortable.create(el, {
  33. ghostClass: 'sortable-ghost', // Class name for the drop placeholder,
  34. setData: function(dataTransfer) {
  35. dataTransfer.setData('Text', '')
  36. // to avoid Firefox bug
  37. // Detail see : https://github.com/RubaXa/Sortable/issues/1012
  38. },
  39. onEnd: evt => {
  40. const targetRow = this.value.splice(evt.oldIndex, 1)[0]
  41. this.value.splice(evt.newIndex, 0, targetRow)
  42. }
  43. })
  44. }
  45. }
  46. }
  47. </script>
  48. <style lang="scss" scoped>
  49. .drag-select {
  50. ::v-deep {
  51. .sortable-ghost {
  52. opacity: .8;
  53. color: #fff !important;
  54. background: #42b983 !important;
  55. }
  56. .el-tag {
  57. cursor: pointer;
  58. }
  59. }
  60. }
  61. </style>