首页 > 其他分享 >AntDesign - Vue Table组件 实现动态表格、列宽计算(方式二)

AntDesign - Vue Table组件 实现动态表格、列宽计算(方式二)

时间:2024-11-27 09:15:13浏览次数:6  
标签:Vue const 表格 width key AntDesign Table data columns

  朋友们,按照上文(方式一)思路,实现了动态表格和表头分组,这篇按照方式一的需求,扩展出另一种代码写法;

一、表格头

  表格columns 还是定义在data() {} 中,初始化静态列数组,配置项列由后端接口返回(第二点写动态配置项代码);

  在方式一基础上加了 筛选菜单 功能,因此变化代码部分如下:

 :columns="filterColumns()"
<a-table ref="table" bordered :columns="filterColumns()" :dataSource="tableData" :loading="loading" :pagination="false" :scroll="{y: tableHeight-60, x:'max-content'}" :style="{ height: tableHeight+ 'px' }"></a-table>
// data定义 columns静态列
columns: [ { title: '单号', dataIndex: 'businessNumber', key: 'businessNumber', width: 200, },{ title: '时间', dataIndex: 'adTimeText', key: 'adTimeText', width: 160, },{ title: '单据类型', dataIndex: 'adTypeText', key: 'adTypeText', width: 120, },{ title: '类型', dataIndex: 'type', key: 'type', width: 120, customRender: (text)=>{ return <span>{text==1?'分明细':'平明细'}</span> } },{ title: '状态', dataIndex: 'adStatus', key: 'adStatus', width: 120, scopedSlots: { filterDropdown: 'ADStatusFilter',customRender: 'ADStatusSlot' }, },{ title: '总额', dataIndex: 'total', key: 'total', width: 90, }, ],

  表头增加筛选菜单功能,因为data() 定义中尽量不用this,所以添加筛选菜单时,放在methods方法上,如下:

// 表头筛选菜单
filterColumns(){ const columns = deepClone(this.columns) columns.map(item => { if(item.key == 'adStatus'){ this.$set(item, 'filtered', this.adStatus); // 标识数据是否经过过滤,图标会高亮 } return item }) return columns },

  表格状态列加了筛选功能,筛选图标是否高亮由 this.adStatus 值变化,绑定adStatus状态如下:

    <template slot="ADStatusFilter" slot-scope="{ confirm }">
          <SelectSearch v-model="adStatus" :options="adStatusList" @search="val=>{ handleSearch(val,confirm)}"></SelectSearch>
    </template>

二、表格体

  展现内容和上文一样,和方式一的区别在于企微主体名称所在的列需要动态计算宽度,不然渲染就会列错位,解决方式如下:

  关键代码是  getTextWidthFn() 

async queryList(){
      let res = await GetList()
      let {data}=res.data
      let result =data&&data.length?data.sort((a1,a2)=>a1.sort-a2.sort):[]
      let colArr=[]
      // 获取企微主体名称文字的宽度
      const getTextWidthFn = (text)=>{
        const fontfamily = "Microsoft YaHei,PingFang SC"
        const canvas = document.createElement("canvas")
        const ctx = canvas.getContext("2d")
        ctx.font = `14px ${fontfamily}`
        const textMetrics = ctx.measureText(text)
        const actual = Math.abs(textMetrics.actualBoundingBoxLeft) + Math.abs(textMetrics.actualBoundingBoxRight)+32 // 加表头滚动条边距32
        return Math.ceil(Math.max(textMetrics.width, actual))
      }
      result.forEach((el,index)=>{
        let i=index+1
        let textWidth = getTextWidthFn(el.subjectName)
        textWidth = textWidth&&textWidth<132?'132px': textWidth+'px' // 如果计算出文字宽度小于132,固定宽度为132px
        colArr.push({
          title: el.subjectName,
          dataIndex: 'alreadyTotal'+i, // 企微主体名称列索引值
          key: 'alreadyTotal'+i, // 注意i值
          scopedSlots: { customRender: 'alreadyTotalSlot' },
          width: textWidth,
          customCell: () => {
            return {
              style: {
                width: textWidth
              }
            }
          },
          id: el.subjectId,
        })
      })
      if(JSON.stringify(this.accountData)!=JSON.stringify(colArr))this.columns=this.columns.concat(colArr)
      this.accountData=colArr
      this.$nextTick(()=>{
        this.queryPage()
      })
    },

  代码思路是: 通过canvas设置文字大小和内容,通过 ctx.measureText 计算出文字宽度,赋值给列宽,然后设置单元格属性;

    列数组计算完后,合并静态列和动态列数组,渲染到表格上。

  表格列动态绘制及列宽展示代码,结束啦,哈哈哈~

  上文链接: https://www.cnblogs.com/anniey/p/18569807

标签:Vue,const,表格,width,key,AntDesign,Table,data,columns
From: https://www.cnblogs.com/anniey/p/18570671

相关文章

  • Vue2教程003:Vue指令之v-bind和v-for
    文章目录2.6v-bind2.7图片轮播案例2.8v-for2.9图书管理案例2.6v-bind作用:动态设置html的标签属性->src、url、title…语法:v-bind:属性名="表达式"动态设置img标签的src属性:<body><divid="app"><imgclass="image"v-bind:src="imgUrl"alt=......
  • 基于SpringBoot+Vue的高校迎新管理系统
    感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人2025最新毕业设计项目推荐-SSM篇2025最新毕业设计项目推荐-SpringBoot篇2025最新毕业设计项目推荐-小程序、uniapp篇-CSDN博客Java精品毕设实战案例推荐​高......
  • SpringBoot+Vue的高校运动会管理系统
    感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人2025最新毕业设计项目推荐-SSM篇2025最新毕业设计项目推荐-SpringBoot篇2025最新毕业设计项目推荐-小程序、uniapp篇-CSDN博客Java精品毕设实战案例推荐​高......
  • SpringBoot+Vue的宠物领养系统
    感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人2025最新毕业设计项目推荐-SSM篇2025最新毕业设计项目推荐-SpringBoot篇2025最新毕业设计项目推荐-小程序、uniapp篇-CSDN博客Java精品毕设实战案例推荐​宠......
  • 基于SpringBoot+Vue的体育赛事资讯平台
    感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人2025最新毕业设计项目推荐-SSM篇2025最新毕业设计项目推荐-SpringBoot篇2025最新毕业设计项目推荐-小程序、uniapp篇-CSDN博客Java精品毕设实战案例推荐​体......
  • vue3+vite打包配置,并部署nginx,解决部署之后axios请求跨域
    配置base配置base避免打包部署到服务器上后可能会报404,无法正确的获取的资源。//vite.config.tsexportdefaultdefineConfig({ base:"./"})配置路径别名//vite.config.tsimport{defineConfig}from"vite";importvuefrom"@vitejs/plugin-vue";//配置组件路......
  • [Whole Web] Vue design and React design
    VirtualDOMAdvantage:OneoftheadvantagesofthevirtualDOMiscross-platformrenderingabstraction.ThevirtualDOMcanconnecttodifferenthostenvironments,enablingoneframeworktorenderacrossmultipleplatforms.1.WhydidReactswitchfromt......
  • 最佳实践:如何在 Vue.js 项目中使用 Jest 进行单元测试
    前言随着应用程序规模和复杂性的增加,保证代码质量和稳定性变得愈发重要。单元测试作为软件测试的一部分,能够有效地捕捉代码中的错误,防止在开发过程中引入新的Bug。在众多测试框架中,Jest因其易用性、强大功能以及与Vue.js的良好兼容性,成为了许多开发者的首选。本文将详......
  • 基于springboot+vue的Java的学生课外时间管理系统(源码+文档+部署讲解等)
    课题简介基于SpringBoot+Vue的学生课外时间管理系统旨在帮助学生合理规划与高效利用课外时光。此系统具备活动发布模块,学校或社团可发布各类课外活动信息,涵盖学术讲座、文体赛事、兴趣小组等内容,并设定活动时间、地点与报名要求;学生报名模块,学生能够依据自身兴趣与时......
  • 基于springboot+vue的Java的学生档案管理系统的设计与实现(源码+文档+部署讲解等)
    课题简介基于SpringBoot+Vue的学生档案管理系统能有效整合与管理学生各类档案信息。系统包含学生基本信息管理模块,可录入并更新姓名、年龄、联系方式等;学业成绩管理模块,记录各科目成绩、考试时间及绩点计算;奖惩记录模块,存储学生获得的荣誉与违规情况;档案查询模块,方便......