Demo:基于elementplus的弹窗嵌套表单进行二次封装

基于elementplus的弹窗嵌套表单进行二次封装

所见即所得:简单封装方便工作
在这里插入图片描述
在这里插入图片描述

ProForm.vue代码:

<!--* @Author: 忆往昔* @LastEditTime: 2024-01-6 14:36:00* @email: 15871856064@163.com
-->
<template><div class="penk-form-container"><el-dialogv-model="visible1":fullscreen="props.fullscreen":draggable="props.draggable":title="props.title":width="props.width || '50%'"><el-formref="ruleFormRef"label-width="120px"size="large":model="form":rules="props.formConfig.rules"><template v-for="item in props.formConfig.formItemConfig" :key="item.prop"><el-form-item:label="item.label + ':'":style="{ display: item.hidden == true ? 'none' : '' }":prop="item.prop"><!-- 输入框 --><el-inputv-if="item.type == 'input'"v-model="form[item.prop]":placeholder="item.placeholder || ''":clearable="item.clearable":disabled="item.disabled":type="item.inputType":row="item.row":style="{ width: item.width + 'px' }"/><!-- 下拉框 --><el-selectv-else-if="item.type == 'select'"v-model="form[item.prop]":placeholder="item.placeholder":clearable="item.clearable":disabled="item.disabled":style="{ width: item.width + 'px' }"><el-optionv-for="option in item.data":key="option.value":label="option.label":value="option.value":disabled="option.disabled"/></el-select><!-- 多选框 --><el-checkbox-groupv-else-if="item.type == 'checkbox'"v-model="form[item.prop]":placeholder="item.placeholder":clearable="item.clearable":disabled="item.disabled":style="{ width: item.width + 'px' }"><el-checkboxv-for="option in item.data":key="option.value":label="option.value":disabled="option.disabled">{{ option.label }}</el-checkbox></el-checkbox-group><!-- 单选框 --><el-radio-groupv-else-if="item.type == 'radio'"v-model="form[item.prop]":placeholder="item.placeholder":clearable="item.clearable":disabled="item.disabled":style="{ width: item.width + 'px' }"><el-radio:label="option.value"size="large"v-for="option in item.data":key="option.label">{{ option.label }}</el-radio></el-radio-group></el-form-item></template></el-form><template #footer><span class="dialog-footer"><el-button @click="visible1 = false">取消</el-button><el-button type="primary" @click="confirm(ruleFormRef)"> 确定 </el-button></span></template></el-dialog></div>
</template><script setup>
import { ref, reactive, watch, defineEmits, onMounted } from 'vue'
import { ElMessage } from 'element-plus'let form = reactive({})
const visible1 = ref(true)
const ruleFormRef = ref()const props = defineProps({formData: {type: Object,default: () => {}},formConfig: {type: Object,default: () => {}},visible: {type: Boolean,default: false},width: {type: String,default: '520px'},title: {type: String,default: '新增'},fullscreen: {type: Boolean,default: false},draggable: {type: Boolean,default: false},'append-to-body': {type: Boolean,default: false},'close-on-click-modal': {type: Boolean,default: false}
})// 生成事件对象,数组中就是对象名
const emit = defineEmits(['update:visible', 'confirm'])// 监听父组件的visible,用来简介控制el-dialog的弹框开关,一般是用于开
watch(() => props.visible,(n, o) => {visible1.value = n}
)
// 监听el-dialog显示状态,再通过@update:visible 通知父组件,一般是用于关
watch(visible1, (n, o) => {emit('update:visible', n)
})// 每次触发,就证明父组件点了修改或者添加的按钮,传递了一个新的formData
// 需要重新给form 赋值,并且,对该表单项进行重置
watch(() => props.formData,(n, o) => {resetForm(ruleFormRef.value)form = reactive(n)}
)// 确定按钮触发
const confirm = async (formEl) => {if (!formEl) returnawait formEl.validate((valid, fields) => {if (valid) {emit('confirm', form)} else {console.log('error submit!', fields)ElMessage({showClose: true,message: '请完善表单信息!',type: 'error'})}})
}// 重置表单
const resetForm = (formEl) => {if (!formEl) returnformEl.resetFields()
}onMounted(() => {console.log(props.formConfig);// 初始化 配置弹框是否可显示visible1.value = props.visible// 初始化 配置formDataprops.formConfig.formItemConfig.map((item) => {form[item.prop] = ''})
})
</script><style lang="scss" scoped>
.penk-form-container {.el-table-border {border: 1px #eee solid;}:deep(.el-dialog__body) {border-top: 1px solid #eee;}
}
</style>
组件使用示例:
<template><MyTable:tableData="tableData":columns="columns":total="total":currentPage="listQuery.pageNo":pageSize="listQuery.pageSize"@changeTableData="changeTableData"><!-- <template #check="{ slotProps }"><el-tag class="ml-2" :type="slotProps.check ? 'success' : 'danger'">{{ checkFilter(slotProps.check) }}</el-tag></template> --><template #operator="{ slotProps }"><el-button type="primary" @click="setData('edit', slotProps)">编辑</el-button><el-button type="primary" @click="handleAddItem">新增</el-button><el-button type="primary" @click="handleEditItem(slotProps)">修改</el-button><el-button type="danger" @click="handleDel(slotProps)">删除</el-button></template></MyTable><!-- 表单弹框 --><ProForm:title="title":formConfig="formConfig":formData="formData"v-model:visible="visible"append-to-body@confirm="saveItem"/>
</template><script setup>
import { ref, onMounted } from 'vue'
import MyTable from '@/components/MyTable/MyTable.vue'
import ProForm from '@/components/ProForm/ProForm.vue'let listQuery = ref({pageNo: 1,pageSize: 10
})
const tableData = ref([{ number: '001', numberplate: '京A12345', date: '2022-01-01', check: '正常', operator: '编辑' },{ number: '002', numberplate: '京B67890', date: '2022-02-01', check: '正常', operator: '编辑' },{ number: '003', numberplate: '京C24680', date: '2022-03-01', check: '故障', operator: '编辑' },{ number: '004', numberplate: '京D13579', date: '2022-04-01', check: '正常', operator: '编辑' },{ number: '005', numberplate: '京E97531', date: '2022-05-01', check: '正常', operator: '编辑' }
])
let total = ref(0)/*** prop:数据项列名* label:列名展示名* fixed:固定列 true/right/left* width:列宽* show-overflow-tooltip* type:对应列的类型 selection / index / expand* sortable:true/false* selectable:Function* formatter:格式化内容 function(row, column, cellValue, index)**/
let columns = ref([{ prop: 'number', label: '车牌自编号' },{ prop: 'numberplate', label: '车牌号' },{ prop: 'date', label: '出厂日期' },{ prop: 'check', label: '车辆状态' },{ prop: 'operator', label: '操作', fixed: 'right' }
])onMounted(() => {})const changeTableData = (pageNum, pageSize) => {listQuery.value.pageNo = pageNumlistQuery.value.pageSize = pageSizegetCarList()
}const visible = ref(false) // 控制弹窗开关
const title = ref('') // 弹窗标题
const formData = ref({}) // 表单数据// 表单配置项
const formConfig = {formItemConfig: [{label: '类型名',prop: 'typeName',type: 'input'},{label: '父级类型名',prop: 'parentId',type: 'select',data: []}],rules: {typeName: [{required: true,message: '请输入类型名',trigger: 'blur'}]}
}// 添加数据按钮
const handleAddItem = () => {visible.value = truetitle.value = '新增'formData.value = {}
}// 修改数据按钮
const handleEditItem = (row) => {visible.value = truetitle.value = '修改'formData.value = row
}// 表单提交
const saveItem = (form) => {console.log('提交', form)
}
</script>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/326908.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习(四) -- 模型评估(3)

系列文章目录 机器学习&#xff08;一&#xff09; -- 概述 机器学习&#xff08;二&#xff09; -- 数据预处理&#xff08;1-3&#xff09; 机器学习&#xff08;三&#xff09; -- 特征工程&#xff08;1-2&#xff09; 机器学习&#xff08;四&#xff09; -- 模型评估…

【LMM 011】MiniGPT-5:通过 Generative Vokens 进行交错视觉语言生成的多模态大模型

论文标题&#xff1a;MiniGPT-5: Interleaved Vision-and-Language Generation via Generative Vokens 论文作者&#xff1a;Kaizhi Zheng* , Xuehai He* , Xin Eric Wang 作者单位&#xff1a;University of California, Santa Cruz 论文原文&#xff1a;https://arxiv.org/ab…

优化|流形优化系列(一)

简介 流形优化是非线性优化的一个分支&#xff0c;它主要关注在特定的几何结构下进行优化。在流形优化中&#xff0c;优化问题通常是在黎曼流形上进行的&#xff0c;而非欧几里得空间。黎曼流形是带有黎曼度量的流形&#xff0c;该度量为流形上的每个点都定义了一个内积。这种…

ThreadLocal线程重用导致用户信息错乱的 Bug

在生产上遇到一个诡异的问题&#xff0c;有时获取到的用户信息是别人的。查看代码后&#xff0c;我发现他使用了 ThreadLocal 来缓存获取到的用户信息。 我们知道&#xff0c;ThreadLocal 适用于变量在线程间隔离&#xff0c;而在方法或类间共享的场景。如果用户信息的获取比较…

Diffusion扩散模型学习2:DDPM前向加噪过程torch实现

参考: https://arxiv.org/pdf/2006.11239.pdf ##论文 https://github.com/dtransposed/code_videos/blob/main/01_Diffusion_Models_Tutorial/Diffusion%20Model.ipynb ##code https://spaces.ac.cn/archives/9119 1、红色框: 前向过程论文公式推出可以从x0原图一步到最终噪声…

软测思考题:自动化测试重运行是好是坏?

测试失败时会发生什么&#xff1f; 如果有人手动运行测试&#xff0c;那么他们会暂停并了解更多信息。但是&#xff0c;当自动测试失败时&#xff0c;其余部分可能会继续运行。在套件完成之前&#xff0c;你是没有办法看到测试报告的&#xff0c;并且自动化程序不会在故障时执…

算法训练第六十天|84.柱状图中最大的矩形

84.柱状图中最大的矩形&#xff1a; 题目链接 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 示例 : 输入&#xff1a;heights [2,1,5,6,2,3] 输出…

Pytest的测试报告——Allure

一、html-report测试报告 html-report测试报告。是pytest下基本的测试报告。要使用pytest-html测试报告&#xff0c;就要确保python版本在3.6及以上即可。本身pytest所提供的测试结果汇总&#xff0c;是基于控制台的文本输出形式。 pytest-html是基于HTML格式实现的测试报告的…

期货日数据维护与使用_日数据维护_合约更新

目录 写在前面 下载最新合约列表 “选择合约所在目录”按钮点击 “执行”按钮点击 sqlite3代码 按钮点击后执行的代码 子线程代码 “新增合约json下载”按钮点击 “追加合约json下载”按钮点击 写在前面 本文默认已经创建了项目&#xff0c;如果不知道如何创建一个…

C++: 求1+2+3+...+n

int i 1; int sum 0; class Sum { public:Sum(){sum i;i;} };class Solution { public:int Sum_Solution(int n) {Sum a[n]; //调用n次sum的构造函数return sum;} };

imazing破解版百度云2.17.3(附激活许可证下载)

iMazing是一款强大的 iOS 设备管理软件&#xff0c;不管是 iPhone、iPad 或 iPod Touch 设备&#xff0c;只要将 iOS 设备连接到计算机&#xff0c;就可以处理不同类型的数据。 iPhone 和 iPad 备份 借助 iMazing 的独有 iOS 备份技术&#xff08;无线、隐私和自动&#xff09…

HTML5大作业-精致版个人博客空间模板源码

文章目录 1.设计来源1.1 博客主页界面1.2 博主信息界面1.3 我的文章界面1.4 我的相册界面1.5 我的工具界面1.6 我的源码界面1.7 我的日记界面1.8 我的留言板界面1.9 联系博主界面 2.演示效果和结构及源码2.1 效果演示2.2 目录结构2.3 源代码 源码下载 作者&#xff1a;xcLeigh …