<template> 
 | 
  <el-alert 
 | 
    title="拖动列名可调整表格列显示顺序" 
 | 
    type="success" 
 | 
    :show-icon="false" 
 | 
  > 
 | 
  </el-alert> 
 | 
  <div class="view-column view-column-title"> 
 | 
    <div class="view-column-index">#</div> 
 | 
    <div class="view-column-left">列名</div> 
 | 
    <div class="view-column-right">是否显示</div> 
 | 
  </div> 
 | 
  <draggable 
 | 
    class="list-group" 
 | 
    tag="transition-group" 
 | 
    :component-data="componentData" 
 | 
    :list="viewColumns" 
 | 
    v-bind="dragOptions" 
 | 
    item-key="order" 
 | 
  > 
 | 
    <transition-group class="drag-center-item"> 
 | 
      <div 
 | 
        class="view-column" 
 | 
        v-for="(column, index) in viewColumns" 
 | 
        :key="index" 
 | 
      > 
 | 
        <div class="view-column-index">{{ index + 1 }}</div> 
 | 
        <div class="view-column-left">{{ column.title }}</div> 
 | 
        <div class="view-column-right"> 
 | 
          <el-checkbox v-model="column.show"> 
 | 
            <div style="height: 100%; width: 250px"></div 
 | 
          ></el-checkbox> 
 | 
        </div> 
 | 
      </div> 
 | 
    </transition-group> 
 | 
  </draggable> 
 | 
</template> 
 | 
<script> 
 | 
import { VueDraggableNext } from 'vue-draggable-next'; 
 | 
import { defineComponent, ref, reactive } from 'vue'; 
 | 
  
 | 
export default defineComponent({ 
 | 
  props: { 
 | 
    viewColumns: { 
 | 
      type: Array, 
 | 
      default: () => { 
 | 
        return []; 
 | 
      } 
 | 
    } 
 | 
  }, 
 | 
  components: { 
 | 
    draggable: VueDraggableNext 
 | 
  }, 
 | 
  data() { 
 | 
    return {}; 
 | 
  }, 
 | 
  setup(props, context) { 
 | 
    const dragOptions = reactive({ 
 | 
      animation: 200, 
 | 
      group: 'description', 
 | 
      disabled: false, 
 | 
      ghostClass: 'ghost' 
 | 
    }); 
 | 
    const componentData = reactive({ 
 | 
      tag: 'ul', 
 | 
      type: 'transition-group' 
 | 
    }); 
 | 
    return { dragOptions, componentData }; 
 | 
  } 
 | 
}); 
 | 
</script> 
 | 
<style lang="less" scoped> 
 | 
.view-column { 
 | 
  cursor: pointer; 
 | 
  display: flex; 
 | 
  padding: 10px; 
 | 
  border-bottom: 1px solid #f3f3f3; 
 | 
  .view-column-index { 
 | 
    width: 50px; 
 | 
  } 
 | 
  .view-column-left { 
 | 
    width: 120px; 
 | 
    padding: 0 10px; 
 | 
  } 
 | 
  .view-column-right { 
 | 
    flex: 1; 
 | 
  } 
 | 
} 
 | 
.view-column-title { 
 | 
  font-weight: bold; 
 | 
} 
 | 
.view-column:last-child { 
 | 
  border-bottom: 0; 
 | 
} 
 | 
</style> 
 |