vue+Element中table表格实现可编辑(select下拉框)

本文介绍如何在表格中实现数据可编辑状态,特别是在单元格内加入动态下拉框,数据根据前一列ID动态生成。通过v-model绑定和:key的正确使用,确保数据准确显示和交互。分享了具体的HTML和JS代码实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在工作中遇到一个问题,需要在表格中实现数据可编辑状态,具体情况是需要在单元格里加入下拉框;并且每个下拉框的数组数据是不一样的,具体是根据当前行前面数据的id查询而来,前面的是数据是动态生成的,后面的下拉框数据也是根据id动态生成的,内容不同;有点类似于树形二级状态,后面的下拉框数据来源并没有在前面内容里,而是另外一个接口查询,具体操作如下:
在这里插入图片描述
HTML代码:

1.在处理人列加入一个下拉框模板,其中v-model必须要scope.row.proJbruserValue来绑定,意思是这个值绑定到当前行所选中的人;如果直接绑定proJbruserValue,将不能进行差异化选择,(这里scope.row.proJbruserValue 相当于对象点属性,在本地临时添加了一个属性来存储不同行的选中处理人id)

2.通过点击当前行下拉框获取焦点,根据当前行id查询对应的下拉框数据,并赋值给data中我们设置的数组接收,

3.一个重要的注意点,:key=item.id 这个key尽量绑定id,不推荐使用Index, 因为在这里使用Index的时候,会让选中项出现数字bug,这是我在坑里呆了好久才通过我的一个朋友得到的答案,具体bug原因尚未深究,请重点注意;

4.最后点击按钮提交流程配置;

<el-table :data="processNodelist" style="width: 100%" border stripe>
	<el-table-column type="index" label="序号" width="50"></el-table-column>
	<el-table-column prop="nodename" label="流程节点名称"></el-table-column>
	<el-table-column label="处理人名称">
		<template slot-scope="scope">
			<el-select v-model="scope.row.proJbruserValue"  @focus="getDatalist(scope.row)" placeholder="请选择" filterable allow-create>
				<el-option v-for="item in projectJbrUserlist " :key="item.id" :label="item.username" :value="item.id">
				</el-option>
			</el-select>
		</template>
	</el-table-column>
</el-table>
<el-button @click="submitConfigHandle" type="primary" size="mini" icon="el-icon-upload">提交配置</el-button>

js逻辑代码:

data() {
    return {
        processNodelist: [], // 流程节点数据
        projectJbrUserlist: [], // 处理人员数据
        nodeidlist: [], // 所有流程节点Id
        selectedUserlist: [], // 被选中的处理人员id数组
    }
},
created() {
    this.getProcessNodelist();
},
methods: {
    // 查询流程节点数据
        async getProcessNodelist() {
            const { data: res } = await this.$http.post('querynode', {
                userid: this.sessionInfo.userid,
                sid: this.sessionInfo.session,
                developerid: this.sessionInfo.companyId
            });
            if (res.code !== 0) {
                return this.$message.error('获取流程节点数据失败');
            }
            this.processNodelist = res.msg;
        },
        // select下拉框获取焦点的时候查询id对应的下拉框数据源
        async getDatalist(row) {
            const { data: res } = await this.$http.post('query', {
                userid: this.sessionInfo.userid,
                sid: this.sessionInfo.session,
                queryid: 9,
                nodeid: row.nodeid
            });
            if (res.code !== 0) {
                return this.$message.error('获取处理人数据失败');
            }
            this.projectJbrUserlist = res.msg;
        },
        // 提交流程配置接口
        async submitConfig() {
            const { data: res } = await this.$http.post('bindTask', {
                userid: this.sessionInfo.userid,
                sid: this.sessionInfo.session,
                flowid: 9,
                table_name: 'pt_base',
                key_value: this.sessionInfo.proId,
                nodeid: this.nodeidlist,
                uid: this.selectedUserlist
            });
            if (res.code !== 0) {
                return this.$message.error('流程节点配置失败');
            }
            this.$message.success('流程节点配置成功');
        },
        // 发起请求
        submitConfigHandle() {
            // 循环流程节点数组将所有nodeid取出添加到新数组
            for (let i = 0; i < this.processNodelist.length; i++) {
                this.nodeidlist.push(this.processNodelist[i].nodeid);
            }
            // 循环流程节点数组将所有被选择的处理人员id :proJbruserValue取出添加到新数组
            for (let i = 0; i < this.processNodelist.length; i++) {
                this.selectedUserlist.push(
                    this.processNodelist[i].proJbruserValue
                );
            }
            // 调用接口函数
            this.submitConfig();
        }
}

这次实现表格可编辑功能(select下拉框),主要有两个注意点,一是v-model的绑定问题,而是:key的绑定问题;这次我的数据接口是通过id返回的不同数据源,可以借鉴上面代码,如果你的(select下拉框)数据源是多个接口查询而来,你需要在通过接口查询到各个数据源,保存到data里面,然后还要做一些改变:
1.将v-for循环的数据改成通过函数传递当前行数据(id):

<el-option v-for="item in getdatalist(scope.row) "> </el-option>

2.通过传递过来的id来判断当前行需要返回的数据源;

getdatalist(row) {
    const id = row.nodeid;
    if ( id === '1') {
        return this.data1 
	} else if (id === '2') {
        return this.data2
	}
}

希望我的方法能给大家一些帮助和思路,最后有问题的朋友可以在下方评论一起交流!

Vue3中使用Element Plus以及Table组件来实现上述功能是一个常见的前端任务。首先,你需要安装相关的依赖,如`vue-element-plus`: ```bash npm install vue-element-plus@latest @el-plus/components table ``` 接下来,我们将创建一个名为`TableComponent.vue`的组件,结合Element UI Plus的`<el-table>`和相应的功能: ```html <template> <el-table :data="tableData" style="width: 100%" :row-key="getRowKey" :loading="isLoading" @fetch-data="onFetchData" :filter-method="handleFilter" ref="table" > <!-- 添加列配置 --> <el-table-column prop="name" label="姓名" width="180"></el-table-column> <el-table-column prop="age" label="年龄" width="180"></el-table-column> <!-- ...其他列... --> <!-- 分页 --> <el-pagination v-if="total" @current-change="setCurrentPage" :current-page.sync="currentPage" :page-size="pageSize" layout="total, sizes, prev, pager, next, jumper" ></el-pagination> <!-- 行内编辑 --> <template #editRow="{ row }"> <el-input v-model="row.name" placeholder="请输入名字"></el-input> <el-select v-model="row.role" placeholder="请选择角色"> <el-option value="admin" label="管理员"></el-option> <el-option value="user" label="普通用户"></el-option> </el-select> </template> <!-- 多表头 --> <el-table-column type="expand" render="expandRowContent"> </el-table-column> </el-table> </template> <script> export default { name: "TableComponent", components: { ElPagination }, data() { return { tableData: [], isLoading: false, currentPage: 1, pageSize: 10, searchKeyword: "", columnHeadings: [ { field: "name", title: "姓名" }, { field: "role", title: "角色" }, // 更多字段... ], columns: [], // 根据columnHeadings动态生成列 }; }, computed: { total() { // 返回总记录数,例如从服务器获取数据时填充 return this.tableData.length; }, getRowKey(item) { // 如果需要唯一标识每一行,返回对应的属性值 return item.id || item.key; // 假设item有id属性 }, }, methods: { onFetchData(page, size) { // 这里可以去请求后台数据,并将结果赋值给tableData this.isLoading = true; setTimeout(() => { const result = { data: [...this.randomData(size)], total: this.total }; this.tableData = result.data; this.isLoading = false; }, 1000); }, handleFilter(value, column) { // 搜索函数,可以根据column.field和value进行过滤 return column.field === 'name' ? { name: { $like: `%${value}%` } } : {}; }, setCurrentPage(newPage) { this.currentPage = newPage; }, expandRowContent({ $index, row }) { // 展开行内容的实现 return ` <div class="expand-row"> <p>详细信息...</p> <!-- 可添加更多详细信息 --> </div> `; }, randomData(size) { // 示例数据生成 return Array.from({ length: size }, (_, i) => ({ id: i, name: `Name ${i}`, role: ['admin', 'user'][Math.floor(Math.random() * 2)], })); }, }, }; </script> <style scoped> .expand-row { /* 自定义展开行样式 */ } </style> ``` 这个组件已经包含了基本的功能,你可以直接导入并使用。为了使其样式更美观,可以在`<style scoped>`标签内的CSS部分自定义样式。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值