如何在 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 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

k8s按需创建PV和使用PVC详解

《k8s按需创建PV和使用PVC详解》Kubernetes中,PV和PVC用于管理持久存储,StorageClass实现动态PV分配,PVC声明存储需求并绑定PV,通过kubectl验证状态,注意回收... 目录1.按需创建 PV(使用 StorageClass)创建 StorageClass2.创建 PV

vite搭建vue3项目的搭建步骤

《vite搭建vue3项目的搭建步骤》本文主要介绍了vite搭建vue3项目的搭建步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1.确保Nodejs环境2.使用vite-cli工具3.进入项目安装依赖1.确保Nodejs环境

Nginx搭建前端本地预览环境的完整步骤教学

《Nginx搭建前端本地预览环境的完整步骤教学》这篇文章主要为大家详细介绍了Nginx搭建前端本地预览环境的完整步骤教学,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录项目目录结构核心配置文件:nginx.conf脚本化操作:nginx.shnpm 脚本集成总结:对前端的意义很多

Linux创建服务使用systemctl管理详解

《Linux创建服务使用systemctl管理详解》文章指导在Linux中创建systemd服务,设置文件权限为所有者读写、其他只读,重新加载配置,启动服务并检查状态,确保服务正常运行,关键步骤包括权... 目录创建服务 /usr/lib/systemd/system/设置服务文件权限:所有者读写js,其他

前端缓存策略的自解方案全解析

《前端缓存策略的自解方案全解析》缓存从来都是前端的一个痛点,很多前端搞不清楚缓存到底是何物,:本文主要介绍前端缓存的自解方案,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、为什么“清缓存”成了技术圈的梗二、先给缓存“把个脉”:浏览器到底缓存了谁?三、设计思路:把“发版”做成“自愈”四、代码

通过React实现页面的无限滚动效果

《通过React实现页面的无限滚动效果》今天我们来聊聊无限滚动这个现代Web开发中不可或缺的技术,无论你是刷微博、逛知乎还是看脚本,无限滚动都已经渗透到我们日常的浏览体验中,那么,如何优雅地实现它呢?... 目录1. 早期的解决方案2. 交叉观察者:IntersectionObserver2.1 Inter

Vue3视频播放组件 vue3-video-play使用方式

《Vue3视频播放组件vue3-video-play使用方式》vue3-video-play是Vue3的视频播放组件,基于原生video标签开发,支持MP4和HLS流,提供全局/局部引入方式,可监听... 目录一、安装二、全局引入三、局部引入四、基本使用五、事件监听六、播放 HLS 流七、更多功能总结在 v

idea+spring boot创建项目的搭建全过程

《idea+springboot创建项目的搭建全过程》SpringBoot是Spring社区发布的一个开源项目,旨在帮助开发者快速并且更简单的构建项目,:本文主要介绍idea+springb... 目录一.idea四种搭建方式1.Javaidea命名规范2JavaWebTomcat的安装一.明确tomcat

JS纯前端实现浏览器语音播报、朗读功能的完整代码

《JS纯前端实现浏览器语音播报、朗读功能的完整代码》在现代互联网的发展中,语音技术正逐渐成为改变用户体验的重要一环,下面:本文主要介绍JS纯前端实现浏览器语音播报、朗读功能的相关资料,文中通过代码... 目录一、朗读单条文本:① 语音自选参数,按钮控制语音:② 效果图:二、朗读多条文本:① 语音有默认值:②