如何在 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中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2

React实现原生APP切换效果

《React实现原生APP切换效果》最近需要使用Hybrid的方式开发一个APP,交互和原生APP相似并且需要IM通信,本文给大家介绍了使用React实现原生APP切换效果,文中通过代码示例讲解的非常... 目录背景需求概览技术栈实现步骤根据 react-router-dom 文档配置好路由添加过渡动画使用

手把手教你idea中创建一个javaweb(webapp)项目详细图文教程

《手把手教你idea中创建一个javaweb(webapp)项目详细图文教程》:本文主要介绍如何使用IntelliJIDEA创建一个Maven项目,并配置Tomcat服务器进行运行,过程包括创建... 1.启动idea2.创建项目模板点击项目-新建项目-选择maven,显示如下页面输入项目名称,选择

Ubuntu 24.04 LTS怎么关闭 Ubuntu Pro 更新提示弹窗?

《Ubuntu24.04LTS怎么关闭UbuntuPro更新提示弹窗?》Ubuntu每次开机都会弹窗提示安全更新,设置里最多只能取消自动下载,自动更新,但无法做到直接让自动更新的弹窗不出现,... 如果你正在使用 Ubuntu 24.04 LTS,可能会注意到——在使用「软件更新器」或运行 APT 命令时,

使用Vue.js报错:ReferenceError: “Vue is not defined“ 的原因与解决方案

《使用Vue.js报错:ReferenceError:“Vueisnotdefined“的原因与解决方案》在前端开发中,ReferenceError:Vueisnotdefined是一个常见... 目录一、错误描述二、错误成因分析三、解决方案1. 检查 vue.js 的引入方式2. 验证 npm 安装3.

vue如何监听对象或者数组某个属性的变化详解

《vue如何监听对象或者数组某个属性的变化详解》这篇文章主要给大家介绍了关于vue如何监听对象或者数组某个属性的变化,在Vue.js中可以通过watch监听属性变化并动态修改其他属性的值,watch通... 目录前言用watch监听深度监听使用计算属性watch和计算属性的区别在vue 3中使用watchE

python解析HTML并提取span标签中的文本

《python解析HTML并提取span标签中的文本》在网页开发和数据抓取过程中,我们经常需要从HTML页面中提取信息,尤其是span元素中的文本,span标签是一个行内元素,通常用于包装一小段文本或... 目录一、安装相关依赖二、html 页面结构三、使用 BeautifulSoup javascript

Vue3 的 shallowRef 和 shallowReactive:优化性能

大家对 Vue3 的 ref 和 reactive 都很熟悉,那么对 shallowRef 和 shallowReactive 是否了解呢? 在编程和数据结构中,“shallow”(浅层)通常指对数据结构的最外层进行操作,而不递归地处理其内部或嵌套的数据。这种处理方式关注的是数据结构的第一层属性或元素,而忽略更深层次的嵌套内容。 1. 浅层与深层的对比 1.1 浅层(Shallow) 定义

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

【 html+css 绚丽Loading 】000046 三才归元阵

前言:哈喽,大家好,今天给大家分享html+css 绚丽Loading!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕 目录 📚一、效果📚二、信息💡1.简介:💡2.外观描述:💡3.使用方式:💡4.战斗方式:💡5.提升:💡6.传说: 📚三、源代码,上代码,可以直接复制使用🎥效果🗂️目录✍️