当前位置: 首页 > Web前端 > vue.js

20行代码封装一个可配置(vue)表格组件,够了吗?我觉得还可以

时间:2023-04-01 00:50:39 vue.js

组件需要传一个columns配置文件来生成对应的table,传一个data来渲染对应的数据。数据可以通过槽进行两次处理。组件设计的列为数组类型(必填)列中的每一项都是一个对象(必填)列中的每个对象应包含:title(String):根据该key生成的head对应的th(必填)dataIndex(String):根据此key渲染对象的数据(此key与data中的key一一对应)(必填)customRender(Boolean):判断是否根据此key分配对应的slot(可选)data是数组类型(必填)data中的每一项都是一个对象,里面的key必须对应上面列的dataIndex(必须)预期用法{{文本===1?'男':'女'}}修改删除

预期效果组件的实现(这里使用JXS)首先根据上面的要求定义了两个propsprops:{columns:{type:Array,required:true},data:{type:Array,default:()=>[]}}然后根据传入的列的标题生成对应的thead//根据配置生成thead_renderHeader(h){returnh('thead',{class:'y-header'},[h('tr',{class:'y-header-row'},[this.columns.map(row=>{returnh('th',{class:['y-header-column','y-table-left']},row.title)})])])}紧接着根据列的dataIndex结合d的键值对渲染对应的数据阿塔,然后判断是否根据columns的customRender分配对应的slot//根据配置生成tbody,然后根据customRender分配scopeslot_renderBody(h){returnh('tbody',{},[this.data.map(row=>{returnh('tr',{class:'y-body-row'},[this.columns.map(item=>{returnh('td',{class:'y-body-column'},item.customRender&&this.$scopedSlots[item.dataIndex]?this.$scopedSlots[item.dataIndex](row[item.dataIndex],{...row}):row[item.dataIndex])})])})])}这里生成的slot是作用域slot,有时候是package组件神一般的存在,这里将当前值传递给slot的第一个参数,而当前行数据传递给第二个参数,所以可以这样获取外面的数据修改Delete
最后拼表,返回就OK了//拼表_renderTable(h){return()}render(h){return(this._renderTable(h))}至此,已经按照上面的要求实现了对应可配置表格组件,核心是上面两个生成方法(_renderHeader,_renderBody)大概20行,对于熟悉JSX和scopedslots的同学来说很容易。有兴趣的同学可以继续根据自己的需要扩展自己需要的表格组件。

猜你喜欢