element plus el-form双列布局及拓展任意布局

1 场景

一般表单我们直接默认布局,也就是单列布局,突然有个人员信息表单,需要双列布局的需求,简单实现并拓展下

2 思路

直接无脑div+flex布局实现

3 代码

<template><el-form ref="formRef" :model="formData" label-width="80px"><div class="form-top"><div class="form-top--left"><el-form-item label="姓名" prop="name"><el-input v-model="formData.name" placeholder="请输入姓名" /></el-form-item><el-form-item label="年龄" prop="age"><el-input v-model="formData.age" placeholder="请输入年龄" /></el-form-item><el-form-item label="性别" prop="sex"><el-radio-group v-model="formData.sex"><el-radio :label="1"></el-radio><el-radio :label="2"></el-radio></el-radio-group></el-form-item><el-form-item label="邮箱" prop="email"><el-input v-model="formData.email" placeholder="请输入邮箱" /></el-form-item><el-form-item label="排序" prop="sort" placeholder="请输入排序号"><el-input-number v-model="formData.sort" :min="1" /></el-form-item></div><div class="form-top--right"><el-form-item label="备注" prop="remark"><el-inputv-model="formData.remark"type="textarea"placeholder="请输入备注"maxlength="100"show-word-limitresize="none"/></el-form-item><el-form-item label="说明" prop="config"><el-inputv-model="formData.config"placeholder="请输入说明"type="textarea"show-word-limitmaxlength="200":autosize="{ minRows: 6, maxRows: 6 }"/></el-form-item></div></div><div class="form-bottom"><el-form-item><el-button type="primary" @click="handleSubmit">确 定</el-button><el-button type="warning" @click="handleClose">取 消</el-button></el-form-item></div></el-form>
</template><script setup lang="ts">
const formRef = ref();const formData = reactive({remark: "",age: 10,config: "",email: "",sex: "",id: null,name: "",sort: 0,
});const handleClose = () => {};
const handleSubmit = () => {};
</script>
<style lang="scss" scoped>
.container {width: 600px;margin-top: 100px;.form-top {display: flex;justify-content: space-between;.form-top--right {flex: 1;}}.form-bottom {display: flex;justify-content: flex-end;}
}
</style>

在这里插入图片描述

这样的无脑实现实在是对不起付出的时间,不嫩复用是最大问题

4 拓展

封装el-form,增加slot

// Form.vue

<template><el-form><slot></slot><div class="form-top" v-if="!slot.default"><div class="form-top--left" v-if="slot.left"><slot name="left"></slot></div><div class="form-top--right" v-if="slot.right"><slot name="right"></slot></div></div><div class="form-bottom" v-if="slot.bottom"><slot name="bottom"></slot></div></el-form>
</template><script setup lang="ts">
const slot = useSlots();
</script>
<style lang="scss" scoped>
.form-top {display: flex;justify-content: space-between;.form-top--left {flex: 1;}.form-top--right {flex: 1;}
}
.form-bottom {display: flex;justify-content: flex-end;
}
</style>

// index.vue

<template><Form ref="formRef" :model="formData" label-width="80px"><template #left><el-form-item label="姓名" prop="name"><el-input v-model="formData.name" placeholder="请输入姓名" /></el-form-item><el-form-item label="年龄" prop="age"><el-input v-model="formData.age" placeholder="请输入年龄" /></el-form-item><el-form-item label="性别" prop="sex"><el-radio-group v-model="formData.sex"><el-radio :label="1"></el-radio><el-radio :label="2"></el-radio></el-radio-group></el-form-item><el-form-item label="邮箱" prop="email"><el-input v-model="formData.email" placeholder="请输入邮箱" /></el-form-item><el-form-item label="排序" prop="sort" placeholder="请输入排序号"><el-input-number v-model="formData.sort" :min="1" /></el-form-item></template><template #right><el-form-item label="备注" prop="remark"><el-inputv-model="formData.remark"type="textarea"placeholder="请输入备注"maxlength="100"show-word-limitresize="none"/></el-form-item><el-form-item label="说明" prop="config"><el-inputv-model="formData.config"placeholder="请输入说明"type="textarea"show-word-limitmaxlength="200":autosize="{ minRows: 6, maxRows: 6 }"/></el-form-item></template><template #bottom><el-form-item><el-button type="primary" @click="handleSubmit">确 定</el-button><el-button type="warning" @click="handleClose">取 消</el-button></el-form-item></template></Form>
</template><script setup lang="ts">
import Form from "./Form.vue";
const formRef = ref();//添加人员表单
const formData = reactive({remark: "",age: 10,config: "",email: "",sex: "",id: null,name: "",sort: 0,
});const handleClose = () => {};
const handleSubmit = () => {};
</script>
<style lang="scss" scoped>
.form-top {display: flex;justify-content: space-between;.form-top--right {flex: 1;}
}
.form-bottom {display: flex;justify-content: flex-end;
}
</style>

依然不够通用,因为布局是固定的,如果想要其他布局,要么修改Form.vue,要么重新封装

5 继续拓展

抽出layout,形成Layout.vue组件,拿出祖传技艺slot传递
// Layout.vue

<template><div><slot></slot><div class="form-top" v-if="!slot.default"><div class="form-top--left" v-if="slot.left"><slot name="left"></slot></div><div class="form-top--right" v-if="slot.right"><slot name="right"></slot></div></div><div class="form-bottom" v-if="slot.bottom"><slot name="bottom"></slot></div></div>
</template><script setup lang="ts">
const slot = useSlots();
</script>
<style lang="scss" scoped>
.form-top {display: flex;justify-content: space-between;.form-top--left {flex: 1;}.form-top--right {flex: 1;}
}
.form-bottom {display: flex;justify-content: flex-end;
}
</style>

// Form.vue

<template><el-form><Layout><template v-for="item in Object.keys(slot)" :key="item" #[item]><slot :name="item"></slot></template></Layout></el-form>
</template><script setup lang="ts">
import Layout from "./Layout.vue";
const slot = useSlots();
</script>
<style lang="scss" scoped></style>

// index.vue

<template><Form ref="formRef" :model="formData" label-width="80px"><template #left><el-form-item label="姓名" prop="name"><el-input v-model="formData.name" placeholder="请输入姓名" /></el-form-item><el-form-item label="年龄" prop="age"><el-input v-model="formData.age" placeholder="请输入年龄" /></el-form-item><el-form-item label="性别" prop="sex"><el-radio-group v-model="formData.sex"><el-radio :label="1"></el-radio><el-radio :label="2"></el-radio></el-radio-group></el-form-item><el-form-item label="邮箱" prop="email"><el-input v-model="formData.email" placeholder="请输入邮箱" /></el-form-item><el-form-item label="排序" prop="sort" placeholder="请输入排序号"><el-input-number v-model="formData.sort" :min="1" /></el-form-item></template><template #right><el-form-item label="备注" prop="remark"><el-inputv-model="formData.remark"type="textarea"placeholder="请输入备注"maxlength="100"show-word-limitresize="none"/></el-form-item><el-form-item label="说明" prop="config"><el-inputv-model="formData.config"placeholder="请输入说明"type="textarea"show-word-limitmaxlength="200":autosize="{ minRows: 6, maxRows: 6 }"/></el-form-item></template><template #bottom><el-form-item><el-button type="primary" @click="handleSubmit">确 定</el-button><el-button type="warning" @click="handleClose">取 消</el-button></el-form-item></template></Form>
</template><script setup lang="ts">
import Form from "./Form.vue";
const formRef = ref();//添加人员表单
const formData = reactive({remark: "",age: 10,config: "",email: "",sex: "",id: null,name: "",sort: 0,
});const handleClose = () => {};
const handleSubmit = () => {};
</script>
<style lang="scss" scoped>
.form-top {display: flex;justify-content: space-between;.form-top--right {flex: 1;}
}
.form-bottom {display: flex;justify-content: flex-end;
}
</style>

6 总结

  1. 布局和数据分离

  2. 灵活扩展layout

    2.1 可以建立多个layout文件,批量引入(或动态引入)Form.vue中 ,Form.vue中利用动态组件component加载各个layout文件

    2.2 可以建立多个layout文件,批量引入(或动态引入)LayoutIndex.vue文件中,LayoutIndex.vue文件利用动态组件component加载各个layout文件,然后Form.vue中只渲染LayoutIndex,同时通过传参决定渲染那个layout

  3. 新增layout时,只需要新增文件(所有layout文件已经被批量引入<或动态引入>),符合“开闭”原则

tip:

批量引入(vite):import.meta.glob(‘./layout/**/*.vue’);

动态引入:defineAsyncComponent(() => import(./components/${layoutName}.vue));

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

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

相关文章

【DNS】

服务程序 1.如果有默认配置&#xff0c;请先备份在进行修改 2.修改完配置文件&#xff0c;请重启服务或重新加载配置文件&#xff0c;否则不生效 dhcp 动态主机配置协议&#xff08;自动分配ip地址&#xff09; 只要插上网线就可以获得ip地址 dhcp的分配方式&#xff1a;1…

概述:利用大模型 (LLMs) 解决信息抽取任务

论文标题&#xff1a;Large Language Models for Generative Information Extraction: A Survey 论文链接&#xff1a;https://arxiv.org/pdf/2312.17617.pdf 论文主要探讨了大型语言模型&#xff08;LLMs&#xff09;在生成式信息抽取&#xff08;IE&#xff09;任务中的应用…

PYTHON通过跳板机巡检CENTOS的简单实现

实现的细节和引用的文件和以前博客记录的基本一致 https://shaka.blog.csdn.net/article/details/106927633 差别在于,这次是通过跳板机登陆获取的主机信息,只记录差异的部份 1.需要在跳板机相应的路径放置PYTHON的脚本resc.py resc.py这个脚本中有引用的文件(pm.sh,diskpn…

东方通中间件使用IDEA进行远程打debug

修改startserver.sh JAVA_OPTS"${JAVA_OPTS} -Xdebug -Xrunjdwp:transportdt_socket,servery,suspendn,address5005"idea配置请参考我的其他篇博客&#xff08;idea 对远程服务器打debug&#xff09;

CSS3背景样式详解(图像大小,图像位置等)

背景样式 在CSS3中&#xff0c;新增了3个背景属性 属性说明background-size背景大小background-origin背景位置background-clip背景剪切 background-size属性 概念&#xff1a;在CSS3之前&#xff0c;我们是不能用CSS来控制背景图片大小的&#xff0c;背景图片的大小都是由…

1 快速前端开发

1 前端开发 目的&#xff1a;开发一个平台&#xff08;网站&#xff09;- 前端开发&#xff1a;HTML、CSS、JavaScript- Web框架&#xff1a;接收请求并处理- MySQL数据库&#xff1a;存储数据地方快速上手&#xff1a;基于Flask Web框架让你快速搭建一个网站出来。1.快速开发…

【python基础】一文搞懂:Python 中轻量型数据库 SQLite3 的用法

一文搞懂&#xff1a;Python 中轻量型数据库 SQLite3 的用法 文章目录 一文搞懂&#xff1a;Python 中轻量型数据库 SQLite3 的用法1 引言2 SQLite3 简介3 基本步骤4 示例代码4.1 连接数据库4.2 创建表4.3 插入数据4.4 查询数据4.5 更新/删除数据4.6 关闭数据库连接 5 实例演示…

虚拟机安装intel架构的银河麒麟V10(SP1)

一 背景 银河麒麟是国产操作系统之一&#xff0c;是基于Linux内核的桌面操作系统&#xff0c;有自己的应用中心&#xff0c;具有一定的生态系统。今从官网下载了V10&#xff08;SP1&#xff09;镜像文件&#xff0c;在Windowns的VMware虚拟机上安装试用。 官网&#xff1a;http…

web缓存之nginx缓存

一、nginx缓存知识 网络缓存位于客户端和 "源服务器 "之间&#xff0c;保存着所有可见内容的副本。当客户端请求缓存中存储的内容时&#xff0c;它可以直接从缓存中检索内容&#xff0c;而无需与服务器通信。这样&#xff0c;网络缓存就 "接近 "了客户端&a…

idea git回滚之前提交记录

提交代码时&#xff0c;如果不小心提交了不需要提交的内容&#xff0c;在本地仓库中&#xff0c;此时需要回滚版本&#xff0c;如何回滚 1.打开git控制台&#xff0c;左下角git,选择要处理的分支&#xff0c;选择刷新获取最新git提交记录 2&#xff09;选中自己commit需要回滚…

软件测试|详解 Pytest 参数化:简化测试用例的编写

简介 Pytest 是一个广泛使用的 Python 测试框架&#xff0c;它提供了丰富的功能来编写和执行测试用例。其中一个强大的特性是参数化&#xff0c;它允许我们通过一种简洁的方式运行多个输入参数的相似测试用例&#xff0c;从而减少冗余的代码。本文将详细介绍 Pytest 的参数化功…

臻牧签约实在RPA,数据流通效率飙升!

臻牧是一家集研发、生产、销售、服务于一体的综合型公司&#xff0c;十年行业领跑&#xff0c;由“国民好演员”海清担任品牌代言人。陕西自有13000平米省级示范乳品工厂&#xff0c;牵手西交大成立小分子羊奶粉研究中心&#xff0c;每年千万投入持续攻坚科研&#xff0c;全线支…