ant-design-vue表格实现拖拽排序及动画效果

因为ant-design表格组件没有封装拖拽排序的方法,需要通过customRow这个属性进行自定义排序。

因为项目的原因所以使用的是typescript

THML代码

<a-table :customRow="customRow" :columns="columns" :data-source="dataSource">
........
</a-table>

TypeScript代码

// 位置记录
    const position = {
      start: undefined as number | undefined,
      end: undefined as number | undefined,
      sourceEl: undefined as undefined | HTMLTableRowElement,
    }
    // 排序
    const reorder = ({ start, end }) => {
      if (start !== undefined && end !== undefined) {
        if (start > end) {
          // 当开始大于结束
          let temp = dataSource.value[start]
          dataSource.value.splice(start, 1);
          dataSource.value.splice(end, 0, temp)
        } else if (start < end) {
          // 结束大于开始
          let temp = dataSource.value[start]
          dataSource.value.splice(start, 1)
          dataSource.value.splice(end + 1, 0, temp)
        }
        let arr: string[] = dataSource.value?.map((item: any) => item.id)
        emit("onDeviceList", arr)
      }
    }
    function customRow(_record, index) {
      return {
        style: {
          cursor: "move",
        },
        // 鼠标移入
        onMouseenter: (event) => {
          // 兼容IE
          let ev = event || window.event;
          ev.target.draggable = true;
        },
        // 开始拖拽
        onDragstart: (event) => {
          // 兼容IE
          let ev = event || window.event;
          // 阻止冒泡
          ev.stopPropagation();
          // 得到源目标数据;
          position.start = index
          const tr = ev.target as HTMLTableRowElement
          position.sourceEl = tr
        },
        // 拖动元素经过的元素
        onDragover: (event) => {
          let ev = event || window.event;
          // 阻止默认行为
          ev.preventDefault();
        },
        // 松开
        onDrop: (event) => {
          let ev = event || window.event;
          // 阻止默认行为
          ev.preventDefault();
          position.end = index
          reorder(position);
          animation(position)
        },
      };
    }
    // 实现动画效果
    function animation({ start, end, sourceEl }) {
      // 48 是每行的高度,也可以自动获取,根据情况而定
      let count = 48 * (start! - end!)
      sourceEl.style.translate = `0px ${count}px`
      setTimeout(() => {
        sourceEl!.style.transition = "all 0.5s"
        sourceEl!.style.translate = `0px 0px`
      })
    }

变量dataSource是绑定的表格的数据源,替换成自己的就可以了。

动画效果原理:通过获取开始位置和结束位置计算位移距离,添加动画时间然后,在下一次事件循环的时候将偏移设置为0既可以实现排序的动画效果。

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Ant Design Vue表格组件支持拖拽列的功能。具体实现方法可以参考官方文档中的示例代码。在表格组件中,可以通过设置 `drag-and-drop` 属性为 `true` 来开启拖拽列的功能。同时,还需要设置 `columns` 属性为一个数组,数组中的每个元素表示一列的配置信息,包括列的标题、数据字段、宽度等。在拖拽列时,可以通过监听 `onColumnDragEnd` 事件来获取拖拽后的列的顺序信息,然后根据顺序信息重新渲染表格。 ### 回答2: ant-design-vue table是一个基于Vue框架构建的图形用户界面组件库,其table组件提供了丰富的功能,其中包括拖拽列。下面我们来详细介绍一下如何实现ant-design-vue table拖拽列功能。 首先,我们需要在table组件的配置中增加一个属性:columnsResizable,将其设置为true,该属性作用是启用列宽调整的功能。然后,我们需要在table组件的html中增加一个slot,定义列头的内容,方便后续处理拖拽事件。关于slot的具体用法请自行查阅官方文档。 接下来,我们需要通过样式将table的列头设置为可拖拽的状态。可以通过设置th元素的cursor属性为col-resize来实现,同时为th元素绑定mousedown事件,当用户拖拽列头时,就可以触发该事件,然后调用对应的处理函数。 在处理函数中,我们需要先获取当前列头所在的位置,然后记录下鼠标的初始位置。接着监听mousemove事件,当鼠标移动时,计算出当前列头的目标宽度,并通过css样式设置列头的宽度,同时更新对应列的宽度。最后,当鼠标松开时,释放事件监听。 除此之外,我们还需要注意一些细节问题,例如列拖拽时保持整个table的宽度不变,下一列的位置和宽度需要同步调整等。这些都需要我们在代码中仔细处理,以避免出现意外的问题。 总之,通过以上步骤,我们就可以成功实现ant-design-vue table拖拽列功能了。当然,具体实现方式可能因人而异,这里只是提供一种参考思路,希望对大家有所帮助。 ### 回答3: Ant Design Vue是一款基于Vue的企业级UI库,它提供了丰富的组件和样式,可以直接应用于业务中。其中的table组件支持拖拽列,可以使用户根据自身需求自由排序table中的列。 Ant Design Vuetable组件可以通过列对象属性的方式自定义table的列,其中包括每一列的数据源、表头、宽度等属性。在这些属性中,index属性会在表头中显示列的序号,同时也可以用作table中列的排序拖拽列的实现可以通过拖拽事件来实现拖拽事件包括dragstart、dragover、drop和dragend四种事件。其中dragstart事件在拖动元素时触发,可以在事件中将当前列的index属性传递给被拖动元素;dragover事件在拖动元素进入目标元素时触发,可以在事件中获取目标列的index属性,并用作当前列和目标列的交换;drop事件在拖动元素松开鼠标时触发,可以在事件中触发交换列的逻辑;dragend事件在拖动元素结束时触发,可以在事件中清空拖动元素的状态。 在实现拖拽列的过程中,还需要考虑数据的绑定。拖拽列并不会改变table的数据源,因此需要手动更新数据源中每一列的index属性。同时,在交换列的时候,需要考虑表头和单元格中数据的同步更新。 总的来说,Ant Design Vuetable组件拖拽列的实现相对简单,可以通过拖拽事件和数据源的操作来实现。在用户体验上,拖拽列可以大大提高用户对table的操作效率,同时也增加了table的交互性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值