封装通用mixins,在vue中实现a-table组件的可伸缩列(详细且使用便捷)

news2024/11/17 5:41:35

1、实现效果

 2、使用场景

  • vue2 + antd-vue 1.x版本
  • 由于antd-vue 1.x版本的组件库没有提供可伸缩列的功能,才需要我们手动开发
  • 在antd-vue 3.x版本以上的表格已经支持这个功能,不需要我们再去手动开发

3、话不多说,上代码

首先安装vue-draggable-resizable,版本2.1.0可以使用,其他版本未尝试

yarn add vue-draggable-resizable@2.1.0
or
npm i vue-draggable-resizable@2.1.0

src/mixins目录下建一个DraggableResizable.js

import Vue from 'vue'
import VueDraggableResizable from 'vue-draggable-resizable'
Vue.component('vue-draggable-resizable', VueDraggableResizable)

export default {
  created() {
    this.componentsColumns = {
      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])
        },
      },
    }
  },
  computed: {
    // 动态获取scrollX,防止数组固定列的大小变化
    scrollX() {
      return this.columns.reduce((preVal, curVal) => {
        // console.log(preVal + curVal.width);
        return preVal + curVal.width
      }, 0)
    }
  }
}

页面中使用

import DraggableResizable from '@/mixins/DraggableResizable'
export default {
  mixins: [DraggableResizable],
}

绑定到a-table组件上,组件上新增:components="componentsColumns"和:scroll="{ x: scrollX }"

<a-table
  :loading="loading"
  bordered
  @change="handleTableChange"
  :row-key="(record, index) => index"
  :columns="columns"
  :data-source="list"
  :pagination="pagination"
  :row-class-name="isRedRow"
  filtered
  :components="componentsColumns"
  :scroll="{ x: scrollX }"
></a-table>

调整列配置项集合columns

  • 由于我封装的mixins中对当前页面中的columns做的操作,所以你表格中columns属性绑定的数据也应该叫做columns
  • width和dataIndex为必传项,如果你的width是字符串'100px',请改为数字类型100,因为涉及到某些计算
  • 当然如果某一列不想伸缩,可以不传dataIndex,但是width是必传哦,例如如下代码中的序号列
data() {
  return {
    columns: [
        {
          title: '序号',
          width: 65,
          customRender: (text, record, index, column) => {
            return index + 1
          },
          align: 'center',
        },
        {
          title: '订单编号',
          dataIndex: 'orderNumber',
          align: 'center',
          ellipsis: true,
          width: 200,
        },
        {
          title: '创建时间',
          dataIndex: 'createTime',
          customRender: (text) => (text ? text : '--'),
          align: 'center',
          ellipsis: true,
          width: 200,
        },
        {
          title: '创建人',
          dataIndex: 'createByName',
          customRender: (text) => (text ? text : '--'),
          align: 'center',
          ellipsis: true,
          width: 100
        },
        {
          title: '客户名称',
          dataIndex: 'clientName',
          customRender: (text) => (text ? text : '--'),
          align: 'center',
          ellipsis: true,
          width: 200,
        }
     ] 
  }  
}
最后是当前页面的css,如果是less或者scss记得带上/deep/或者::v-deep
/deep/.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;
}
/deep/.resize-table-th {
  position: relative;
}

4、页面使用完整代码

<template>
  <div>
      <a-table
          bordered
          @change="handleTableChange"
          :columns="columns"
          :data-source="list"
          :pagination="pagination"
          filtered
          :components="componentsColumns"
          :scroll="{ x: scrollX }"
      >
      </a-table>
  </div>
</template>

<script>
import DraggableResizable from '@/mixins/DraggableResizable'
export default {
  mixins: [DraggableResizable],
  data() {
    return {
      pagination: {
        current: 1,
        pageSize: 100,
        pageSizeOptions: ['10', '20', '50', '100', '200'],
        showQuickJumper: false,
        showSizeChanger: true,
        total: 0,
      },
      list: [],
      columns: [
        {
          title: '序号',
          width: 65,
          customRender: (text, record, index, column) => {
            return index + 1
          },
          align: 'center',
        },
        {
          title: '订单编号',
          dataIndex: 'orderNumber',
          customRender: (text, record) => (text ? (text + (record.divideOrderNumber || '')) : '--'),
          align: 'center',
          ellipsis: true,
          width: 200,
        },
        {
          title: '创建时间',
          dataIndex: 'createTime',
          customRender: (text) => (text ? text : '--'),
          align: 'center',
          ellipsis: true,
          width: 200,
        },
        {
          title: '创建人',
          dataIndex: 'createByName',
          customRender: (text) => (text ? text : '--'),
          align: 'center',
          ellipsis: true,
          width: 100
        },
        {
          title: '客户名称',
          dataIndex: 'clientName',
          customRender: (text) => (text ? text : '--'),
          align: 'center',
          ellipsis: true,
          width: 200,
        },
        {
          title: '操作',
          dataIndex: 'action',
          scopedSlots: {customRender: 'action'},
          align: 'center',
          width: 120,
          fixed: 'right'
        },
      ],
    }
  },
}
</script>
<style lang="less" scoped>
/deep/.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;
}
/deep/.resize-table-th {
  position: relative;
}
</style>
如果解决了你的问题点个赞吧^_^

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1419852.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android MediaCodec 简明教程(四):使用 MediaCodec 将视频解码到 Surface,并使用 SurfaceView 播放视频

系列文章目录 Android MediaCodec 简明教程&#xff08;一&#xff09;&#xff1a;使用 MediaCodecList 查询 Codec 信息&#xff0c;并创建 MediaCodec 编解码器Android MediaCodec 简明教程&#xff08;二&#xff09;&#xff1a;使用 MediaCodecInfo.CodecCapabilities 查…

白嫖!平替ChatGPT,高效阅读文档,支持pdf上传!

大家好&#xff0c;我是阿潘&#xff0c;现在技术更新的太快了&#xff0c;每天arxiv上面更新的论文太多了看不过来&#xff0c;同时还有一大堆公众号、知识星球、知乎等等&#xff0c;太多需要关注的信息了&#xff0c;力不从心啊。但是又怕漏掉一些有用的信息 因此今天跟大家…

FastBee开源物联网平台2.0开源版发布啦!!!

一、项目介绍 物美智能(wumei-smart)更名为蜂信物联(FastBee)。 FastBee开源物联网平台&#xff0c;简单易用&#xff0c;更适合中小企业和个人学习使用。适用于智能家居、智慧办公、智慧社区、农业监测、水利监测、工业控制等。 系统后端采用Spring boot&#xff1b;前端采用…

怎么把word文档转换成pdf?几种高效转换方法了解一下

怎么把word文档转换成pdf&#xff1f;在当今这个时代&#xff0c;PDF已经成为一种通用的文件格式&#xff0c;广泛应用于各种场景。将Word文档转换为PDF&#xff0c;可以确保文档的格式、字体、图片等元素在各种设备和软件上保持一致。那么&#xff0c;如何将Word文档转换为PDF…

Liunx基础-----------------------第十六章网站服务

一、概念 UI的转变&#xff1a;B/S框架 HYML&#xff1a;超文本标记语言 网页&#xff1a;使用HTML&#xff0c;PHP&#xff0c;JAVA语言格式书写的文件 主页&#xff1a;网页中呈现用户的第一个页面 网站&#xff1a;多个网页组合而成的一台网站服务器 URL&#xff1a;统…

vue3封装el-pagination分页组件

1、效果如图&#xff1a; 2、分页组件代码&#xff1a; <template><div class"paging"><el-config-provider :locale"zhCn"><el-paginationv-model:current-page"page.currentPage"v-model:page-size"page.pageSize…

【BUG】golang gorm导入数据库报错 “unexpected type clause.Expr“

帮同事排查一个gorm导入数据报错的问题 事发现场 ck sql CREATE TABLE ods_api.t_sms_jg_msg_callback_dis (app_key String DEFAULT COMMENT 应用标识,callback_type Int32 DEFAULT 0 COMMENT 0送达&#xff0c;1回执,channel Int32 DEFAULT 0 COMMENT uid下发的渠道,mode…

element ui组件 el-date-picker设置default-time的默认时间

default-time &#xff1a;选择日期后的默认时间值。 如未指定则默认时间值为 00:00:00 默认值修改 <el-form-item label"计划开始时间" style"width: 100%;" prop"planStartTime"><el-date-picker v-model"formData.planStart…

安装elasticsearch、kibana、IK分词器

1.部署单点es 1.1.创建网络 因为我们还需要部署kibana容器&#xff0c;因此需要让es和kibana容器互联。这里先创建一个网络&#xff1a; docker network create es-net 1.2.加载镜像 这里我们采用elasticsearch的7.12.1版本的镜像&#xff0c;这个镜像体积非常大&#xff0…

flutter module打包成framework引入原生工程

Flutter - 将 Flutter 集成到现有项目&#xff08;iOS - Framework篇&#xff09; 本篇文章大幅参考了 caijinglong 大佬的总结文章&#xff1a; 把flutter作为framework添加到已存在的iOS中[1] 用 Flutter 来开发&#xff0c;从来都不可能是新开的一个纯 Flutter 项目&#xf…

vite+vue3 使用svg icon(包括element-plus icon)

1、安装依赖 npm i element-plus/icons-vue -S npm i vite-plugin-svg-icons -D2、在vite.config.ts文件中 import path from path; import { createSvgIconsPlugin } from vite-plugin-svg-icons; // 版本不同引入方式不同 export default defineConfig({...plugins: [...cr…

文件夹隐藏了怎么找出来?如何取消文件夹隐藏属性

在我们的日常工作中&#xff0c;经常会遇到文件夹被隐藏的情况&#xff0c;这可能会让我们在寻找需要的文件时感到困惑。那么&#xff0c;如何找回这些隐藏的文件夹呢&#xff1f;本文将为你提供一些实用的方法&#xff0c;帮助你解决这个问题。 图片来源于网络&#xff0c;如有…

温酒读Qt:QObject中篇2 ——欲遮还羞的 QObjectPrivate

《妙法莲华经》曰&#xff1a;“佛道长远&#xff0c;久受勤苦&#xff0c;乃可得成。” 世事修炼&#xff0c;莫不如是&#xff0c;日拱一卒无有尽&#xff0c;功不唐捐终入海。 传送门: 《温酒读Qt&#xff1a;QObject 序篇》 《温酒读Qt&#xff1a;QObject中篇1—— Q_OBJ…

宝塔控制面板配置SSL证书实现网站HTTPS

宝塔安装SSL证书提前申请好SSL证书&#xff0c;如果还没有&#xff0c;先去Gworg里面申请&#xff0c;一般几分钟就可以下来&#xff0c;申请地址&#xff1a;首页-Gworg官方店-淘宝网 一、登录邮箱下载&#xff1a;Gworg证书文件目录 &#xff0c;都会有以下五个文件夹。宝塔…

红外热成像仪定制_热成像仪/红外夜视仪开发方案

红外热成像技术是一种利用红外热成像仪将物体发出的不可见红外辐射能量转换成可见的温度场图像的技术&#xff0c;通过不同颜色来表示不同温度。这项技术的应用领域非常广泛&#xff0c;从电路维修到暖通检测再到汽车故障排查等各个领域都有着重要的作用。 红外热成像仪的解决方…

数字人解决方案VividTalk——音频驱动单张照片实现人物头像说话的效果

前言 VividTalk是一项由南京大学、阿里巴巴、字节跳动和南开大学共同开发的创新项目。该项目通过结合单张人物静态照片和一段语音录音&#xff0c;能够制作出一个看起来仿佛实际说话的人物视频。项目的特点包括自然的面部表情和头部动作&#xff0c;口型能够同步&#xff0c;同…

搞明白手机卡的合约期和优惠期才能避免很多坑!

很多朋友注销流量卡时才发现自己的套餐有合约期无法注销&#xff0c;尤其是联通和移动&#xff0c;那么什么是合约期呢&#xff1f;合约期和优惠期又有什么不一样呢&#xff1f;下来答案来了。 其实&#xff0c;目前很多在网上办理的大流量卡都是有合约期的&#xff0c;尤其是移…

05. 交换机的基本配置

文章目录 一. 初识交换机1.1. 交换机的概述1.2. Ethernet_ll格式1.3. MAC分类1.4. 冲突域1.5. 广播域1.6. 交换机的原理1.7. 交换机的3种转发行为 二. 初识ARP2.1. ARP概述2.2. ARP报文格式2.3. ARP的分类2.4. 免费ARP的作用 三. 实验专题3.1. 实验1&#xff1a;交换机的基本原…

JSP仓储管理系统myeclipse定制开发SQLServer数据库网页模式java编程jdbc

一、源码特点 JSP仓储管理系统系统是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库 &#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为SQLServer2008&#x…

小白水平理解面试经典题目LeetCode 455 Assign Cookies【Java实现】

455 分配cookies 小白渣翻译&#xff1a; 假设你是一位很棒的父母&#xff0c;想给你的孩子一些饼干。但是&#xff0c;你最多应该给每个孩子一块饼干。 每个孩子 i 都有一个贪婪因子 g[i] &#xff0c;这是孩子满意的 cookie 的最小大小&#xff1b;每个 cookie j 都有一个…