一.后端
1.创建一个实体用来返回虚拟化表格所需要的表头参数
@Data @AllArgsConstructor @NoArgsConstructor public class ColumnObj { private String key; private String dataKey; private String title; private Integer width; }
2.自定义一个注解,实现自定义返回的表头名和默认宽度
@Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) @Inherited public @interface ColumnTitle { String name(); int width() default 150; }
3.通过反射的形式获取需要创建的实体的属性名,并且把所有属性名添加到返回的表头集合中
List<ColumnObj> columnList = new ArrayList<>(); Class<User> clazz = User.class; Field[] fields = clazz.getDeclaredFields(); for (java.lang.reflect.Field field : fields) { var titleAnn = field.getAnnotation(ColumnTitle.class); String columnTitle = ""; if (titleAnn == null || StringUtils.isEmpty(titleAnn.name())) columnTitle = field.getName(); else columnTitle = titleAnn.name(); columnList.add(new ColumnObj(field.getName(), field.getName(), columnTitle, 150)); }
4.自定义一个返回的VO,把表格的表头数据和和实际数据返回给前端
@Data @AllArgsConstructor @NoArgsConstructor public class ResultObj { private List<ColumnObj> columnList; private String dataJson; }
return R.ok(new ResultObj(columnList, JSON.toJSONString(list)));
二.前端
1.template
<el-col :span="8"> <!-- 表格数据 --> <el-card shadow="never"> <template #header> <div class="card-header"> <span>{{ opTitle }}</span> </div> </template> <el-auto-resizer> <template #default="{ height, width }"> <el-table-v2 :columns="columns" :data="dataList" :width="width" :height="252" fixed/> </template> </el-auto-resizer> </el-card> </el-col>
2.script
import { getTableData, } from "@/api/..." const opTitle = ref(''); const dataList = ref([]); const columns = ref([]); function getData(row) { columns.value = [] dataList.value = [] proxy.$modal.loading("查询中,请稍等...") getTableData(row.id).then(res => { columns.value = res.data.columnList dataList.value = JSON.parse(res.data.dataJson) }).finally(() => { proxy.$modal.closeLoading() } ) }
2.api
export function getTableData(id) { return request({ url: '', method: 'get', params: { id: id } }) }
三.总结
1.按照上诉步骤就可以完成虚拟化表格自定义的表头显示数据了,我这里是后端传了JSON数据返回给前端,所有前端需要把JSON数据进行格式化,大家也可以后端直接前一个List集合给前端,这样还少了一个转换的步骤。
2.默认是把实体的所有属性都返回给前端作为表头,如果有不需要的属性,大家也可以在后端过滤一遍后再返回给前端。