当前位置: 首页 > Web前端 > HTML

基于业务沉淀组件manage-table

时间:2023-03-28 14:42:28 HTML

2020年下半年,屏幕上有几张图:有人骑着自行车看书,有人骑着自行车玩电脑,有人手上堆着一堆床上的书……”一边骑自行车一边玩电脑的学生被称为“卷王”,上了热搜榜。渐渐地,这些学生毕业了,卷王带着卷子走入社会,带领其他人人跟他们一起滚。越来越多的人在做论文。出现了意义之轮的现象。造轮子本来是个好东西,但是随着内卷的出现,造轮子逐渐进化到了极致,并且出现了凭空造轮子、重复造轮子之类的事情,既不能为业务服务,还让内卷现象越来越严重,真正的惨状是无法言喻的。分析问题enco对当前的业务有所了解,进而产生新的想法和结论,用技术手段提高工作效率和开发速度,才是真正有意义的轮子,没有白费。CMS(内容管理系统)一词由来已久,通常指内容管理系统,是介于WEB前端和后端办公系统或进程之间的软件系统。在开发cms后台的过程中,最常用的应该是Table,比如antd的table:这应该是后台管理系统开发中最常用的组件。没有Table,不好意思说是cms系统。但是在稍微大一点的业务中会有一个很普遍的问题,就是一个数据源会有很多字段需要展示。如果都陈列起来,会有一种非常不美观和凌乱的感觉,而且会很刺眼。同时,不同的人希望看到不同的领域。例如,学生A希望看到标题0、1、2、3,学生B希望看到标题1、2、3、4,学生C希望看到标题7、8、9、10等。这是一个非常个性化的需求。如果要让后端同学参与,会增加后端同学的工作量,同时前端的工作也不会相应减少。得益于浏览器的localstorage存储能力,前端完全不需要后端同学的参与就可以实现。首先,既然是antd的Table组件,我们必须在已有功能的基础上实现这个需求,所以需要在Table组件的基础上再建一层,既不能影响Table的显示,又可以还可以自定义显示列。那么我们可以列出需求:在不影响Table显示的情况下,可以选择自定义显示列,可以对显示列进行排序,对业务没有其他影响(这个是最重要的)。既然需求已经明确了,那么我们就可以开始整个流程了,具体实现就不多说了。我们可以看一下实现后的效果:打磨的初步需求已经实现,可以高枕无忧了。这怎么可能?想太多!!!是的,后来产品说现在数据展示栏太多了,比以前多了三倍,选择展示栏的时候要分组,不然都挤在一起不好找,严重影响工作效率up!卧槽!最糟糕的是,人们说这会影响工作效率。你为什么现在谈论这么严重的问题?为什么不早点提出要求?如果早说的话,肯定早就实现了,不会出现影响工作效率的问题。啊!!!我真是个口是心非,心狠手辣,可是我知道,小蝌蚪才是心狠手辣的人,我不配!!话多了会哭的,还是抓紧时间提出要求吧。看效果:嗯,完美,就是这个效果。对Table的封装进行了二次修改。在不影响之前使用的基础上,增加了支持分组的能力。我真的很棒!>然而,快乐的时光总是那么短暂~~有一天,我们的另一个平台发现,嘿嘿,你的功能真好用,能不能给我们用一下,嗯,最简单直接的方法就是复制粘贴.复制粘贴到一半突然来了一个人要用这个功能,WTMD很头疼。话虽这么说,让我们把它打包成一个npm包。我将它发布为一个组件包给你,你可以直接安装使用。只需使用npmi管理表。使用npmimanage-tableoryarnaddmanage-tablemanage-table组件有对应的peerDependencies,如果没有安装,需要手动安装对应的依赖:"peerDependencies":{"@ant-design/icons":"^4.6.4","antd":"^4.12.0","react":"^17.0.0","react-beautiful-dnd":"^13.1.0"}用法-:直接引用,使用内置settings代码如下:importManageTablefrom"manage-table";import'./App.css';importReactfrom"react";functionApp(){constmockColumns=newArray(50).fill('').map((_item:string,index)=>{return{dataIndex:'title'+index,key:'title'+index,title:'title'+index,show:index%3===0,};});mockColumns.push({dataIndex:'action',key:'action',title:'operation',show:true,});return(

);}exportdefaultApp;效果如下:使用方法二:自定义表头部分代码如下:importReactfrom"react";import{Button}from"antd";importManageTablefrom"manage-table";导出默认函数nApp2(){constmockColumns=newArray(50).fill("").map((_item,index)=>{return{dataIndex:"title"+index,key:"title"+index,title:"title"+index,show:index%3===0};});mockColumns.push({dataIndex:"action",key:"action",title:"operation",show:true});constref=React.createRef();consthandleShowModal=()=>{ref.current.showModal();};constSettingHeader=(自定义设置
);return(
);}效果如下:使用方法3:组显示代码如下:importReactfrom"react";import{Button}from"antd";importManageTablefrom"manage-table";constmockGroup=()=>{constdata=newArray(4).填充('').map((_item:string,index:number)=>{return{title:'group'+index,records:newArray(10).fill('').map((_item:string,indx)=>{return{dataIndex:'title'+index+'_'+indx,key:'title'+index+'_'+indx,title:'title'+index+'_'+indx,show:indx%5===0,};}),};});//任何索引都可以,不一定是0data[0].records.push({dataIndex:'action',key:'action',title:'actioncolumn',show:true,})returndata;}export默认函数AppGroupRef(){constref:any=React.createRef();consthandleSet=()=>{ref.current.showModal();}constSettingHeader=(自定义设置
);返回();}效果如下:除了上述三种方法外,其他方法还支持配置固定显示,即默认显示部分字段,不允许排序和删除。manage-table默认存储在浏览器缓存中,是跟随浏览器的,如果不想使用浏览器缓存,而是自定义存储,也是支持的。具体如下:ManageTable,继承自antd的Table参数名称类型表示用于namestring存储的唯一键,必须通过columnsManageColumnType[]GroupManageColumn[]列数据,必须通过refReact.createRef()的返回对象来增加panel,optionalSettingCompReact.ReactNode自定义设置header,optionalsetTitleReact.ReactNode,string自定义弹窗标题,默认为'setdisplayfield',optionaldefaultShowKeysstring[]默认显示的字段,无需选择orsortinitialShowKeysstring[]初始显示的字段,自定义存储onKeysSelected(keys:string[])=>void存储钩子函数,使用自定义存储的ManageColumnType,继承自antd的TableColumnType参数名称类型说明showboolean是否默认显示GroupManageColumn,继承来自antd的Table的ColumnType参数名称类型描述titlestring组名,必须通过recordsManageColumnType[]column数据,一定要写到底欢迎使用和反馈。开源代码仓库:manage-tablenpm地址:manage-table2022年了,继续上卷,停止盲目滚动,开启高级滚动。假期马上就要到了,提前祝大家新年快乐~