【ant-design-vue】实现table的拖拽排序(拖拽行和伸缩列):

这篇具有很好参考价值的文章主要介绍了【ant-design-vue】实现table的拖拽排序(拖拽行和伸缩列):。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.效果:

拖拽前:
ant design vue table 拖拽列,Vue框架,vue.js,javascript,前端
拖拽后:
ant design vue table 拖拽列,Vue框架,vue.js,javascript,前端

ant design vue table 拖拽列,Vue框架,vue.js,javascript,前端

2.实现:
<template>
  <a-card :bordered="false">
    <a-table bordered :columns="columns" :data-source="data" :customRow="customRow" :pagination="pagination"
      @change="tableChange">
      <template v-slot:action>
        <a href="javascript:;" style="cursor:move">拖拽排序</a>
      </template>
    </a-table>
  </a-card>
</template>

<script>
import Vue from "vue";
import VueDraggableResizable from "vue-draggable-resizable";
// 可拖拽表格
// "vue-draggable-resizable": "2.1.0"  //=>需要的话记得安装
// "ant-design-vue": "^1.5.5"
Vue.component("vue-draggable-resizable", VueDraggableResizable);

import { mapState } from 'vuex';
import { mixinDevice } from '@/utils/mixin'
import '@/assets/less/TableExpand.less'
import { getAction, deleteAction, putAction, putActions, postAction, postActions, httpAction, downFile, uploadAction } from '@/api/manage' //二次封装的接口方法


export default {
  name: "queueInfoList",
  mixins: [mixinDevice],
  data() {
    // this.components = {//实现伸缩列=>不需要的话a-table去除:components="components"
    //   header: {
    //     cell: (h, props, children) => {
    //       const { key, ...restProps } = props;
    //       console.log("ResizeableTitle", key);
    //       const col = this.columns.find(col => {
    //         const k = col.dataIndex || col.key;
    //         return k === key;
    //       });

    //       if (!col || !col.width) {
    //         return h("th", { ...restProps }, [...children]);
    //       }

    //       const dragProps = {
    //         key: col.dataIndex || col.key,
    //         class: "table-draggable-handle",
    //         attrs: {
    //           w: 10,
    //           x: col.width,
    //           z: 1,
    //           axis: "x",
    //           draggable: true,
    //           resizable: false
    //         },
    //         on: {
    //           dragging: (x, y) => {
    //             console.log(x, y);
    //             col.width = Math.max(x, 1);
    //           }
    //         }
    //       };
    //       const drag = h("vue-draggable-resizable", { ...dragProps });
    //       return h("th", { ...restProps, class: "resize-table-th" }, [
    //         ...children,
    //         drag
    //       ]);
    //     }
    //   }
    // };
    return {
      sourceObj: null,
      targetObj: null,
      dragStartIndex: '',

      queryParam: {
        bankPositon: '',//装卸位
        carNumber: '',//车号
        varietyName: '',//货品
        deptId: '',
        stationId: '',
        pageNo: '1',
        pageSize: '10',
        isInQueue: '1',//	是否排队中。1=是,0=},
      url: {
        list: '/kd/queueInfo/list',
        queueInfoSort: "/kd/queueInfo/editSort",// 排队列表-拖拽排序
      },
      columns: [
        {
          title: "序号",
          align: "center",
          dataIndex: "queueNo",
          sorter: true,
        },
        {
          title: "id",
          align: "center",
          dataIndex: "id",
          sorter: true,
        },
        {
          title: "库位",
          align: "center",
          dataIndex: "bankPositon",
          sorter: true,
        },
        {
          title: "货品",
          align: "center",
          dataIndex: "varietyName",
          sorter: true,
        },
        {
          title: "车牌号码",
          align: "center",
          dataIndex: "carNumber",
          sorter: true,
        },
        {
          title: "状态",
          sorter: true,
          align: "center",
          dataIndex: "status",
          // status	状态(1:等待装车,2正在装车,3装车完成)
          customRender: function (text) {
            return !text ? "" : text == 1 ? '等待装车' : text == 2 ? '正在装车' : '装车完成'
          }
        },
        {
          title: "排队号",
          align: "center",
          dataIndex: "sortNo",
          sorter: true,
        },
        {
          title: "操作",
          key: "action",
          align: "center",
          fixed: "right",
          width: 147,
          scopedSlots: { customRender: "action" }
        }
      ],
      data: [],
      tableLoading: false,//防止快速点击时,没获取到新数据
      pagination: {
        current: 1,
        pageSize: 10, // 默认每页显示数量
        total: 0,
        showSizeChanger: true, // 显示可改变每页数量
        pageSizeOptions: ['10', '20', '30', '50', '100'], // 每页数量选项
        showTotal: total => `共 ${total}`, // 显示总数
        showSizeChange: (current, pageSize) => this.pageSize = pageSize, // 改变每页数量时更新显示
      },
    };
  },
  computed: {
    ...mapState(['bdidInfo']),
  },
  watch: {
    // 监听机构和磅点bdidInfo存储信息的变化
    bdidInfo: {
      handler(value) {
        if (value != null) {
          this.queryParam.deptId = value.deptId
          this.queryParam.stationId = value.stationId
          this.searchQuery()
        }
      },
      immediate: true,
    }
  },
  methods: {
    // 搜索列表数据
    searchQuery() {
      const that = this
      this.tableLoading = true
      let param = { ...this.queryParam }
      param.pageNo = this.pagination.current
      param.pageSize = this.pagination.pageSize
      getAction(this.url.list, param).then(res => {
        if (res.success) {
          that.data = res.result.records
          // this.data.forEach((res, index) => {//测试=>这里是重复时,让排队号变成1,2,3,4,...
          //   res.sortNo = index + 1
          // })
          that.pagination.total = res.result.total
        } else {
          this.$message.error(res.message || res.msg)
        }
        setTimeout(() => {
          that.tableLoading = false
        }, 200)
      })
    },
    // 重置
    searchReset() {
      this.pagination.current = 1
      this.pagination.pageSize = 10
      this.queryParam.carNumber = ''
      this.queryParam.bankPositon = ''
      this.queryParam.varietyName = ''
      this.searchQuery()
    },
    // table的change事件
    tableChange(e) {
      const { current, pageSize } = e;
      this.pagination.current = current;
      this.pagination.pageSize = pageSize;
      this.searchQuery();
    },
    // 拖动排序
    customRow(record, index) {
      const that = this
      return {
        // FIXME: draggable: true 不生效还不晓得是什么原因,先使用鼠标移入事件设置目标行的draggable属性
        props: {
          // draggable: 'true'
        },
        style: {
          cursor: "move"
        },
        on: {
          // 鼠标移入
          mouseenter: event => {
            // 兼容IE
            var ev = event || window.event;
            ev.target.draggable = true;
          },
          // 开始拖拽
          dragstart: event => {
            var ev = event || window.event; // 兼容IE
            ev.stopPropagation();// 阻止冒泡
            
            // 得到源目标数据
            that.dragStartIndex = index;
            that.sourceObj = record;
          },
          // 拖动元素经过的元素
          dragover: event => {
            var ev = event || window.event;
            ev.preventDefault();// 阻止默认行为
          },
          // 鼠标松开
          drop: event => {
            var ev = event || window.event;
            ev.stopPropagation(); // 阻止冒泡
            
            // 得到目标数据
            that.targetObj = record;
            // let _data = JSON.parse(JSON.stringify(that.data));
            // _data[that.dragStartIndex] = that.data[index];
            // _data[index] = that.data[that.dragStartIndex];
            // that.data = _data;
            // console.log(that.data)
            // console.log(that.sourceObj, '源数据')
            that.getDragData(that.sourceObj, that.targetObj)
          }
        }
      };
    },
    // 获取拖拽的数据=>拖拽的接口
    getDragData(sourceObj, targetObj) {
      const that = this
      // console.log(sourceObj, targetObj)
		
	 if (that.data && that.data.length > 0) {//防止快速点击时,获取到的数据不是最新的
        that.data.forEach(item => {
          if (item.id == sourceObj.id && item.sortNo != sourceObj.sortNo) {
            // that.sourceObj = item;
            // console.log(item.sortNo, sourceObj.sortNo, '排队号不一致')
            that.searchQuery()
            return
          }
        })
      }

      if (sourceObj.id == targetObj.id || sourceObj.sortNo == targetObj.sortNo) {//防止快速点击时,获取到的数据不是最新的
        this.searchQuery()
        return
      }
      let param = {
        "queueInfo": [
          {
            id: sourceObj.id,
            sortNo: targetObj.sortNo,
          }, {
            id: targetObj.id,
            sortNo: sourceObj.sortNo,
          }
        ]
      }
      // console.log(sourceObj.sortNo + '-' + targetObj.sortNo, that.dragStartIndex)
      
      putAction(this.url.queueInfoSort, param).then(res => {
        if (res.success) {
          that.tableLoading = true //开启动画=>防止快速点击时,获取到的数据不是最新的
          that.searchQuery()
          that.$message.success(res.message || res.msg)
        } else {
          this.$message.error(res.message || res.msg)
        }
      })
    },
  }
};
</script>


<style scoped>
.resize-table-th {
  position: relative;
}

.table-draggable-handle {
  /* width: 10px !important; */
  height: 100% !important;
  left: auto !important;
  right: -5px;
  cursor: col-resize;
  touch-action: none;
  border: none;
}
</style>
3.出现的问题:
1.拖拽过程中,出现排队号重复的问题(后台不重复)=>原因:获取列表数据的方法还没完成,连续两次运行拖拽的接口

2.拖拽过程中,出现排队号数据过时的问题=>没有获取到最新的数据
4.初始拖拽版本:
<template>
  <a-table bordered :columns="columns" :components="components" :data-source="data" :customRow="customRow">
    <template v-slot:action>
      <a href="javascript:;"></a>
    </template>
  </a-table>
</template>

<script>
import Vue from "vue";
import VueDraggableResizable from "vue-draggable-resizable";
// 可拖拽表格
// "vue-draggable-resizable": "2.1.0"
// "ant-design-vue": "^1.5.5"
Vue.component("vue-draggable-resizable", VueDraggableResizable);
var that;
export default {
  name: "App",
  data() {
    this.components = {
      header: {
        cell: (h, props, children) => {
          const { key, ...restProps } = props;
          // console.log("ResizeableTitle", key);
          const col = this.columns.find(col => {
            const k = col.dataIndex || col.key;
            return k === key;
          });

          if (!col || !col.width) {
            return h("th", { ...restProps }, [...children]);
          }

          const dragProps = {
            key: col.dataIndex || col.key,
            class: "table-draggable-handle",
            attrs: {
              w: 10,
              x: col.width,
              z: 1,
              axis: "x",
              draggable: true,
              resizable: false
            },
            on: {
              dragging: (x, y) => {
                console.log(x, y);
                col.width = Math.max(x, 1);
              }
            }
          };
          const drag = h("vue-draggable-resizable", { ...dragProps });
          return h("th", { ...restProps, class: "resize-table-th" }, [
            ...children,
            drag
          ]);
        }
      }
    };
    return {
      data: [
        {
          key: 0,
          date: "2018-02-11",
          amount: 120,
          type: "income",
          note: "transfer"
        },
        {
          key: 1,
          date: "2018-03-11",
          amount: 243,
          type: "income",
          note: "transfer"
        },
        {
          key: 2,
          date: "2018-04-11",
          amount: 98,
          type: "income",
          note: "transfer"
        }
      ],
      columns: [
        {
          title: "Date",
          dataIndex: "date",
          width: 200
        },
        {
          title: "Amount",
          dataIndex: "amount",
          width: 100
        },
        {
          title: "Type",
          dataIndex: "type",
          width: 100
        },
        {
          title: "Note",
          dataIndex: "note",
          width: 100
        },
        {
          title: "Action",
          key: "action",
          scopedSlots: { customRender: "action" }
        }
      ],
      sourceObj: "",
      targetObj: '',
      // 拖动排序
      customRow(record, index) {
        return {
          // FIXME: draggable: true 不生效还不晓得是什么原因,先使用鼠标移入事件设置目标行的draggable属性
          props: {
            // draggable: 'true'
          },
          style: {
            cursor: "pointer"
          },
          on: {
            // 鼠标移入
            mouseenter: event => {
              // 兼容IE
              var ev = event || window.event;
              ev.target.draggable = true;
            },
            // 开始拖拽
            dragstart: event => {
              // 兼容IE
              var ev = event || window.event;
              // 阻止冒泡
              ev.stopPropagation();
              // 得到源目标数据
              // console.log(that);
              that.dragStartIndex = index;
              that.sourceObj = record;
            },
            // 拖动元素经过的元素
            dragover: event => {
              // 兼容 IE
              var ev = event || window.event;
              // 阻止默认行为
              ev.preventDefault();
            },
            // 鼠标松开
            drop: event => {
              // 兼容IE
              var ev = event || window.event;
              // 阻止冒泡
              ev.stopPropagation();
              // 得到目标数据
              that.targetObj = record;
              // 注意=>这里会调换数据,记得注释
              let _data = JSON.parse(JSON.stringify(that.data));
              _data[that.dragStartIndex] = that.data[index];
              _data[index] = that.data[that.dragStartIndex];
              that.data = _data;
              console.log(that.data, '拖拽后的数据')
              console.log(that.sourceObj, '源数据')
              console.log(that.targetObj, '目标数据')
            }
          }
        };
      }
    };
  },
  mounted() {
    that = this;
  },
  methods: {

  }
};
</script>
<style>
.resize-table-th {
  position: relative;
}

.table-draggable-handle {
  /* width: 10px !important; */
  height: 100% !important;
  left: auto !important;
  right: -5px;
  cursor: col-resize;
  touch-action: none;
  border: none;
}
</style>
5.相关知识:

ant design vue table 拖拽列,Vue框架,vue.js,javascript,前端文章来源地址https://www.toymoban.com/news/detail-659243.html

到了这里,关于【ant-design-vue】实现table的拖拽排序(拖拽行和伸缩列):的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Vue中el-table表格的拖拽排序

    element-ui 表格没有拖拽排序的功能,只能使用sortable.js插件实现拖拽排序,当然也可以应用到其他的组件里面,用法类似,这里只说表格。 实现步骤: 1、安装sortable.js 2、在需要的页面中引入 3、实现表格拖动代码

    2024年02月10日
    浏览(51)
  • ant-design-vue中upload上传图片、视频实现预览功能

    有没有小伙伴在使用ant-design-vue的upload组件时,发现api文档在图片预览功能的介绍寥寥无几,而且也没提供视频预览的demo,在实际开发中碰到相应的需求直挠头~~~~,别急,下面来给大家分享一个我自己封装的upload组件,符合需求可以直接在项目中放到组件目录调用。 templat

    2024年02月12日
    浏览(45)
  • vue3中使用ant-design-vue的layout组件实现动态导航栏功能(1~2级)

    目录 0 前言 1 准备工作 1.1 安装ant-design-vue 1.2 安装图标组件包 2 选择组件 3 路由文件 4 Vue导航页面 5 最终效果         最近在自己搞一个前后端小项目,前端想使用ant-design-vue的layout组件实现动态导航栏和面包屑,但是网上的资料较少,所以我就自己整合实现了一下,在此

    2024年02月15日
    浏览(46)
  • vue3+ant design vue+ts实战【ant-design-vue组件库引入】

    🔥🔥更多内容见Ant Design Vue官方文档 🔥点击复习vue3【watch检测/监听】相关内容 👏👏👏一个好项目的编写不仅需要完美的逻辑,以及相应的技术,同时也需要一个 设计规范的高质量UI组件库 。👏👏👏本期文章将会详细讲解 Ant Design of Vue 组件库的 安装、使用、引入 。

    2024年02月02日
    浏览(50)
  • React 基于Ant Degisn 实现table表格列表拖拽排序

     代码:

    2024年01月18日
    浏览(44)
  • 关于 ant-design-vue resetFields 失效

    关于 ant-design-vue resetFields 失效 背景: 遇到这样的问题使用 ant-design-vue useForm 来制作表单的时候, resetFields()失效 场景: 编辑 -赋值 新增 -初始值(问题点:新增的时候他就不 初始化 ) 方案: 1、调用 resetFields() 传参 2、要么使用 reactive 明确定义初始值 解释: 首先我这里讲

    2024年01月17日
    浏览(49)
  • 按需引入ant-design-vue组件

    一、首先创建一个新的Vue项目 选择default含有babel和eslint。或者自定义Manually select features。 babel是一个转码器,主要用于ES2015+ 代码转换为 JavaScript 向后兼容版本的代码 eslint是一个代码检测工具。用来规范编码规范用。 自定义可选的插件有,Babel,TypeScript,Progressive Web App (P

    2024年02月13日
    浏览(56)
  • ant-design-vue 自由切换 暗黑模式dark

    思路 引入 dark.css 文件 动态切换 prefixCls 实现效果 我们来看看官网怎么说的 官网地址 除了 less 定制主题 外,我们还提供了 CSS Variable 版本以支持动态切换主题能力。你可以在 ConfigProvider 进行体验。 调用 ConfigProvider 配置方法设置主题色: 默认情况下,CSS Variable 会以 --ant 作

    2023年04月21日
    浏览(46)
  • 国际化配置(ant-design-vue设置成中文)

    vue3 + ts + ant-design-vue 引用ant-design-vue的组件时,默认是英文的。 官网说明:https://www.antdv.com/components/date-picker-cn   我用的全局设置。在项目的App.vue文件里引入ant-design-vue自带的zh_CN,用a-config-provider 将RouterView包裹起来。但是我发现设置了全局,在使用日期选择框时还是英文,

    2024年02月22日
    浏览(53)
  • ant-design-vue 4.x升级问题-样式丢失问题

    该文档是在升级ant-design-vue到4.x版本的时候遇到的问题 以上是开发项目时使用的包以及包的版本,使用的脚手架是vite 当使用ant-design-vue3.x版本时没有任何问题,但是当升级ant-design-vue到4.0版本时,因为ant-design-vue4.x使用了css-in-js需要修改vite.config.js配置 变更为 修改后当开发环

    2024年02月14日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包