antd-vue-table 实现表格的拖拽换顺序,100%成功

这篇博客展示了如何利用Ant Design Vue的表格组件实现数据行的拖拽排序功能。通过监听`onDragstart`、`onDragover`、`onDrop`等事件,配合数据操作,实现了表格行的交互式交换位置。代码示例中详细解释了各个关键步骤,为读者提供了直接可用的代码片段。

话不多说啊,兄弟们,看到很多人在找这个,我马上给你们安排了
直接上代码安排起来好吧
直接拿捏
当然 用AntdVue团队里面的高级组件就能实现各种高级效果 我的这个就是简单的例子
我把高级组件地址给你们贴出来,下载安装都可以看这个文档: Surely Vue

我的就是简单的 antd-vue 表格的操作 偷懒的直接用就行

<template>
  <div class="approvalStyle">
    <a-table
      style="margin-top: 20px; background: #fff"
      :columns="columns"
      :dataSource="dataSource"
      :customRow="customRow"
    >
    </a-table>
  </div>
</template>

<script>
import { Table } from 'ant-design-vue'; // 引入antd的表格,样式引入自己配置
import { reactive } from '@vue/reactivity';

export default {
  name: 'Atable',
  components: {
    [Table.name]: Table
  },
  data() {
    return {
      columns: [
        {
          dataIndex: 'name',
          title: 'name'
        },
        {
          dataIndex: 'address',
          title: 'address'
        },
        {
          dataIndex: 'age',
          title: 'age'
        }
      ]
    };
  },
  setup() {
    let change1 = null; // 源目标数据序号
    let change2 = null; // 目标数据序号
    let dataSource = reactive([
      {
        name: '张三',
        age: 14,
        address: '北京',
        key: 3
      },
      {
        name: '李四',
        age: 15,
        address: '南京',
        key: 2
      },
      {
        name: '王五',
        age: 16,
        address: '东京',
        key: 1
      }
    ]);
    function customRow(record, index) {
       console.log(record, index);// 这里输出是表格全部的数据
      return {
        props: {
          // draggable: 'true'
        },
        style: {
          cursor: 'pointer'
        },
        // 鼠标移入
        onMouseenter: (event) => {
          // 兼容IE
          var ev = event || window.event;
          ev.target.draggable = true; // 让你要拖动的行可以拖动,默认不可以
        },
        // 开始拖拽
        onDragstart: (event) => {
          // 兼容IE
          var ev = event || window.event;
          // 阻止冒泡
          ev.stopPropagation();
          // 得到源目标数据序号
          change1 = index;
          console.log(record, index, 'source');
        },
        // 拖动元素经过的元素
        onDragover: (event) => {
          // 兼容 IE
          var ev = event || window.event;
          // 阻止默认行为
          ev.preventDefault();
        },
        // 鼠标松开
        onDrop: (event) => {
          // 兼容IE
          var ev = event || window.event;
          // 阻止冒泡
          ev.stopPropagation();
          // 得到目标数据序号
          change2 = index;
          // 这里就是让数据位置互换,让视图更新 你们可以看record,index的输出,看是什么
          [dataSource[change1], dataSource[change2]] = [
            dataSource[change2],
            dataSource[change1]
          ];
          console.log(record, index, 'target');
        }
      };
    }
    return {
      dataSource,
      customRow
    };
  }
};
</script>

<style lang="less" scoped>
.approvalStyle {
  .listStyle {
    font-size: 16px;
    padding: 20px;
    background: #fff;
    width: 300px;
    border: 1px solid #efefef;
  }
}
</style>

<think>好的,用户现在想将现有的antd-vueTable组件替成ag-grid-vue。我需要仔细分析这个需求,并给出具体的实现步骤。首先,我得回忆一下ag-grid和antd-vue Table在使用上的主要区别,这样才能指导用户如何进行迁移。 首先,安装和引入部分。用户之前用的是antd-vue,现在要成ag-grid-vue,所以需要先安装对应的包。ag-grid-vue可能需要核心库和Vue版本的适配,所以应该提示用户安装ag-grid-vue和ag-grid-community。同时,样式文件也是必须导入的,否则表格的样式会不正常。这一步需要详细说明,避免用户漏掉。 接下来是组件注册。在Vue项目中,用户需要全局或局部注册ag-grid-vue组件。通常推荐在使用的组件内局部注册,比如AgGridVue和AgGridColumn,这样不会影响全局状态。需要给出具体的代码示例,展示如何引入并注册这些组件。 然后,数据结构适配。antdTable通常使用columns和dataSource作为props,而ag-grid的列定义是columnDefs,数据是rowData。这里需要指导用户如何将原有的columns数组转成ag-grid需要的格式,可能涉及到字段名的映射,比如title改成headerName,dataIndex改成field。同时,dataSource可能需要重命名为rowData,并注意数据格式是否一致,比如是否需要深拷贝或者响应式处理。 事件处理方面,antdTable有各种事件比如change(分页、排序、过滤变化),row-click等。ag-grid的事件名称和参数可能不同,比如分页可能用onPaginationChanged,排序用onSortChanged,过滤用onFilterChanged。用户需要替这些事件监听,并调整回调函数中的参数处理,比如获取排序状态的方式可能不同。 功能对等替部分,antd的一些功能比如行选择、自定义渲染、分页等在ag-grid中如何实现。例如,行选择在ag-grid中需要配置checkboxSelection,分页可能需要启用pagination属性,并设置相关的参数。自定义渲染部分,antd使用scopedSlots,而ag-grid使用cellRenderer,可能需要用户编写Vue组件或者JSX来处理渲染逻辑。 样式调整也是一个重点。antd和ag-grid的样式体系不同,用户需要引入ag-grid的主题CSS,并可能需要覆盖一些样式来保持与原来一致的视觉效果。比如调整表头背景色、行高、字体等,这部分需要指导用户如何通过CSS或SCSS进行定制。 最后,性能优化方面,ag-grid有很多高级功能,比如按需加载、虚拟滚动,如果用户处理大数据量,可能需要启用这些配置。比如设置rowModelType为'clientSide'或'serverSide',使用domLayout='autoHeight'来适应高度,或者开启animateRows让排序过滤时有动画效果。 在回答过程中,还需要注意用户可能的疑问点。例如,如何处理原有的复杂表格功能,比如可编辑单元格、行拖拽等。这时候可能需要引用用户提供的代码片段中的initDragRow函数,说明如何在ag-grid中集成拖拽功能,比如在onGridReady回调中初始化拖拽逻辑,并确保与ag-grid的API兼容。 另外,用户可能关心迁移后的维护性和扩展性,需要指出ag-grid的优缺点,比如功能更强大但学习曲线较陡,提供官方文档链接以便用户查阅。同时,示例代码要准确,避免语法错误,比如在Vue模板中使用ag-grid-vue组件的方式,以及配置项的正确写法。 总结下来,步骤应该是:安装依赖、注册组件、调整数据结构、适配事件、功能替、样式调整、性能优化,并给出注意事项和示例代码。同时,生成的相关问题要覆盖用户可能遇到的后续问题,比如性能优化、特定功能实现、与Vue的集成问题等。</think>以下是将 antd-vue Table为 ag-grid-vue 的具体实现步骤: ### 一、基础环境配置 1. **安装依赖** ```bash npm install ag-grid-vue ag-grid-community ``` 2. **全局样式引入**(在入口文件) ```scss import 'ag-grid-community/styles/ag-grid.css' import 'ag-grid-community/styles/ag-theme-alpine.css' ``` ### 二、组件注册(Vue3 组合式API) ```vue <script setup> import { AgGridVue } from 'ag-grid-vue3' const gridApi = ref(null) const columnDefs = ref([...]) // 列定义 const rowData = ref([...]) // 数据源 </script> <template> <ag-grid-vue class="ag-theme-alpine" :columnDefs="columnDefs" :rowData="rowData" @grid-ready="onGridReady" /> </template> ``` ### 三、数据结构适配 | antd-vue Table 配置 | ag-grid 对应方案 | |--------------------|------------------| | `columns` 数组 | `columnDefs` 配置对象 | | `dataSource` | `rowData` 响应式数组 | | `scopedSlots` | `cellRenderer` 组件 | **转示例**: ```javascript // antd columns const antdColumns = [ { title: '姓名', dataIndex: 'name' }, { title: '年龄', dataIndex: 'age' } ] // 转为 ag-grid 格式 const columnDefs = ref(antdColumns.map(col => ({ headerName: col.title, field: col.dataIndex }))) ``` ### 四、核心功能迁移 1. **行选择功能** ```javascript // 添加首列复选框 columnDefs.value.unshift({ headerName: '', checkboxSelection: true, width: 60 }) // 启用多选模式 const gridOptions = { rowSelection: 'multiple' } ``` 2. **分页配置** ```javascript // 启用分页 const gridOptions = { pagination: true, paginationPageSize: 20 } // 分页事件监听 function onPaginationChanged(event) { console.log('当前页:', event.api.paginationGetCurrentPage()) } ``` ### 五、事件处理对照 | antd 事件 | ag-grid 对应事件 | |-------------------|-------------------------| | `@change` | `@sortChanged` + `@filterChanged` | | `@row-click` | `@cellClicked` | | `@expanded-rows-change` | `@rowGroupOpened` | ### 六、性能优化配置 ```javascript // 虚拟滚动配置 const gridOptions = { rowModelType: 'clientSide', domLayout: 'autoHeight', animateRows: true, cacheBlockSize: 50, maxBlocksInCache: 5 } // 大数据量优化 function onGridReady(params) { gridApi.value = params.api params.api.setDatasource(myDataSource) } ``` ### 七、样式覆盖方案 ```scss .ag-theme-alpine { --ag-header-background-color: #fafafa; --ag-row-hover-color: #e6f7ff; // 自定义单元格样式 .ag-cell { font-family: 'Arial'; padding: 12px 8px; } } ``` ### 八、高级功能集成(以行拖拽为例) ```javascript import { initDragRow } from './hook/useDrag' function onGridReady(params) { const gridBody = document.querySelector('.ag-body-viewport') initDragRow(params.api, gridBody, { // 拖拽边界配置 containment: 'parent', // 拖拽回调 onDragEnd: (oldIndex, newIndex) => { // 更新数据逻辑 } }) } ``` [^1]: 引用自用户提供的拖拽功能实现代码片段
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值