表格数据转换,后台返回的表格数据状态都是数字,所以前台需要转换一下。
后台返回的状态配置数据:
{ "status": [ { "label": "待发布", "value": "1" }, { "label": "上线中", "value": "2" }, { "label": "已下线", "value": "3" } ], "edu":[ { "label": "小学", "value": "1" }, { "label": "初中", "value": "2" }, { "label": "高中", "value": "3" }, { "label": "本科", "value": "4" }, { "label": "研究生", "value": "5" }, { "label": "博士", "value": "6" }, { "label": "博士后", "value": "7" } ]}
表格数据
[ { "status": 1, "edu": 2 }, { "status": 1, "edu": 3 }, { "status": 2, "edu": 6 }, { "status": 3, "edu": 7 }]
根据状态配置数据使得前台表格展示相应的名称label。
我是怎么处理的呢,我对el-table进行二次分装,然后在处理数据转换
<template> <div :style="`${$attrs.height? 'height:'+$attrs.height:''};`" class="eletable-container" > <el-table ref="table" v-loading="searching" :data="pagedData" :border="border" stripe highlight-current-row v-bind="$attrs" v-on="$listeners" @selection-change="handleSelectionChange" > <template v-for="(item, index) in columnList"> <el-table-column v-if="item.slotScope" :key="item.prop + index" v-bind="item" :label="$t(item.label)" > <template slot-scope="scope"> <slot :name="item.prop" v-bind="scope" > {{ filterVal(item.prop, item.prop) }} </slot> </template> </el-table-column> <el-table-column v-else-if="item.selection" :key="`selection${index}`" type="selection" :width="item.width || 50" :align="item.align || 'center'" /> <column v-else :key="item.prop + index" :column="item" /> </template> </el-table> <el-pagination class="el-pagination" v-if="displayPagination" :current-page="currentPage" :page-sizes="page_sizes" :page-size="size" :layout="layout" :total="total" @size-change="handleSizeChange" @current-change="handleCurrentChange" /> </div></template><script>import { deepCopy } from '@/utils'import scrollTo from '@/utils/scrollTo'import Column from './column'import { getFormUniData } from '@/api/taskPool'export default { name: 'EleTable', components: { Column, }, props: { remoteMethod: { type: Function, default: null, }, page_size: { type: Number, default: 20, }, page_sizes: { type: Array, default: () => [15, 20, 30, 40, 50], }, layout: { type: String, default: 'total, sizes, prev, pager, next, jumper', }, border: { type: Boolean, default: true, }, displayPagination: { type: Boolean, default: true, }, tableData: { type: Array, default: () => [], }, columnList: { type: Array, default: () => [], }, }, data() { return { postData: {}, searching: false, data: [], currentPage: 1, size: this.page_size, total: 0, bodyWrapperEl: undefined, formUniData: {}, } }, computed: { pagedData() { scrollTo(this.bodyWrapperEl) if (this.remoteMethod || !this.displayPagination) { return this.data } const offset = (this.currentPage - 1) * this.size return this.data.slice(offset, offset + this.size) }, }, watch: { tableData: { handler(val) { this.data = val || [] }, immediate: true, }, }, created() {}, mounted() { this.bodyWrapperEl = this.$refs.table.$el.querySelector( '.el-table__body-wrapper' ) this.getFormUniData() }, methods: { async loadData(params, callback) { if (this.remoteMethod) { this.currentPage = 1 await this._loadData(params, callback) } }, async _loadData(params, callback) { if (!this.remoteMethod) { return } if (params) { this.postData = deepCopy(params) } this.postData = this.postData || {} this.postData.page = this.currentPage this.postData.page_size = this.size this.searching = true try { const response = await this.remoteMethod(this.postData) if (response) { const { data, recordsCount } = response this.data = data this.total = recordsCount this.$emit('data-change', data) this.$emit('page-change', this.postData) if (callback && typeof callback === 'function') { callback(data) } } } catch (e) { this.data = [] } this.searching = false }, handleSizeChange(size) { this.size = size this._loadData() }, handleCurrentChange(page) { this.currentPage = page this._loadData() }, handleSelectionChange(val) { this.$emit('selection-change', val) }, // 数据过滤 filterVal(prop, val) { const propList = this.formUniData[prop] || [] this.pagedData.forEach(item => { const res = Object.keys(item).filter(it => it == val) console.log(res, 'res====='); }); console.log(propList, 'propList====='); if (propList.length > 0) { const item = propList.filter((item) => item.value == val)[0] console.log('item------', item) return item ? item.label : '-' } return val }, // 获取配置列表接口 async getFormUniData() { try { const data = await getFormUniData() this.formUniData = data } catch (error) { return this.$message(error) } }, },}</script><style lang="scss" scoped>.eletable-container { padding: 20px 0;}.el-pagination { text-align: right; margin-top: 20px;}</style>
filterVal就是我分装的方法,但是封装的有问题,展示出来的还是数字
const statusData = { "status": [{ "label": "待发布", "value": "1"}], "edu":[{ "label": "小学", "value": "1" } ]}// 初始化一个新的 Map 对象,同时每个键对应的值都是一个空的 Map 对象。键的部分来源于statusData 对象的键(包括 "status" 和 "edu")const statusMap = new Map(Object.keys(statusData).map(key => ([key, new Map()]))// 循环遍历 statusData 中的每一项数据for (let key in statusData) { // 获取当前 key 对应的 Map 对象 const map = statusMap.get('key') // 遍历 statusData 中当前 key 对应的数组,对数组中的每一项 itm,将 itm.value 作为 map 的键,itm.label 作为 map 的值,将其添加到 map 中。 statusData[key].map(itm => map.set(itm.value, itm.label))}// 表格进行映射的时候可以这么写// statusMap.get('status').get(scope.row.value)
可以让filterVal接受两个参数,分别是prop和对应的value
<el-table-column v-if="item.slotScope" :key="item.prop + index" v-bind="item" :label="$t(item.label)" > <template slot-scope="scope"> <slot :name="item.prop" v-bind="scope" > {{ filterVal(item.prop, scope.row[item.prop]) }} </slot> </template> </el-table-column>
然后在filterVal里面用刚刚算出来的map直接返回对应的label
filterVal(prop, val) { return statusMap.get(prop).get(val)}
const statusConfig = { "status": [ { "label": "待发布", "value": "1" }, { "label": "上线中", "value": "2" }, { "label": "已下线", "value": "3" } ], "edu":[ { "label": "小学", "value": "1" }, { "label": "初中", "value": "2" }, { "label": "高中", "value": "3" }, { "label": "本科", "value": "4" }, { "label": "研究生", "value": "5" }, { "label": "博士", "value": "6" }, { "label": "博士后", "value": "7" } ]};const tableData = [ { "status": 1, "edu": 2 }, { "status": 1, "edu": 3 }, { "status": 2, "edu": 6 }, { "status": 3, "edu": 7 }];const transformedTableData = tableData.map(row => { return { ...row, status: statusConfig.status.find(s => s.value === row.status.toString())?.label, edu: statusConfig.edu.find(e => e.value === row.edu.toString())?.label };});console.log(transformedTableData);
<template> <el-table :data="transformedTableData"> <!-- el-table 的其他配置 --> </el-table></template><script>export default { props: { statusConfig: { type: Object, required: true }, tableData: { type: Array, required: true } }, computed: { transformedTableData() { return this.transformData(this.tableData, this.statusConfig); } }, methods: { transformData(tableData, statusConfig) { return tableData.map(row => { const newRow = { ...row }; Object.keys(statusConfig).forEach(key => { const config = statusConfig[key]; newRow[key] = config.find(item => item.value === row[key].toString())?.label; }); return newRow; }); } }};</script>
// 数据过滤filterVal(prop, val) { const propList = this.formUniData[prop] || []; if (propList.length > 0) { const item = propList.find(item => item.value === val.toString()); return item ? item.label : '-'; } return val;}
el-table 如何根据表格数据合并行。 如图所示,name列的值一样,就合并成一行;Amount 1列合并成3行 演示地址
下面数据格式有什么比较优雅的转换方式吗? 请各位大佬解惑
el-table中设置tree-props树形数据勾选完成后怎么回显选中状态
拖动的时候滚动条会往后溜,而且很不灵敏,有遇到过的朋友吗,另外是否有element官方群?
有什么好的办法,目前尝试了el-table-infinite-scroll,不行,下完包引入以后,还要提示下其他相关的包,vue-composition.js等等;有没有其他可实现的插件吗?
本文向大家介绍JavaScript如何动态创建table表格,包括了JavaScript如何动态创建table表格的使用技巧和注意事项,需要的朋友参考一下 两种JavaScript动态创建table表格的方法,分享给大家,具体实现如下 方法一:最原始的方法,创建一一元素 方法二:利用table对象里面含有的函数:插入行和插入列 动态的创建和删除: 创建表格,通过输入的值: 删除行: 删除列: 完整