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

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

1-1、数据格式:

 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、代码

<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>
<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、 数据格式:

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、代码

<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;
});

### 实现 Element UI `el-table` 自定义显示和隐藏 为了实现在Element UI中的`<el-table>`组件内自定义的显示与隐藏功能,可以采用创建一个控制面板来管理哪些应该被展示或隐藏的方式[^1]。 通过维护一个状态表,该表记录每一当前的状态(即是否可见),可以在渲染表格之前依据此状态决定每数据是否加入到最终呈现给用户的表格结构中。具体来说,在Vue实例里设置一个对象或者数组用来保存各个字段对应的布尔值表示其可视性;接着利用计算属性根据这些标志位过滤实际要传递给`columns`配置项的内容。 下面是一个简单的例子说明如何实现这一特性: ```html <!-- HTML部分 --> <div id="app"> <template> <!-- 控制栏:勾选框组用于切换不同的显隐 --> <div style="margin-bottom:20px;"> <label v-for="(item, index) in columns" :key="index"> <input type="checkbox" v-model="selectedColumns" :value="item.prop">{{ item.label }} </label> </div> <!-- 表格主体 --> <el-table :data="tableData" border stripe> <el-table-column v-for="(column, idx) of visibleColumns" :key="idx" :prop="column.prop" :label="column.label"></el-table-column> </el-table> </template> </div> ``` ```javascript // JavaScript (Vue.js) 部分 new Vue({ el: '#app', data() { return { // 定义初始所有的信息 columns: [ { prop: 'date', label: '日期' }, { prop: 'name', label: '姓名' }, { prop: 'address', label: '地址' } ], selectedColumns: ['date', 'name'], // 默认选中的 tableData: [{ date: '2016-05-03', name: 'Tom', address: 'No. 189, Grove St, Los Angeles' }, /* ... */ ] }; }, computed: { // 计算出当前应显示的集合 visibleColumns() { return this.columns.filter(column => this.selectedColumns.includes(column.prop)); } } }); ``` 上述代码片段展示了怎样构建一个基础版本的支持选择性的显示/隐藏机制。这里的关键在于使用了`v-model`指令绑定复选框的选择情况至`selectedColumns`变量,并且借助于计算属性`visibleColumns`动态调整真正参与视图更新的那一部分内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值