如何在 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将各种数据写入Excel表格的操作示例

《使用Java将各种数据写入Excel表格的操作示例》在数据处理与管理领域,Excel凭借其强大的功能和广泛的应用,成为了数据存储与展示的重要工具,在Java开发过程中,常常需要将不同类型的数据,本文... 目录前言安装免费Java库1. 写入文本、或数值到 Excel单元格2. 写入数组到 Excel表格

python处理带有时区的日期和时间数据

《python处理带有时区的日期和时间数据》这篇文章主要为大家详细介绍了如何在Python中使用pytz库处理时区信息,包括获取当前UTC时间,转换为特定时区等,有需要的小伙伴可以参考一下... 目录时区基本信息python datetime使用timezonepandas处理时区数据知识延展时区基本信息

使用Python和Pyecharts创建交互式地图

《使用Python和Pyecharts创建交互式地图》在数据可视化领域,创建交互式地图是一种强大的方式,可以使受众能够以引人入胜且信息丰富的方式探索地理数据,下面我们看看如何使用Python和Pyec... 目录简介Pyecharts 简介创建上海地图代码说明运行结果总结简介在数据可视化领域,创建交互式地

python获取网页表格的多种方法汇总

《python获取网页表格的多种方法汇总》我们在网页上看到很多的表格,如果要获取里面的数据或者转化成其他格式,就需要将表格获取下来并进行整理,在Python中,获取网页表格的方法有多种,下面就跟随小编... 目录1. 使用Pandas的read_html2. 使用BeautifulSoup和pandas3.

HTML5中的Microdata与历史记录管理详解

《HTML5中的Microdata与历史记录管理详解》Microdata作为HTML5新增的一个特性,它允许开发者在HTML文档中添加更多的语义信息,以便于搜索引擎和浏览器更好地理解页面内容,本文将探... 目录html5中的Mijscrodata与历史记录管理背景简介html5中的Microdata使用M

html5的响应式布局的方法示例详解

《html5的响应式布局的方法示例详解》:本文主要介绍了HTML5中使用媒体查询和Flexbox进行响应式布局的方法,简要介绍了CSSGrid布局的基础知识和如何实现自动换行的网格布局,详细内容请阅读本文,希望能对你有所帮助... 一 使用媒体查询响应式布局        使用的参数@media这是常用的

HTML5表格语法格式详解

《HTML5表格语法格式详解》在HTML语法中,表格主要通过table、tr和td3个标签构成,本文通过实例代码讲解HTML5表格语法格式,感兴趣的朋友一起看看吧... 目录一、表格1.表格语法格式2.表格属性 3.例子二、不规则表格1.跨行2.跨列3.例子一、表格在html语法中,表格主要通过< tab

C#实现将Excel表格转换为图片(JPG/ PNG)

《C#实现将Excel表格转换为图片(JPG/PNG)》Excel表格可能会因为不同设备或字体缺失等问题,导致格式错乱或数据显示异常,转换为图片后,能确保数据的排版等保持一致,下面我们看看如何使用C... 目录通过C# 转换Excel工作表到图片通过C# 转换指定单元格区域到图片知识扩展C# 将 Excel

Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案

《Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案》:本文主要介绍Vue3组件中getCurrentInstance()获取App实例,但是返回nu... 目录vue3组件中getCurrentInstajavascriptnce()获取App实例,但是返回n

JS+HTML实现在线图片水印添加工具

《JS+HTML实现在线图片水印添加工具》在社交媒体和内容创作日益频繁的今天,如何保护原创内容、展示品牌身份成了一个不得不面对的问题,本文将实现一个完全基于HTML+CSS构建的现代化图片水印在线工具... 目录概述功能亮点使用方法技术解析延伸思考运行效果项目源码下载总结概述在社交媒体和内容创作日益频繁的