动态列表的数据渲染、新增、编辑等功能开发及数据处理

说一个比较繁琐的功能吧,我使用的是 vue + element UI + vxe-table 来实现的这个动态列表,其实呢 vxe-table 这个表格插件里边有动态表格 vxe-grid 只需要通过表头数组里边的 field: 'name', 与表体数组里的 name: 'Test1', 对应上就行了,很简单吧;可是问题来了,后端给我的是一串超长的id,表体里也是给了一个超长的id让进行匹配(如:图1),然后导致匹配出现问题,搜了一下说纯数字不太行,会出问题,事实也确实如此,无论怎么匹配,页面只显示有多少行数据,但每一列的值都是空的,没有任何显示,于是就自己进行了数据的处理。

图1

注:根据上图会看到表体数组 rowsList 里边又是一个数组,里边这个数组里又包含了多个对象(这多个对象就是每一列对应的值了,需要用 fieId 去匹配)

html模版部分:

html 复制代码
<vxe-grid border resizable ref="xGrid" :columns="tableColumn" :data="tableData">
    <template v-slot:operation="{ row }">
        <el-button size="mini" @click="editBtn(row)" type="text">编辑</el-button>
        <el-button size="mini" @click="delBtn(row)" type="text" style="color: #f56c6c;">删除</el-button>
    </template>
</vxe-grid>

1、对接口获取到的数据进行匹配处理,然后回显到列表上,如下:

表头数据(模拟):

javascript 复制代码
let columnList = [
    {
        "fieId": "1909122684954550274",
        "title": "JST TPM",
        "fieldType": 4
    },
    {
        "fieId": "1909122684954550275",
        "title": "备注",
        "fieldType": 0
    },
    {
        "fieId": "1909122684962938882",
        "title": "客户提出人姓名",
        "fieldType": 0
    },
    {
        "fieId": "1909122684962938883",
        "title": "提出时间",
        "fieldType": 3
    },
    {
        "fieId": "1909122684962938884",
        "title": "客户需求明细",
        "fieldType": 1
    },
    {
        "fieId": "1909122684962938885",
        "title": "功能模块名称",
        "fieldType": 0
    }
]

表体数据(模拟):

javascript 复制代码
let rowsList = [
    [
        {
            "sortNo": "0",
            "fieId": "1909122684954550274",
            "fieValue": "111"
        },
        {
            "sortNo": "0",
            "fieId": "1909122684954550275",
            "fieValue": "2132"
        },
        {
            "sortNo": "0",
            "fieId": "1909122684962938882",
            "fieValue": "4124"
        },
        {
            "sortNo": "0",
            "fieId": "1909122684962938883",
            "fieValue": "2025-04-16 00:00:00"
        },
        {
            "sortNo": "0",
            "fieId": "1909122684962938884",
            "fieValue": "1"
        },
        {
            "sortNo": "0",
            "fieId": "1909122684962938885",
            "fieValue": "发送方"
        }
    ],
    [
        {
            "sortNo": "1",
            "fieId": "1909122684954550274",
            "fieValue": "139850429"
        },
        {
            "sortNo": "1",
            "fieId": "1909122684954550275",
            "fieValue": "12312"
        },
        {
            "sortNo": "1",
            "fieId": "1909122684962938882",
            "fieValue": "312312"
        },
        {
            "sortNo": "1",
            "fieId": "1909122684962938883",
            "fieValue": "2025-04-22 00:00:00"
        },
        {
            "sortNo": "1",
            "fieId": "1909122684962938884",
            "fieValue": "1"
        },
        {
            "sortNo": "1",
            "fieId": "1909122684962938885",
            "fieValue": "213124"
        }
    ]
]

处理方法:

javascript 复制代码
                columnList.forEach((item, index) => {
                        // 为每列添加唯一field标识
                        const fieldName = `title${index}`;
                        this.$set(item, 'field', fieldName);
                        this.tableColumn.push(item);
                        
                        // 处理行数据
                        rowsList.forEach((row, rowIndex) => {
                            row.forEach((cell) => {
                                if (item.fieId === cell.fieId) {
                                    // 初始化行对象(如果尚未存在)
                                    if (!tableList[rowIndex]) {
                                        tableList[rowIndex] = {
                                            // 基础信息
                                            id: rowIndex, // 添加行ID
                                            sortNo: cell.sortNo, // 添加编号
                                        };
                                    }
                                    // 添加动态字段
                                    this.$set(tableList[rowIndex], fieldName, cell.fieValue);
                                    // 保留原始数据(可选)
                                    this.$set(tableList[rowIndex], `${fieldName}_meta`, {
                                        fieId: item.fieId,
                                        title: item.title,
                                        fieldType: item.fieldType,
                                        content: cell.fieValue,
                                    });
                                }
                            });
                        });
                    });
                    this.tableData = tableList;
                    this.tableColumn.push(
                        { type: 'seq', fixed: "left", width: 50 },
                        { title: '操作', width: 100, showOverflow: true, fixed: "right", slots: { default: 'operation' } }
                    )
                console.log(this.tableColumn,'this.tableColumn');
                console.log(this.tableData,'this.tableData');

处理后的结果数据:

以上就对列表回显处理完成!

2、接下来是新增时候的处理

javascript 复制代码
        addBtn(){
            this.dialogVisible = true;
            this.titleText = '新增';
            this.tableColumn.map((item) => {
                item.manageId = this.queryData.id,
                this.$set(item, 'content', '');
            })
        },

新增直接在 this.tableColumn 里边新增一个content 字段 然后在提交的时候直接把 this.tableColumn 这个数组全部提交给后端即可!

3、编辑处理

javascript 复制代码
        editBtn(row){
            this.dialogVisible = true;
            this.titleText = '编辑';
            this.tableColumn.forEach(item => {
                if (!item.fieId) return; // 跳过没有 fieId 的,比如操作列等
                // 在 obj1 中查找所有带有 _meta 的键
                for (const key in row) {
                    if (key.endsWith('_meta')) {
                        const meta = row[key];
                        if (meta && meta.fieId === item.fieId) {
                            this.$set(item, 'content', meta.content);
                            break;
                        }
                    }
                }
            });
        },

注:因为在列表的时候修改了数据格式,所以在编辑的时候还要对数据进行处理,然后才能使用

编辑的处理方法说明:

  • row 中的 title0_meta, title1_meta 是动态的,不能直接写死去访问。

  • 所以用 for...in 遍历 row 所有键,找到以 _meta 结尾的。

  • 然后对比 meta.fieIditem.fieId,如果匹配,就把 content 写入到 item.content

附加:如果列表中有人员、组织、类型等字段需要通过id去匹配显示中文的,方法如下(我的是通过人员id匹配人员姓名展示):

修改 getList 方法

javascript 复制代码
getList() {
    this.loading = true;
    this.tableColumn = [];
    this.tableData = [];
    let tableList = [];
    let userIdList = []; // 新增:收集用户ID
    let userFieldMap = []; // 保存在哪些字段上用到用户信息

    let params = {
        manageId: this.queryData.id,
        current: this.tablePage.current,
        size: this.tablePage.size,
    };

    api.queryParticularsDataAttach(params).then((res) => {
        if (res.data.data == null) {
            this.tableColumn = [];
            this.tableData = [];
        } else {
            let columnList = res.data.data.columns;
            let rowsList = res.data.data.rowsList;
            this.tablePage.totalElements = res.data.data.total;

            columnList.forEach((item, index) => {
                const fieldName = `title${index}`;
                this.$set(item, 'field', fieldName);
                this.tableColumn.push(item);

                rowsList.forEach((row, rowIndex) => {
                    row.forEach((cell) => {
                        if (item.fieId === cell.fieId) {
                            if (!tableList[rowIndex]) {
                                tableList[rowIndex] = {
                                    id: rowIndex,
                                    sortNo: cell.sortNo,
                                };
                            }

                            // 动态字段赋值
                            this.$set(tableList[rowIndex], fieldName, cell.fieValue);
                            this.$set(tableList[rowIndex], `${fieldName}_meta`, {
                                fieId: item.fieId,
                                title: item.title,
                                fieldType: item.fieldType,
                                content: cell.fieValue,
                            });

                            // 如果是人员类型字段(fieldType === 4),收集 userId
                            if (item.fieldType === 4 && cell.fieValue) {
                                userIdList.push(cell.fieValue);
                                userFieldMap.push({
                                    rowIndex,
                                    fieldName,
                                    userId: cell.fieValue,
                                });
                            }
                        }
                    });
                });
            });

            this.tableData = tableList;

            // 插入序号列和操作列
            this.tableColumn.push(
                { type: 'seq', fixed: "left", width: 50 },
                { title: '操作', width: 100, showOverflow: true, fixed: "right", slots: { default: 'operation' } }
            );

            // 👇 去查人员名称
            if (userIdList.length > 0) {
                this.getUsersList(userIdList).then((userMap) => {
                    // 替换tableData中的字段内容为用户姓名
                    userFieldMap.forEach(({ rowIndex, fieldName, userId }) => {
                        const user = userMap[userId];
                        if (user) {
                            // 替换显示值
                            this.$set(this.tableData[rowIndex], fieldName, user.realName + '(' + user.account + ')');
                            // 同步 meta 中的 content 也更新为姓名
                            if (this.tableData[rowIndex][`${fieldName}_meta`]) {
                                this.tableData[rowIndex][`${fieldName}_meta`].content = user.realName + '(' + user.account + ')';
                            }
                        }
                    });
                });
            }
        }

        this.loading = false;
    }).catch(() => {
        this.loading = false;
    });
},

// 👇 获取人员数据的方法:返回 userId -> user 信息的映射
getUsersList(idList) {
    return api.getPeoples(idList).then((res) => {
        const userList = res.data.data || [];
        const userMap = {};
        userList.forEach(user => {
            userMap[user.id] = user;
        });
        return userMap;
    });
}

以上仅是个人实现的使用方法,可根据自己的需求进行修改或者优化

至此完成!!!

测试有效!!!感谢支持!!!

相关推荐
海晨忆27 分钟前
【Vue】v-if和v-show的区别
前端·javascript·vue.js·v-show·v-if
JiangJiang1 小时前
🚀 Vue人看React useRef:它不只是替代 ref
javascript·react.js·面试
1024小神1 小时前
在GitHub action中使用添加项目中配置文件的值为环境变量
前端·javascript
龙骑utr1 小时前
qiankun微应用动态设置静态资源访问路径
javascript
Jasmin Tin Wei1 小时前
css易混淆的知识点
开发语言·javascript·ecmascript
齐尹秦1 小时前
CSS 列表样式学习笔记
前端
wsz77771 小时前
js封装系列(一)
javascript
Mnxj1 小时前
渐变边框设计
前端
用户7678797737321 小时前
由Umi升级到Next方案
前端·next.js
快乐的小前端1 小时前
TypeScript基础一
前端