解决 element + sortablejs 实现表格拖拽 顺序出现混乱问题

最根本问题就是table表格的row-key问题
直接上代码

<template>
  <div>
    <el-table :data="tableData" style="width: 60%;margin: auto;margin-top: 100px" class="project-auth-emp-list-table" row-key="id" border>
      <el-table-column label="日期" width="180" :key="Math.random()">
        <template slot-scope="scope">
          <i class="el-icon-time"></i>
          <span style="margin-left: 10px">{{ scope.row.date }}</span>
        </template>
      </el-table-column>
      <el-table-column label="姓名" width="180" :key="Math.random()">
        <template slot-scope="scope">
          <el-popover trigger="hover" placement="top">
            <p>姓名: {{ scope.row.name }}</p>
            <p>住址: {{ scope.row.address }}</p>
            <div slot="reference" class="name-wrapper">
              <el-tag size="medium">{{ scope.row.name }}</el-tag>
            </div>
          </el-popover>
        </template>
      </el-table-column>
      <el-table-column label="操作" :key="Math.random()">
        <template slot-scope="scope">
          <el-button size="mini" @click="handleEdit(scope.$index, scope.row)">编辑</el-button>
          <el-button size="mini" type="danger" @click="handleDelete(scope.$index, scope.row)">删除</el-button>
        </template>
      </el-table-column>
      <el-table-column align="center" label="拖拽" width="50">
        <template>
          <i class="el-icon-rank f18 poi"></i>
        </template>
      </el-table-column>
    </el-table>
  </div>
</template>

<script>
  const sortablejs = () =>
    import( /* webpackChunkName: 'async_vendors/sortablejs' */ 'sortablejs');
  export default {
    name: '',
    data() {
      return {
        sortablejs,
        empListTable: null,
        tableData: []
      }
    },
    mounted() {
      this.getDataValue();
    },
    methods: {
      getDataValue () {
        this.tableData = [{
          date: '2016-05-02',
          name: '1',
          id: 1,
          address: '上海市普陀区金沙江路 1518 弄'
        }, {
          date: '2016-05-04',
          name: '2',
          id: 2,
          address: '上海市普陀区金沙江路 1517 弄'
        }, {
          date: '2016-05-01',
          name: '3',
          id: 3,
          address: '上海市普陀区金沙江路 1519 弄'
        }, {
          date: '2016-05-03',
          name: '4',
          id: 4,
          address: '上海市普陀区金沙江路 1516 弄'
        }]
        this.$nextTick(() => {
          this.initSortable();
        })
      },
      /**
       * 表格拖拽初始化
       */
      async initSortable() {
        let vm = this;
        let Sortable = await sortablejs();
        function createSortableInstance(el, block) {
          return Sortable.default.create(el, {
            ghostClass: 'sortable-ghost', //拖拽样式
            animation: 60, // 拖拽延时,效果更好看
            setData(dataTransfer) {
            	dataTransfer.setData('Text', '');
            },
            disabled: false, // 是否开启拖拽
            group: { // 是否开启跨表拖拽
                pull: false,
                put: false
            },
            onEnd: ({
              newIndex,
              oldIndex
            }) => {
              let targetRow = vm[block].splice(oldIndex, 1)[0];
              vm[block].splice(newIndex, 0, targetRow);
              console.log(vm[block])
            }
          })
        }
        let elMain = document.querySelector(
          '.project-auth-emp-list-table > .el-table__body-wrapper > table > tbody'
        );
        this.empListTable = createSortableInstance(elMain, 'tableData');
      },
      handleEdit(index, row) {
        console.log(index, row);
      },
      handleDelete(index, row) {
        console.log(index, row);
      }
    },
    destroyed () {
      this.empListTable = null;
    }
  }
</script>

<style lang="scss" scoped>

</style>

最最最重要的就是el-table上面必须要添加在这里插入图片描述
row-key的值是在获取到的列表数据中必须具备唯一的值才不会导致拖拽顺序紊乱!!!!!

  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
Vue Element是一个基于Vue.js框架构建的UI组件库,提供了丰富的组件,方便开发者构建各种交互界面。要实现SKU表格,可以借助Vue Element的Table组件和选择器组件。 首先,需要准备好SKU的数据结构,包括SKU的属性以及对应的值。可以使用一个嵌套的数组来表示,例如: ``` [ { name: '颜色', values: ['红色', '蓝色', '绿色'] }, { name: '尺码', values: ['S', 'M', 'L'] } ] ``` 接下来,在Vue组件中使用Table组件来展示SKU表格。可以使用v-for指令循环遍历SKU的属性和值,生成表头和表格数据。同时,可以给每个单元格添加选择器组件来选择对应的属性值。 示例代码如下: ```html <template> <el-table :data="tableData"> <el-table-column v-for="attr in attributes" :key="attr.name" :label="attr.name" > <template slot-scope="scope"> <el-select v-model="scope.row[attr.name]" placeholder="请选择"> <el-option v-for="value in attr.values" :key="value" :label="value" :value="value"></el-option> </el-select> </template> </el-table-column> </el-table> </template> <script> export default { data() { return { attributes: [ { name: '颜色', values: ['红色', '蓝色', '绿色'] }, { name: '尺码', values: ['S', 'M', 'L'] } ], tableData: [] }; }, created() { // 生成SKU表格数据 const skuData = this.generateSkuData(this.attributes); this.tableData = skuData; }, methods: { generateSkuData(attributes) { // 根据属性生成表格数据 const skuData = []; const rowLength = attributes.reduce((acc, curr) => acc * curr.values.length, 1); for (let i = 0; i < rowLength; i++) { const rowData = {}; let remain = i; attributes.forEach(attr => { const valueIndex = remain % attr.values.length; rowData[attr.name] = attr.values[valueIndex]; remain = Math.floor(remain / attr.values.length); }); skuData.push(rowData); } return skuData; } } }; </script> ``` 通过上述代码,可以实现一个基于Vue Element的SKU表格。每个单元格都可以通过选择器组件选择对应的属性值,从而构建SKU表格。当选择器的值发生改变时,可以通过监听事件获取到最新的SKU数据。这样,就可以根据选择器的值进行相应的业务操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值