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.mzph.cn/news/611681.shtml

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

相关文章

Blazor 错误笔记

1. 运行时问题 Microsoft.NETCore.App.Runtime.Mono.browser-wasm Microsoft.NETCore.App.Runtime.Mono.browser-wasm 是一个 .NET Core 运行时的包&#xff0c;用于在浏览器中运行 .NET Core 应用程序。它是针对 WebAssembly 架构的 .NET Core 运行时&#xff0c;可以在浏览…

Java中CompletableFuture 异步编排的基本使用

一、前言 在复杂业务场景中&#xff0c;有些数据需要远程调用&#xff0c;导致查询时间缓慢&#xff0c;影响以下代码逻辑运行&#xff0c;并且这些浪费时间的逻辑与以后的请求并没有关系&#xff0c;这样会大大增加服务的时间。 假如商品详情页的每个查询&#xff0c;需要如下…

书生·浦语第三次作业

我最近在参加书生浦语大模型实战营&#xff0c;这是第三次作业打卡&#xff01; 如果你也想两周玩转大模型微调&#xff0c;部署与测评全链路。报名链接&#xff1a;invite 书生浦语大模型实战营报名 邀请码可以填026014 一、基础作业&#xff1a;复现课程知识库助手搭建过程…

WEB之HTML练习

第一题&#xff1a;用户注册界面 HTML代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><titl…

【Python】使用tkinter设计开发Windows桌面程序记事本(2)

上一篇&#xff1a;【Python】使用tkinter设计开发Windows桌面程序记事本&#xff08;1&#xff09;-CSDN博客 下一篇&#xff1a; 作者发炎 此代码模块是继承上一篇文章的代码模块的基础上开始设计开发的。 如果不知道怎么新建"记事本项目"文件夹&#xff0c;请参…

C++ 多态以及多态的原理

文章目录 多态的概念多态的构成条件虚函数的重写虚函数重写的两个例外 重载、重写(覆盖)、重定义(隐藏)对比C11 final 和 override关键字抽象类接口继承和普通继承多态的原理虚函数表多态的原理 单继承和多继承关系的虚函数表单继承中的虚函数表多继承中的虚函数表 多态的概念 …

Linux安装nginx并设置为开机自启动

1.更新gcc安装包 yum install -y gcc pcre-devel zlib-devel2.下载文件并解压 命令如下 wget https://nginx.org/download/nginx-1.18.0.tar.gz //解压nginx tar -zxvf nginx-1.18.0.tar.gz //进入后进行指定安装位置 ./configure --prefix/usr/local/nginx //安装 make &…

面试宝典之spring框架常见面试题

F1、类的反射机制有啥用&#xff1f; &#xff08;1&#xff09;增加程序的灵活性&#xff0c;可扩展性&#xff0c;动态创建对象。 &#xff08;2&#xff09;框架必备&#xff0c;任何框架的封装都要用反射。&#xff08;框架的灵魂&#xff09; F2、获取Class对象的三种方…

小程序分销商城,打造高效线上购物体验

小程序商城系统&#xff0c;为您带来前所未有的在线购物体验。它不仅提供线上商城购物、在线下单、支付及配送等功能&#xff0c;还凭借其便捷性成为众多商家的首选。 想象一下&#xff0c;商家可以展示琳琅满目的商品&#xff0c;包括图片、文字描述、价格及库存等详尽信息。而…

内网渗透实战攻略

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 &#x1f4ab;个人格言:"没有罗马,那就自己创造罗马~" 目录 介绍 什么是内网&#xff1f; 什么是内网渗透&#xff1f; 内网渗透的目的&#xff1a; 内网…

2024--Django平台开发-Django知识点(六)

day06 Django知识点 今日概要&#xff1a; Form和ModelForm组件【使用】【源码】缓存【使用】ORM【使用】其他&#xff1a;ContentTypes、Admin、权限、分页、信号等 1.Form和ModelForm组件 背景&#xff1a;某个公司后台管理项目。 垃圾 def register(request):"&quo…

k8s之pod基础

k8s之pod基础 pod&#xff1a; pod是k8s中最小的资源管理组件 pod也是最小化运行容器化的应用的资源管理对象 pod是一个抽象的概念&#xff0c;可以理解为一个或者多个容器化应用的集合 在一个pod当中运行一个容器是最常用的方式 在pod当中同时运行多个容器&#xff0c;…

Qt QRadioButton单选按钮控件

文章目录 1 属性和方法1.1 文本1.2 选中状态1.3 自动排他1.4 信号和槽 2 实例2.1 布局2.2 代码实现 Qt中的单选按钮类是QRadioButton它是一个可以切换选中&#xff08;checked&#xff09;或未选中&#xff08;unchecked&#xff09;状态的单选按钮单选按钮常用在“多选一”的场…

分布式全局id

分布式全局id snowflake 算法是 twitter 开源的分布式 id 生成算法&#xff0c;采用 Scala 语言实现&#xff0c;是把一个 64 位的 long 型的 id&#xff0c;1 个 bit 是不用的&#xff0c;用其中的 41 bits 作为毫秒数&#xff0c;用 10 bits 作为工作机器 id&#xff0c;12 …

基于sprinmgboot实习管理系统源码和论文

随着信息化时代的到来&#xff0c;管理系统都趋向于智能化、系统化&#xff0c;实习管理也不例外&#xff0c;但目前国内仍都使用人工管理&#xff0c;市场规模越来越大&#xff0c;同时信息量也越来越庞大&#xff0c;人工管理显然已无法应对时代的变化&#xff0c;而实习管理…

人工智能复习

机器学习中线性回归和逻辑回归&#xff1a; 机器学习的分类&#xff1a; 监督学习和无监督学习&#xff0c;半监督学习 监督学习&#xff08;Supervised Learning&#xff09;&#xff1a; 监督学习是一种利用带有标签&#xff08;标记&#xff09;的数据进行训练的机器学习…

使用Windbg动态调试目标进程的一般步骤详解

目录 1、概述 2、将Windbg附加到已经启动起来的目标进程上&#xff0c;或者用Windbg启动目标程序 2.1、将Windbg附加到已经启动起来的目标进程上 2.2、用Windbg启动目标程序 2.3、Windbg关联到目标进程上会中断下来&#xff0c;输入g命令将该中断跳过去 3、分析实例说明 …

鸿蒙HarmonyOS学习手册_入门篇

鸿蒙HarmonyOS学习手册_入门篇 文章目录 鸿蒙HarmonyOS学习手册_入门篇入门快速入门开发准备基本概念UI框架应用模型工具准备 构建第一个ArkTS应用&#xff08;Stage模型&#xff09;-快速入门-入门创建ArkTS工程ArkTS工程目录结构&#xff08;Stage模型&#xff09;构建第一个…

Vue-10、Vue键盘事件

1、vue中常见的按键别名 回车 ---------enter <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>键盘事件</title><!--引入vue--><script type"text/javascript" src"h…

使用Vivado Design Suite平台板、将IP目录与平台板流一起使用

使用Vivado Design Suite平台板流 Vivado设计套件允许您使用AMD目标设计平台板&#xff08;TDP&#xff09;创建项目&#xff0c;或者已经添加到板库的用户指定板。当您选择特定板&#xff0c;Vivado设计工具显示有关板的信息&#xff0c;并启用其他设计器作为IP定制的一部分以…