12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- <!--
- * @Descripttion:
- * @Author: liu.shiyi
- * @Date: 2023-03-14 10:20:54
- * @LastEditTime: 2023-05-23 15:14:47
- -->
- <template>
- <el-select
- ref="dragSelect"
- v-model="selectVal"
- v-bind="$attrs"
- class="drag-select"
- v-on="$listeners"
- >
- <slot />
- </el-select>
- </template>
- <script>
- import Sortable from 'sortablejs'
- export default {
- name: 'DragSelect',
- props: {
- value: {
- type: [Array, String],
- required: true
- }
- },
- computed: {
- selectVal: {
- get () {
- if (Array.isArray(this.value)) {
- return [...this.value]
- } else {
- return this.value
- }
- },
- set (val) {
- if (Array.isArray(val)) {
- this.$emit('input', [...val])
- } else {
- this.$emit('input', val)
- }
- }
- }
- },
- mounted () {
- this.setSort()
- },
- methods: {
- setSort () {
- const el = this.$refs.dragSelect.$el.querySelectorAll(
- '.el-select__tags > span'
- )[0]
- if (el) {
- this.sortable = Sortable.create(el, {
- animation: 350,
- ghostClass: 'sortable-ghost',
- setData: function (dataTransfer) {
- dataTransfer.setData('Text', '')
- },
- onEnd: (evt) => {
- const targetRow = this.value.splice(evt.oldIndex, 1)[0]
- this.value.splice(evt.newIndex, 0, targetRow)
- }
- })
- }
- }
- }
- }
- </script>
- <style lang="scss" scoped>
- .drag-select {
- ::v-deep {
- .sortable-ghost {
- opacity: 0.8;
- color: #fff !important;
- background:var(--bs-el-color-primary) !important;
- }
- .el-tag {
- cursor: move;
- }
- }
- }
- </style>
|