当前位置: 首页 > news >正文

使用el-table实现行内编辑功能

在Element UI的el-table中实现行内编辑,主要有两种主流方法:一种是通过条件渲染在单元格内切换文本和表单组件,另一种是封装可复用的编辑组件

条件渲染方法

这种方法的核心是使用 v-if 和 v-else 根据当前行是否处于编辑状态,来切换显示普通文本或输入框。

核心步骤:

  1. 数据准备:为表格数据源的每个对象添加一个状态字段(如 isSet 或 edit),用于控制当前行(或单元格)的编辑模式。

  2. 模板定义:在 el-table-column 的插槽模板中,根据状态字段条件渲染文本或表单组件。

  3. 操作按钮:在操作列提供“编辑/保存”、“取消/删除”等按钮,并绑定对应的方法来切换状态和执行业务逻辑。

示例代码:

下面的例子展示了如何实现一个包含编辑和保存功能的行内编辑表格。

<template><el-table :data="tableData" border style="width: 100%"><!-- 姓名列 --><el-table-column prop="name" label="姓名"><template slot-scope="scope"><span v-if="!scope.row.isEdit">{{ scope.row.name }}</span><el-input v-else v-model="scope.row.editName" size="mini"></el-input></template></el-table-column><!-- 操作列 --><el-table-column label="操作" width="180"><template slot-scope="scope"><!-- 非编辑状态下的按钮 --><el-button v-if="!scope.row.isEdit" size="mini" @click="enterEdit(scope.row)">编辑</el-button><el-button v-if="!scope.row.isEdit"size="mini" type="danger">删除</el-button><!-- 编辑状态下的按钮 --><el-button v-else size="mini" type="success" @click="saveEdit(scope.row)">保存</el-button><el-button v-else size="mini" @click="cancelEdit(scope.row)">取消</el-button></template></el-table-column></el-table>
</template><script>
export default {data() {return {tableData: [{ id: 1, name: '张三', isEdit: false, editName: '' },{ id: 2, name: '李四', isEdit: false, editName: '' },// ... 更多数据]};},methods: {enterEdit(row) {// 进入编辑状态,备份当前数据row.isEdit = true;row.editName = row.name;},saveEdit(row) {// 保存编辑,可以在这里发送AJAX请求row.name = row.editName;row.isEdit = false;// 调用API提交更改},cancelEdit(row) {// 取消编辑,恢复备份的数据row.isEdit = false;row.editName = '';}}
};
</script>

自定义编辑组件方法

对于更复杂或需要高度复用的场景,可以封装一个自定义的编辑单元格组件,使编辑逻辑更加清晰和内聚。

核心思路:
创建一个名为 EditableCell 的组件,它根据外部传入的 canEdit 属性来决定是显示普通的文本内容,还是一个可交互的表单组件。

示例组件 (EditableCell.vue):

<template><div @click="onCellClick" class="edit-cell"><!-- 非编辑模式下显示内容,鼠标悬停有提示 --><el-tooltip v-if="!isEditing" content="点击编辑" placement="top"><div class="cell-content"><slot name="content">{{ value }}</slot></div></el-tooltip><!-- 编辑模式下显示输入组件 --><componentv-else:is="editableComponent"ref="inputRef"v-bind="$attrs"v-model="currentValue"@blur="onInputExit"@change="onInputExit"><slot name="edit-component-slot"></slot></component></div>
</template><script>
export default {name: 'EditableCell',props: {value: [String, Number, Date], // 单元格的值canEdit: Boolean, // 是否可编辑editableComponent: { // 使用的编辑组件类型type: String,default: 'el-input'}},data() {return {isEditing: false,currentValue: this.value};},watch: {value(newVal) {this.currentValue = newVal;}},methods: {onCellClick() {if (this.canEdit && !this.isEditing) {this.isEditing = true;// 下一个tick聚焦输入框this.$nextTick(() => {const input = this.$refs.inputRef;if (input && input.focus) input.focus();});}},onInputExit() {if (this.isEditing) {this.isEditing = false;// 将值传递回父组件this.$emit('input', this.currentValue);this.$emit('change', this.currentValue);}}}
};
</script><style scoped>
.edit-cell {min-height: 25px;cursor: pointer;
}
.cell-content {padding: 8px 0;
}
</style>

在表格中使用自定义组件:

<template><div id="app"><el-table :data="gridData"><el-table-column label="姓名" min-width="150"><template slot-scope="{row}"><editable-cell :can-edit="true" v-model="row.name"><span slot="content">{{ row.name }}</span></editable-cell></template></el-table-column><el-table-column label="性别" min-width="120"><template slot-scope="{row}"><editable-cell :can-edit="true"editable-component="el-select"v-model="row.gender"><!-- 非编辑状态下显示的内容 --><el-tag slot="content":type="row.gender === 'M' ? 'primary' : 'danger'">{{ row.gender === 'M' ? '男' : '女' }}</el-tag><!-- 编辑状态下,下拉框的选项 --><template slot="edit-component-slot"><el-option value="M" label="男"></el-option><el-option value="F" label="女"></el-option></template></editable-cell></template></el-table-column></el-table></div>
</template><script>
import EditableCell from './components/EditableCell.vue';export default {components: { EditableCell },data() {return {gridData: [{ date: '2016-05-03', name: '汤姆', gender: 'M' },{ date: '2016-05-02', name: '丽莎', gender: 'F' }]};}
};
</script>

http://www.dtcms.com/a/474160.html

相关文章:

  • 虹口高端网站建设中英文网站是咋做的
  • Linux 之 【基本指令 与 shell命令以及运行原理】
  • AI虚拟细胞(AIVCs)赋能生命科学:三大数据支柱与闭环学习破解传统实验困局
  • 茂名营销型网站制作公司做灯笼手工简单做法
  • 长沙网站排名优化二极管 东莞网站建设
  • 【Linux探索学习】第三篇Linux的基本指令(3)——开启Linux学习第三篇
  • 牛客算法_模拟
  • 多线程 —— CAS 原理
  • 兰州做网站的有哪几个网站后台登陆不了
  • css实现表格中最后一列固定
  • 优秀原创设计网站门户系统设计
  • linux环境docker如何让启动的容器在后台运行
  • 软考架构师高分避坑指南:三科实战拆解与破局之道
  • 新手向C语言JavaPython 的选择与未来指南
  • 摄影网站难做吗网站如何集成微信支付
  • Redis5安装与核心命令详解
  • 单个请求中同时使用 multipart/form-data 和 application/json 的可行性及正确实现方式
  • wordpress网站配置甜妹妹福利wordpress
  • 新奇的Word表格单元格合并
  • 网站建设模板系统网站漂浮广告怎么做
  • 【如何解决“支付成功,但订单失败”的分布式系统难题?】
  • MQTT系列(三)
  • app开发流程表北京网站优化快速排名
  • 衡石科技嵌入式BI:重构企业应用的数据智能生态
  • rdd数据存储在spark内存模型中的哪一部分
  • 肥西县重点工程建设管理局网站支付宝 收费 网站开发
  • [webgl]基于THREEJS开发的sdk,使开发三维效果更加的容易
  • [Java、C语言、Python、PHP、C#、C++]——深度剖析主流编程语言的核心特性与应用场景
  • Deployment 和 StatefulSet 的区别
  • 广州自助网站制作网站开发成app