el-table 自定义列、自定义数据

一、对象数组格式自定义拆分为N列

1-1、数据格式:

javascript 复制代码
 const arrayList = ref([
        {"RACK_NO": "A-1-001"},
        {"RACK_NO": "A-1-002"},
        { "RACK_NO": "A-1-003"},
        //省略多个
        {"RACK_NO": "A-1-100"}
])

1-2、自定义为3列: 数据 | 操作 | 数据 | 操作 | 数据 | 操作

1-3、代码

javascript 复制代码
<template>
    <div>
        <el-table :data="tableList" border ref="table" :cell-style="{ 'text-align':             
            'center' }" :header-cell-style="{
            background: '#5f697d',
            color: '#fff',
            height: '10px',
            'text-align': 'center'
        }" stripe v-loading="loading">
            <!-- 动态生成列 -->
            <template v-for="(column, index) in columns" :key="index">
                <el-table-column :label="column.label" :width="column.width">
                    <template #default="{ row }">
                        <div v-if="column.type === 'number'" class="rack_style">
                            {{ row[column.index]?.RACK_NO }}
                        </div>
                        <el-button v-else-if="column.type === 'action'" type="primary"
                            v-if="row[column.index]?.RACK_NO">
                            {{ row[column.index]?.RACK_NO }}
                        </el-button>
                    </template>
                </el-table-column>
            </template>
        </el-table>
    </div>
</templete>


<script setup>

    const columns = ref([
          { label: '编号', type: 'number', index: 0, width: '150' },
          { label: '操作', type: 'action', index: 0 },
          { label: '编号', type: 'number', index: 1, width: '150' },
          { label: '操作', type: 'action', index: 1 },
          { label: '编号', type: 'number', index: 2, width: '150' },
          { label: '操作', type: 'action', index: 2 }
    ]);

</script>
javascript 复制代码
<script setup>
import { ref, onMounted } from 'vue'
 
const RACK_NO_LIST = ref([])  // 得到的数据
const tableList = ref([])  // 处理后的数据

// 截取处理数据
const chunkArray = (arr, size) => {
    const result = [];
    for (let i = 0; i < arr.length; i += size) {
        result.push(arr.slice(i, i + size));
    }
    return result;
}

const getOneDetail = async (val) => {
    loading.value = true
    try {
           userService.getTableList(val).then(res => {
            if (res.code === 200) {
                RACK_NO_LIST.value = res.data.RACK_NO_LIST
                tableData.value = chunkArray(RACK_NO_LIST.value, 3);
            } else {
                toast(res.msg, 'error');
            }
        })
    } finally {
        loading.value = false
    }
}


onMounted(() => {
    const urlParams = new URLSearchParams(window.location.search)
    currentRackCode.value = urlParams.get('code')?.toString() || ''
    if (currentRackCode.value) {
        getOneDetail(currentRackCode.value)
    }
})

二、自定义表头、列、数据

2-1、 数据格式:

javascript 复制代码
const data = ref({
    "类型1": [{"WT": "1.0", "MNY": "1.00", "WT_NM": "kg", "GRADE_NO": "1"}], 
    "类型2" : [{ "WT": "2.0", "MNY": "3.00", "WT_NM": "kg", "GRADE_NO": "1" }],
    "类型3" : [{ "WT": "2.0", "MNY": "3.00", "WT_NM": "kg", "GRADE_NO": "2" }]
})

2-2、需要的样式

2-3、代码

javascript 复制代码
<template>
    <div>
         <el-table :data="tableListShow" border ref="table"
                    :cell-style="{ 'text-align': 'center' }" :header-cell-style="{
                        background: '#5f697d',
                        color: '#fff',
                        height: '10px',
                        'text-align': 'center'
                    }" stripe v-loading="loading">

                    <el-table-column v-for="(column, index) in tableColumns" :key="index"         
                        :label="column.label"
                        :prop="column.prop">
                        <template #default="scope">
                            {{ scope.row[column.prop] }}
                        </template>
                    </el-table-column>
           </el-table>
    </div>
</template>
<script setup>

const tableList = ref([]) // 返回的数据
const tableListShow = ref([])  // 表格实际显示的数据

onMounted(() => {
    tableList.value = {
    "类型1": [{"WT": "1.0", "MNY": "1.00", "WT_NM": "kg"}], 
    "类型2" : [{ "WT": "2.0", "MNY": "3.00", "WT_NM": "kg"}],
    "类型3" : [{ "WT": "2.0", "MNY": "3.00", "WT_NM": "kg"}]
    }
});


// 自定义表头
const tableColumns = computed(() => {
    const columns = [];
    for (const key in tableList.value) {
        const firstItem = tableList.value[key][0];
        if (firstItem) {
            const gradeNoLabel = key  // 类型1 类型2 类型3
            columns.push({ label: '重量', prop: `${key}_WT_WTNM` });
            columns.push({ label: gradeNoLabel , prop: `${key}_MNY` });
        }
    }
    return columns;
});


// 处理显示的数据
const tableListShow = computed(() => {
    const result = [];
    let maxLength = 0;

    for (const key in tableList.value) {
        maxLength = Math.max(maxLength, tableList.value[key].length);
    }

    for (let i = 0; i < maxLength; i++) {
        const row = {};
        for (const key in tableList.value) {
            const item = tableList.value[key][i];
            if (item) {
                row[`${key}_WT_WTNM`] = `${item.WT} ${item.WT_NM}`;
                row[`${key}_MNY`] = `₩${fitem.MNY}`;
            } else {
                row[`${key}_WT_WTNM`] = "-";
                row[`${key}_MNY`] = "-";
            }
        }
        result.push(row);
    }
    return result;
});
相关推荐
不好听61314 分钟前
React 父子组件通信:从 Todo 应用理解单向数据流
前端·react.js
光影少年17 分钟前
RN 路由栈管理、页面销毁、返回拦截
javascript·react native·react.js
_lucas22 分钟前
做了一个glsl在线调试工具
前端·javascript·three.js
To_OC8 小时前
LC 51 N 皇后:我以为难的是回溯,结果栽在了对角线下标
javascript·算法·leetcode
腻害兔9 小时前
【若依项目-产品经理视角】深度拆解 RuoYi-Vue-Pro 商城模块:从商品管理到交易引擎,50 张表撑起一整套电商系统
java·大数据·vue.js·产品经理·ai编程
不好听6139 小时前
从一行 JSX 到屏幕像素:前端开发者必须懂的浏览器渲染管线
前端
恒拓高科WorkPlus9 小时前
企业级内网即时通讯建设模型:BeeWorks内网IM四层架构
前端
前端小李子10 小时前
前端环境变量裸奔?我用 EnvShield 给它穿了件防弹衣
前端
youtootech10 小时前
HarmonyOS《柚兔学伴》项目实战25-我的页面、Web 嵌入与项目总结
前端·华为·harmonyos
小林ixn10 小时前
从零到一理解 React 父子组件通信:手写一个 Todo 应用带你彻底搞懂单向数据流
前端·javascript·react.js