如何在 Vue 中创建一个带有表格和表单的弹窗

2024-08-29 18:20

本文主要是介绍如何在 Vue 中创建一个带有表格和表单的弹窗,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文将通过一个具体的示例来介绍如何在 Vue 应用中实现一个带有表格和表单功能的弹窗组件。我们将使用 Element UI 库中的 el-dialog 组件来构建这个弹窗,并结合 el-table 和 el-form 来展示数据并允许用户进行编辑。

效果图:

完整代码最底部,以下拆分解析----------

1. 引入必要的 Element UI 组件
 

2. 创建弹窗结构
接下来定义弹窗的基本结构。这里我们使用 el-dialog 组件,并为其设置一些基本属性如标题、宽度等:

<el-dialogclass="edit-dialog"title="编辑"width="80%":center="true"ref="dialogRef":visible.sync="dialogVisible"@close="resetForm('resetForm')":before-close="beforeClose":close-on-click-modal="false":close-on-press-escape="false">
</el-dialog>

3. 添加表单和表格
在弹窗内部添加一个表单 (el-form) 和表格 (el-table),并通过 v-model 双向绑定数据

<el-form ref="formRef" style="padding: 20px" label-width="100px"><el-tableborderstripeclass="table-style"max-height="350":data="tableData"style="width: 100%; min-height: 200px;"><!-- 表格列定义 --></el-table>
</el-form>

4. 定义表格列
为表格定义多个列,包括索引、发票类型选择器、输入框等:

<el-table-column type="index" label="序号" align="center" width="60" show-overflow-tooltip></el-table-column>
<el-table-column prop="invoiceType" label="发票类型" align="center" min-width="280"><template slot-scope="scope"><el-selectmultiplestyle="width: 100%"collapse-tagsv-model="scope.row.invoiceTypeCode"><el-optionv-for="(item, index) in typeList":key="index":label="item.invoiceTypeName":value="item.invoiceTypeCode"></el-option></el-select></template>
</el-table-column>
<el-table-column prop="taxCategory" label="税收分类简称" align="center" min-width="180"><template slot-scope="scope"><el-input placeholder="请输入税收分类简称" v-model="scope.row.taxCategory" clearable></el-input></template>
</el-table-column>
<el-table-column prop="taxRate" label="税率" align="center" min-width="180"><template slot-scope="scope"><el-input placeholder="请输入税率" v-model="scope.row.taxRate" clearable></el-input></template>
</el-table-column>
<el-table-column prop="dateRange" label="适用时间" align="center" min-width="280"><template slot-scope="scope"><el-date-pickerv-model="scope.row.dateRange"type="daterange"range-separator="至"value-format="yyyy-MM-dd"start-placeholder="开始日期"end-placeholder="结束日期"></el-date-picker></template>
</el-table-column>
<el-table-column label="操作" align="center" width="80" :render-header="renderHeader"><template slot-scope="scope"><i @click.prevent="deleteRow(scope.$index, scope.row)" class="el-icon-delete"></i></template>
</el-table-column>

5. 添加操作按钮
在弹窗底部添加两个按钮用于关闭和保存:

<div slot="footer"><el-button size="medium" @click="closeDialog">取消</el-button><el-button size="medium" type="primary" ref="saveButton" @click="saveData('formRef')">保存</el-button>
</div>

6. 定义相关方法
最后,在 Vue 实例的方法部分定义与弹窗相关的处理逻辑,例如关闭时重置表单、保存数据等:

export default {data() {return {dialogVisible: false,tableData: [],typeList: [], // 示例数据formRef: null,dialogRef: null};},methods: {resetForm(formName) {this.$refs[formName].resetFields();},beforeClose(done) {this.resetForm('formRef');done();},deleteRow(index, row) {this.tableData.splice(index, 1);},closeDialog() {this.dialogVisible = false;this.resetForm('formRef');},saveData(formName) {this.$refs[formName].validate(valid => {if (valid) {// 保存数据逻辑console.log(this.tableData);this.closeDialog();}});},renderHeader(h, { column }) {return h('span', [h('i', { style: 'color: #409EFF' }, '添加行'),h('span', '操作')]);}}
};

完整代码如下:

<template><el-dialogtitle="编辑"width="80%":center="true"ref="dialogRef":visible.sync="dialogVisible"@close="resetForm('formRef')":before-close="beforeClose":close-on-click-modal="false":close-on-press-escape="false"><el-form ref="formRef" style="padding: 20px" label-width="100px"><el-tableborderstripeclass="custom-table"max-height="350":data="tableData"style="width: 100%; min-height: 200px;"><el-table-column type="index" label="序号" align="center" width="60" show-overflow-tooltip></el-table-column><el-table-column prop="invoiceType" label="发票类型" align="center" min-width="280"><template slot-scope="scope"><el-selectmultiplestyle="width: 100%"collapse-tagsv-model="scope.row.invoiceTypeCode"><el-optionv-for="item in typeList":key="item.invoiceTypeCode":label="item.invoiceTypeName":value="item.invoiceTypeCode"></el-option></el-select></template></el-table-column><el-table-column prop="taxCategory" label="税收分类简称" align="center" min-width="180"><template slot-scope="scope"><el-inputplaceholder="请输入税收分类简称"v-model="scope.row.taxCategory"clearable></el-input></template></el-table-column><el-table-column prop="taxRate" label="税率" align="center" min-width="180"><template slot-scope="scope"><el-inputplaceholder="请输入税率"v-model="scope.row.taxRate"clearable></el-input></template></el-table-column><el-table-column prop="dateRange" label="适用时间" align="center" min-width="280"><template slot-scope="scope"><el-date-pickerv-model="scope.row.dateRange"type="daterange"range-separator="至"value-format="yyyy-MM-dd"start-placeholder="开始日期"end-placeholder="结束日期"></el-date-picker></template></el-table-column><el-table-column label="操作" align="center" width="80" :render-header="renderHeader"><template slot-scope="scope"><i@click.prevent="deleteRow(scope.$index, scope.row)"class="el-icon-delete"></i></template></el-table-column></el-table></el-form><div slot="footer"><el-button size="medium" @click="closeDialog">取消</el-button><el-button size="medium" type="primary" ref="saveButton" @click="saveData('formRef')">保存</el-button></div></el-dialog>
</template><script>
export default {data() {return {dialogVisible: false,tableData: [{invoiceTypeCode: ['1'],taxCategory: '',taxRate: '',dateRange: []}],typeList: [{ invoiceTypeCode: '1', invoiceTypeName: '增值税专用发票' },{ invoiceTypeCode: '2', invoiceTypeName: '增值税普通发票' }]};},methods: {resetForm(formName) {this.$refs[formName].resetFields();},beforeClose(done) {this.resetForm('formRef');done();},deleteRow(index, row) {this.tableData.splice(index, 1);},closeDialog() {this.dialogVisible = false;this.resetForm('formRef');},saveData(formName) {this.$refs[formName].validate(valid => {if (valid) {console.log(this.tableData);this.closeDialog();}});},addNewRule() {this.tableData.push({invoiceTypeCode: [],taxCategory: '',taxRate: '',dateRange: [],isDisabled: false});},renderHeader(h, { column }) {return h('div',[h('span', column.label),h('i', {class: 'el-icon-circle-plus',style: 'color: #409eff; font-size: 24px; cursor: pointer;',on: {click: this.addNewRule}})]);}}
};
</script><style scoped>
.custom-dialog .el-dialog__body {padding: 20px;
}.custom-table {margin-bottom: 20px;
}.custom-table td, .custom-table .cell {padding: 0px;
}.custom-table .el-input__inner {border-radius: 0;
}.custom-table .el-icon-delete {cursor: pointer;
}.custom-dialog .el-dialog__header {background: rgb(2, 65, 114);color: #fff;.el-dialog__title,.el-icon {color: #fff;}
}
</style>

这篇关于如何在 Vue 中创建一个带有表格和表单的弹窗的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1118600

相关文章

java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)

《java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)》:本文主要介绍java中pdf模版填充表单踩坑的相关资料,OpenPDF、iText、PDFBox是三... 目录准备Pdf模版方法1:itextpdf7填充表单(1)加入依赖(2)代码(3)遇到的问题方法2:pd

游戏闪退弹窗提示找不到storm.dll文件怎么办? Stormdll文件损坏修复技巧

《游戏闪退弹窗提示找不到storm.dll文件怎么办?Stormdll文件损坏修复技巧》DLL文件丢失或损坏会导致软件无法正常运行,例如我们在电脑上运行软件或游戏时会得到以下提示:storm.dll... 很多玩家在打开游戏时,突然弹出“找不到storm.dll文件”的提示框,随后游戏直接闪退,这通常是由于

从入门到精通详解LangChain加载HTML内容的全攻略

《从入门到精通详解LangChain加载HTML内容的全攻略》这篇文章主要为大家详细介绍了如何用LangChain优雅地处理HTML内容,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录引言:当大语言模型遇见html一、HTML加载器为什么需要专门的HTML加载器核心加载器对比表二

IntelliJ IDEA2025创建SpringBoot项目的实现步骤

《IntelliJIDEA2025创建SpringBoot项目的实现步骤》本文主要介绍了IntelliJIDEA2025创建SpringBoot项目的实现步骤,文中通过示例代码介绍的非常详细,对大家... 目录一、创建 Spring Boot 项目1. 新建项目2. 基础配置3. 选择依赖4. 生成项目5.

Linux线程之线程的创建、属性、回收、退出、取消方式

《Linux线程之线程的创建、属性、回收、退出、取消方式》文章总结了线程管理核心知识:线程号唯一、创建方式、属性设置(如分离状态与栈大小)、回收机制(join/detach)、退出方法(返回/pthr... 目录1. 线程号2. 线程的创建3. 线程属性4. 线程的回收5. 线程的退出6. 线程的取消7.

创建Java keystore文件的完整指南及详细步骤

《创建Javakeystore文件的完整指南及详细步骤》本文详解Java中keystore的创建与配置,涵盖私钥管理、自签名与CA证书生成、SSL/TLS应用,强调安全存储及验证机制,确保通信加密和... 目录1. 秘密键(私钥)的理解与管理私钥的定义与重要性私钥的管理策略私钥的生成与存储2. 证书的创建与

python如何创建等差数列

《python如何创建等差数列》:本文主要介绍python如何创建等差数列的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python创建等差数列例题运行代码回车输出结果总结python创建等差数列import numpy as np x=int(in

前端如何通过nginx访问本地端口

《前端如何通过nginx访问本地端口》:本文主要介绍前端如何通过nginx访问本地端口的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、nginx安装1、下载(1)下载地址(2)系统选择(3)版本选择2、安装部署(1)解压(2)配置文件修改(3)启动(4)

怎么用idea创建一个SpringBoot项目

《怎么用idea创建一个SpringBoot项目》本文介绍了在IDEA中创建SpringBoot项目的步骤,包括环境准备(JDK1.8+、Maven3.2.5+)、使用SpringInitializr... 目录如何在idea中创建一个SpringBoot项目环境准备1.1打开IDEA,点击New新建一个项

如何使用Maven创建web目录结构

《如何使用Maven创建web目录结构》:本文主要介绍如何使用Maven创建web目录结构的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录创建web工程第一步第二步第三步第四步第五步第六步第七步总结创建web工程第一步js通过Maven骨架创pytho