Vue+ant-design-vue 表格实现可拖动的伸缩列

2023-11-03

        应客户要求,表格要实现列宽可以自主调节,用户可以根据自己的喜好,拖动列边框,左右拖动实现列宽的扩大和缩小;ant-design-vue官方文档中,table组件中提供了此功能的示例代码。于是我满怀开心的复制到了我的项目中,结果处处报错,红彤彤的一大片。在修改无果后,我去请教了 无所不会的网友 最后整理了一套可用的。

        这篇笔记以 步骤 的形式一步一步的记录如何实现这个功能。有需要的小伙伴可以按照步骤走一遍。

        步骤一:安装集成的 vue-draggable-resizable 插件

npm install --save vue-draggable-resizable

        步骤二:在项目的main.js中引入插件

// 挂载全局使用的方法
import VueDraggableResizable from 'vue-draggable-resizable'
Vue.component('vue-draggable-resizable', VueDraggableResizable)

        步骤三:在使用页面中重新引入根vue实例和插件

import Vue from 'vue'
import VueDraggableResizable from 'vue-draggable-resizable'

注:你可能觉得在main.js中已经引入了插件并且定义成了全局的方法,在这里引入会多此一举。但是我实验过,在使用页面中如果不引入,插件就不能使用,main.js不注册,插件也不能使用。我是不知道为什么,如果有人知道,或者有改进措施,请教教我。

        步骤四:ant-design-vue 的 table 组件中添加components属性

<a-table
    ref="table"
    size="middle"
    bordered
    rowKey="id"
    :columns="columns"
    :components="components"
  >
</a-table>

        步骤五:定义components属性代码 

  data() {
    this.components = {
      header: {
        cell: (h, props, children) => {
          const { key, ...restProps } = props
        
        // 此处的this.columns 是定义的table的表头属性变量

          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) => {
                col.width = Math.max(x, 1)
              },
            },
          }
          const drag = h('vue-draggable-resizable', { ...dragProps })
          return h('th', { ...restProps, class: 'resize-table-th' }, [...children, drag])
        },
      },
    }
    return {
    }
   
  },

完整代码:

<template>
  <a-card :bordered="false">

    <a-table
        ref="table"
        size="middle"
        bordered
        rowKey="id"
        :columns="columns"
        :dataSource="dataSource"
        :components="components"
      >
    </a-table>

  </a-card>
</template>

<script>
import Vue from 'vue'
import VueDraggableResizable from 'vue-draggable-resizable'

export default {
  components: {
    VueDraggableResizable
  },
  data() {
    this.components = {
      header: {
        cell: (h, props, children) => {
          const { key, ...restProps } = props
          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) => {
                col.width = Math.max(x, 1)
              },
            },
          }
          const drag = h('vue-draggable-resizable', { ...dragProps })
          return h('th', { ...restProps, class: 'resize-table-th' }, [...children, drag])
        },
      },
    }
    return {
      labelCol: {
        xs: { span: 24 },
        sm: { span: 5 },
      },
      wrapperCol: {
        xs: { span: 24 },
        sm: { span: 12 },
      },
      form: null,
        //表头
      columns: [
        {
          title: '项目名称',
          dataIndex: 'projectName',
          ellipsis: true,
          width:200,
        },
        {
          title: '企业名称',
          dataIndex: 'company',
          ellipsis: true,
          width:200,
        },
        {
          title: '责任人',
          dataIndex: 'liablePersonName',
          ellipsis: true,
          width:200,
        },
        {
          title: '附件',
          dataIndex: 'picture',
          width: 400,
          scopedSlots: { customRender: 'fujian' },
        },
        {
          title: '操作',
          // fixed: 'right',
          dataIndex: 'action',
          width: 200,
          scopedSlots: { customRender: 'action' },
        },
      ],
    }
  },
  created() {},
}
</script>

<style>
.table-draggable-handle {
  /* width: 10px !important; */
  height: 100% !important;
  left: auto !important;
  right: -5px;
  cursor: col-resize;
  touch-action: none;
  border: none;
  position: absolute;
  transform: none !important;
  bottom: 0;
}
.resize-table-th {
  position: relative;
}
</style>

注意点:

1,表头columns中,每一列都要设置width,如果不设置width属性,拖动时不生效;

2,style一定要记得添加.table-draggable-handle 和 .resize-table-th 两个class。并且style标签不能家scoped属性。

以上便是可拖拽控制列宽功能的实现步骤。希望对大家有帮助。

拜了个拜!迪迦。。。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Vue+ant-design-vue 表格实现可拖动的伸缩列 的相关文章

  • jQuery 位置 DIV 固定在滚动顶部

    我有一个相当长的页面 在布局的菜单中 有一个弹出菜单 我希望菜单的弹出部分显示在页面顶部 即使用户已将菜单栏滚动到视图之外 这是菜单的 HTML div div Compare up to 3 cards side by side Clic
  • 自动调整Google网站嵌入代码的高度(html)

    我正在使用 Google 协作平台嵌入 HTML 代码 将代码粘贴到 从网络嵌入 窗口中 输出的长度是可变的 我希望有一种方法可以动态调整父级的高度iframeGoogle 协作平台用于托管我的 HTML 我知道我可以使用 Google 协
  • 如何设置vite.config.js基本公共路径?

    我正在尝试设置一个base url对于我的开发和生产环境 但是vitejs配置未解决 根据vitejs https vitejs dev config 您可以在配置选项中设置在开发或生产中提供服务时的基本公共路径 当从命令行运行 vite
  • 更快地开发和测试打印样式表的方法(避免每次都进行打印预览)?

    这是我现在的流程 保存对 print css 的更改 打开浏览器并刷新页面 右键单击并选择 打印 gt 打印预览 Firefox 但实际上是任何浏览器 第三步让我烦恼 我想知道是否可以通过插件或其他东西将其从流程中删除 只需选择以打印媒体形
  • iOS 解决方法:在没有 CSS 属性的情况下平滑滚动 滚动行为:平滑?

    编辑 我找到了一个 jQuery 解决方案 https codepen io chriscoyier pen dpBMVP https codepen io chriscoyier pen dpBMVP这个确实可以在 iOS 上运行 我想
  • 如何在 Laravel 5.4 中加载 Vue 组件?

    我已经运行 npm run watch 并收到了消息 This dependency was not found in resources assets js app js To install it you can run npm ins
  • 即使在包裹后也具有等宽的弹性项目

    是否可以制作一个像这样的纯 CSS 解决方案 物品有一些min width 它们应该动态增长以填充所有容器宽度 然后换行到新行 列表中的所有项目都应具有相同的宽度 现在看起来是这样的 这就是我希望它看起来像的样子 我已经手动管理这些底部项目
  • 将 CSS 生成的三角形拆分为 2 个水平不同的相同颜色

    正如您应该能够通过此代码看到的那样fiddle http jsfiddle net Xh36r 1 以及下面 我希望能够分割显示在第二个 div 顶部的 CSS 生成的三角形水平均等在 之间orange and green使用的颜色 现在它
  • HTML 元素的默认背景颜色是什么?白色还是透明?

    我只是被一个简单的问题困住了 想弄清楚 HTML 元素的默认背景颜色是什么 是白色的还是透明的 默认背景颜色是透明的 看这里 https developer mozilla org en docs Web CSS background co
  • 如何强制外部 div 扩展到内部 div 的高度?

    我有 ajax 到的数据 div class content 我希望外部 div 扩展到内部 div 的高度 我不知道该怎么做 HTML div class outer div class inner div class content S
  • 如何判断何时创建新组件?

    我一直在寻找背后的逻辑当有人在 AngularJS Angular 上的 Web 应用程序中创建新组件时但我认为这更通用 可能适用于所有基于组件的前端框架 我知道有像这样的一些原则应该是抽象的和可重用的但例如我在角度文档中看到 每个单独的路
  • 有没有办法使用 Vue-Router 从动态 URL 中删除目录?

    我为一家保险经纪公司构建了一个 vue js Web 应用程序 其中每个代理人都有自己的网站 该网站是根据他们的个人资料生成的 这就是我的 vue router 索引文件中的链接的样子 path agents id name AgentSi
  • 如何将类型设置为 vue slot props Typescript

    我正在尝试在插槽道具上设置类型以在表格组件中进行处理 如图所示 我也一直在尝试 body item UserItem 但这只是重命名参数 body
  • 滚动时将菜单栏固定在顶部[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我见过一些网站 当用户向下滚动页面时 会在右侧或左侧弹出一个框 另外 注意到这个模板 http www mvpthemes com m
  • 像在 tumblr 注册页面上那样鬼写

    有谁知道如何创建一个类似 tumblr 的字段 http www tumblr com http www tumblr com 这是一个 URL 字段 其中有一些褪色的文本 然后当您单击它并键入时 它会附加一些文本 tumblr com 您
  • 访问 nuxt 配置文件中的存储

    我想添加通过 Nuxt 静态生成的动态路由 我定义了一个客户端 服务器端存储asyncData方法 我想将这个存储值 一个数组 映射到我的nuxt config js文件使其成为 动态 静态 路线图nuxt generate命令 但如何访问
  • 将按钮文本放在一行上

    我的按钮文本在 safari 中显示在一行上 即使在初次单击后 但是在 google chrome 上 当您第一次到达该按 钮时 我的按钮将显示在一行上 但是当您浏览更多帖子并再次遇到 加载更多 按钮时 文本搞砸了 这只发生在谷歌浏览器上
  • 为不同的字体系列指定不同的字体大小

    有没有办法为不同的字体系列指定不同的字体大小 我想要使 用的字体 出于产品品牌目的 是一种有点罕见的字体 FlashDLig 并非所有 PC 和浏览器都支持 我的一台带有 IE 9 的 Windows 7 PC 不显示它 现在 对于我使用
  • 如何使用 CSS 媒体查询检测设备方向?

    在 JavaScript 中 可以使用以下方式检测方向模式 if window innerHeight gt window innerWidth portrait true else portrait false 但是 有没有一种方法可以仅
  • 适用于移动设备的响应式订单确认电子邮件?

    我从未见过令人惊叹的订单确认 发票电子邮件 即使是最好的 html5 网站也会发送糟糕的订单确认电子邮件 有时是纯文本 我相信这是因为发票通常需要使用表格来显示购买的物品 这在移动设备上实现起来非常困难 我发现了一些让手机上的表格更易于管理

随机推荐

  • windows网络模型

    完成端口 详解 解释的不错 http blog csdn net beyond cn article details 9336043 Windows Socket五种I O模型 http www cppblog com beautyking
  • Grayhill 072 16进制键盘扫描器的Verilog实现

    知识点 1 按键的机械原理 如何用一个module 模拟出按键的功能 体现的是抽象描述的能力 2 同步装置 因为按键输入的是异步信号 必须经过同步 因为s row 信号在经过同步装置后立马进入一个组合逻辑 为了消除潜在的冒险 这个例子中同步
  • Linux C/C++ PGO优化说明

    PGO Profile Guided Optimization 是指利用程序运行过程中采集到的 profile 数据 来重新编译程序以达到优化效果的 post link 优化技术 其原理认为 对于特征相似的 input 程序运行的特征也相似
  • RabbitMQ消息消费失败后的处理方案

    Q 业务系统之间通过MQ进行交互 当消费者发生未知异常时 消息消费失败 如何处理才保证消息的消费的可靠性 A 从如下几点考虑 何时ack 无论消息成功还是失败 都会ack 消息不会堆积在MQ中 只有成功才ack 消息堆积在MQ中 消费日志
  • 散列表的查找(哈希函数)

    哈希函数Hash 散列表的查找都是以关键字的比较为基础的 查找速度极快O 1 查找效率与元素个数n无关 直接找到 选取某个函数 依该函数按关键字计算元素的存储位置 并按此存放 给出关键字 gt 计算元素的存储位置 并存放 查找时 给出关键字
  • 2020年“华为杯”第十七届中国研究生数学建模竞赛B题心得(满纸荒唐言,一把辛酸泪)

    满纸荒唐言 一把辛酸泪 都云作者痴 谁解其中味 纪念2016 2020所有的数学建模论文 古人说得好 书到用时方恨少 事非经过不知难 做数学建模的我 方法用时真恨少 建模经过更知难 2020年9 17 21 应该是我最后一次参加数学建模比赛
  • 多线程:Java两个线程,一个打印A-Z,另一个打印1-26,输出结果:A1 B2 C3 ...... Z26

    最近看到一个题 很有意思 就是在Java里实现两个线程 一个线程打印字母 也就是 ABCD Z 另一个线程打印数字 也就是 1234 26 但是这两个线程需要交替打印 第一次字母线程先打印A 然后数字线程打印1 第二次字母线程先打印B 然后
  • vue & animate.css 使用讲解

    Animate css 库 官网 https animate style Vue 讲解 transition 官网 https cn vuejs org v2 guide transitions html 1 安装库 npm install
  • 人工智能是什么?人工智能行业前景如何

    人工智能是什么 人工智能行业前景如何 很多人都对人工智能领域感兴趣 那么究竟什么是人工智能 人工智能 英语 Artificial Intelligence 缩写为AI 亦称智械 机器智能 指由人制造出来的机器所表现出来的智能 通常人工智能是
  • 如何在eclipse中打开查看jar包(.class文件)

    打开Help Eclipse Marketplace 输入Enhanced Class Decompiler 选择插件 点解Install 安装完毕后重启 第一次打开 class文件 选择文件 点击鼠标右键 然后选择open class w
  • TTL设置多少合适?阿里域名解析TTL设置多少

    TTL设置多少合适 阿里域名解析TTL设置多少 TTL是Time To Live的缩写 指生存时间 而域名解析中提到的TTL值是指全国各地的localdns服务器中缓存解析结果的时间周期 简单来说就是一个网站www sss com 主机服务
  • L1-096 谁管谁叫爹 - java

    L1 096 谁管谁叫爹 时间限制 200 ms 内存限制 64 MB 题目描述 咱俩谁管谁叫爹 是网上一首搞笑饶舌歌曲 来源于东北酒桌上的助兴游戏 现在我们把这个游戏的难度拔高一点 多耗一些智商 不妨设游戏中的两个人为 A 和 B 游戏开
  • windows server 2012 安装完只有命令行

    今天在安装完windows server 2012 只有命令行 发现没有桌面 然后在别人的提醒下 才发现忘记安装gui了 这个时候 我也懒的重新安装一遍 所以就在网上找如何能够解决问题的方法 下面为解决方案 dism online enab
  • sqli-labs (less-21)

    sqli labs less 21 进入21关 输入用户名与密码 发现跟20关基本一样 这里我们猜想也是在cookie的位置进入注入 利用Cookies Manager 抓取到cookie信息后 发现竟然是一串字母 这里就很懵了 但我们仔细
  • Flask简单Mock Server

    Mock Server充当的角色 Mock server在实际项目中的意义就相当于数据库 将我想要的数据返回给我就行 我并不关心你怎么逻辑处理的 一般的应用程序请求方式是GET和POST Flask自带的request使用 request
  • docker登陆mysql提示密码错误(转载)

    正文 进入mysql报错 1045 28000 原因 mysql5 7 首次安装后 需要修改root的默认密码才能使用 为了解决这个问题 来来回回试了很多遍 这里就不说过程了 下面记录下目前看正确的处理步骤 docker安装Mysql 1
  • python3.8安装dlib库(Windows下)

    自己在网上找了半天 各种让安装这个 让安装那个的 然后最后也没搞成 就试着这样搞 竟然 了 教程 电脑之前已经安装好Anaconda 打开里面的 cmd prompt 1 安装cmake pip install cmake 或者利用镜像下载
  • python之t分布

    import numpy as np from scipy stats import norm from scipy stats import t import matplotlib pyplot as plt print 比较t 分布与标
  • idea 使用lombok @Slf4j ,找不到log,解决方案

    1 安装lombok插件 2 如果安装了lombok插件 但是编译的时候还是找不到log 检查Annotation Processors gt Enable annotation processing 是否勾选
  • Vue+ant-design-vue 表格实现可拖动的伸缩列

    应客户要求 表格要实现列宽可以自主调节 用户可以根据自己的喜好 拖动列边框 左右拖动实现列宽的扩大和缩小 ant design vue官方文档中 table组件中提供了此功能的示例代码 于是我满怀开心的复制到了我的项目中 结果处处报错 红彤