vue3封装Element动态表单组件

在这里插入图片描述

1. 封装组件DymanicForm.vue

  1. 使用component实现动态组件
  2. 组件不能直接使用字符串传入,所以根据传入的组件名称找到对应的组件
  3. 校验规则,可使用rule传入自定义规则,也可以使用封装好的基本规则 示例中使用了checkRequired
  4. 暴露重置方法和校验方法
<template><el-form:model="currentValue"ref="dymanicForm"v-bind="$attrs"@submit.native.prevent><el-form-item:prop="index":rules="item.rules"v-for="(item, index) in currentSchema":key="index"v-bind="item.formItem || {}"><componentv-model="currentValue[index]":is="item.componentName"v-bind="item"v-on="item.methods || {}"/></el-form-item><slot /></el-form>
</template><script lang="ts" setup>
import checkValidator from "~/utils/validator/index";import {ElInput,ElSelect,ElDatePicker,ElCheckbox,ElRadio,ElRadioGroup,ElCheckboxGroup,ElSwitch,
} from "element-plus";const componentMap = {ElInput: ElInput,ElSelect: ElSelect,ElDatePicker: ElDatePicker,ElCheckbox: ElCheckbox,ElRadio: ElRadio,ElRadioGroup: ElRadioGroup,ElCheckboxGroup: ElCheckboxGroup,
};const props = defineProps({schema: Object,modelValue: [String, Number, Boolean, Array, Date, Object],
});
const emit = defineEmits(["update:modelValue"]);
const currentValue = computed({get: () => props.modelValue,set: (val) => emit("update:modelValue", val),
});const currentSchema = computed(() => {const schema = {};for (const key in props.schema) {let { visible = true, ...item } = props.schema[key];// 动态表单的组件名item.componentName = componentMap[item.componentName];// 是否显示visible =typeof visible !== "function" ? visible : visible(currentValue, item);if (visible) {schema[key] = { clearable: true, ...item };}// 表单验证规则if (schema[key].validator && schema[key].validator.length) {if (!schema[key].rules) schema[key].rules = [];schema[key].validator?.forEach(([valida, args]) => {if (checkValidator[valida]) {schema[key].rules.unshift(checkValidator[valida](args));}});}}return schema;
});
const dymanicForm = ref(null);
const validate = (func) => {if (typeof func === "function") {dymanicForm.value.validate((valid) => {func(valid);});} else {return new Promise((resolve) => {dymanicForm.value.validate((valid) => {resolve(valid);});});}
};
const resetFields = () => {dymanicForm.value.resetFields();
};defineExpose({resetFields,validate,
});
</script>

2. 调用组件示例

<template><div class=""><DymanicFormref="formRef":inline="true":schema="schema"v-model="searchValue"><el-form-item><el-button type="primary" @click="handleQuery">查询</el-button><el-button @click="handleReset">重置</el-button></el-form-item></DymanicForm></div>
</template>
<script setup lang="ts">
import { ref, reactive } from "vue";
import type { ItemSchema } from "~/types/dymanic";
import DymanicForm from "~/components/DymanicForm.vue";const formRef = ref<InstanceType<typeof DymanicForm>>();
const schema = ref<ItemSchema>({userId: {formItem: {label: "用户ID:",},style: {width: "200px",},componentName: "ElInput",placeholder: "请输入用户ID",maxlength: 20,validator: [["checkRequired",{msg: "用户ID不能为空",},],],},username: {formItem: {label: "账号:",},style: {width: "200px",},componentName: "ElInput",placeholder: "请输入账号",maxlength: 20,},name: {formItem: { label: "用户名:" },style: {width: "200px",},componentName: "ElInput",placeholder: "请输入用户名",maxlength: 20,},
});
const searchValue = reactive({userId: "",username: "",name: "",
});
const handleQuery = () => {formRef.value.validate((valid: boolean) => {if (valid) {console.log("查询", searchValue);// 查询逻辑}});
};const handleReset = () => {formRef.value.resetFields();
};
</script>
<style lang="scss" scoped></style>

3. 校验规则示例

// 校验内容不能为空的验证
const checkRequired = ({ msg, trigger = ['blur'] }) => {return {required: true,message: msg,trigger,}
}export default checkRequired

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

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

相关文章

python_1

要求&#xff1a; 代码&#xff1a; # 先将分钟数转化成年数&#xff0c;再将余数做为天数 minute float(input("请输入分钟数&#xff1a;")) year_1 (minute / 60 / 24) // 365 day_1 (minute / 60 / 24) % 365 now f"{minute}分钟{year_1}年{day_1}天&q…

Cocos2dx-lua ScrollView[三]高级篇

一.概述 本文缩写说明:sv = ScrollView, cell代表ScrollView的一个子节点 本文介绍sv的一种封装类库,来实现快速创建sv,有如下几个优点: 1.item的位置通过参数控制,提高开发效率 2.免去了调用sv的API,提高开发效率 3.分帧创建,提高性能 4.可通过参数控制,复用ite…

250.voc,vok 声音,叫喊

250.voc,vok 声音,叫喊 vocal  【vəukəl】 adj. 【voc 声,-al …的】 有声的;用语言表达的,口述的;歌唱的 vocalism  【vəukəlizəm】 n. 【见上,-ism 表行为】 发声;歌唱 vocalist  【vəukəlist】 n. 【见上,-ist 者】 歌唱者;声乐家 vocalize  【vəukə…

《Python编程快速上手——让繁琐工作自动化》实践项目——物品清单

题目&#xff1a; 整个题目篇幅比较大。简化一下就是编写addToInventory函数并且返回一个字典。 思路&#xff1a;函数displayInventory用于物品清单的最后输出&#xff0c;而addToInventory是用于处理战利品的&#xff0c;在原来的装备上添加&#xff0c;已有的装备直接数量加…

Nginx超详细讲解+实操

前言 nginx作为当今火爆的、高性能的http及反向代理服务&#xff0c;不管前端还是后端&#xff0c;都需要全面去了解&#xff0c;学习&#xff0c;实操。 nginx 介绍 为了有一个全面的认知&#xff0c;接下来我们先来看看nginx的架构以及一些特点。 nginx 特点 处理响应请…

安卓系统与iOS对比:两大移动操作系统各有千秋

原文地址&#xff1a;dlshuhua.com/post/79134.html 在当前的移动设备市场中&#xff0c;安卓系统和iOS系统无疑是两大主导力量。它们各自具有独特的优点和特点&#xff0c;吸引了不同需求的用户群体。本文将详细对比这两个系统&#xff0c;分析它们各自的优劣&#xff0c;以帮…

QT(C++)-error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“2”不匹配值“0”

1、项目场景&#xff1a; 在VS中采用QT&#xff08;C&#xff09;调试时&#xff0c;出现error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“2”不匹配值“0”错误 2、解决方案&#xff1a; 在“解决方案资源管理器”中选中出现此类BUG的项目&#xff0c;右键-…

静态路由表学习实验

实验要求&#xff1a;各个pc设备可以通信&#xff0c;并且可以访问外网&#xff0c;假设R1已连接外网 拓扑结构 思路&#xff1a;配置pc机ip地址&#xff0c;子网掩码&#xff0c;和网关&#xff08;网关地址是上层路由接口的地址&#xff09;&#xff0c;配置路由各个接口地址…

什么是LLM Agent?

引言&#xff1a; LLM Agent 已经成为大语言模型中最有价值的探索方向&#xff0c;也更趋于最前沿的通用人工智能。构建企业自己的 LLM Agent 有助于企业在最前沿的人工智能领域探索具有完全自主性的智能化能力&#xff0c;包括基于企业知识库、企业工具 API&#xff08;如&am…

element-plus中的日期时间选择器el-date-picker;日期选择面板中选定起始与结束的日期只能改具体的时刻,日期默认是一个月没法动态修改问题

目前遇到一个问题&#xff0c;在使用element-plus中的日期时间选择器el-date-picker&#xff0c;type为datetimerange时&#xff0c;展示的日期选择面板有两个输入框&#xff0c;开始时间和结束时间&#xff0c;element-plus只提供了default-time 使用datetimerange进行范围选择…

Visio中存在问题的解决方法

公式缩放 mathtype公式在visio缩放之后&#xff0c;出现了变形。 解决方法&#xff1a;每次输入公式都通过 插入->对象->mathType Equation 新建一个公式。可以避免 注&#xff1a;网上有的说在word中使用mathtype编写公式&#xff0c;之后复制到visio中。 插入波形 选择…

超算数据中心是什么?

小万今天主要是带大家一起来了解什么是超算数据中心&#xff0c;相信大家都听过计算机和数据中心&#xff0c;但是超算数据中心又是什么呢&#xff1f; 随着互联网的快速发展&#xff0c;人工智能、云技术和大数据等诸多新兴产业逐渐步入人们的生活当中。这些新兴技术的发展离不…

LinkedIn 互联网架构扩展简史

LinkedIn成立于 2003 年&#xff0c;其目标是连接到您的网络以获得更好的工作机会。第一周只有 2,700 名会员。时间快进了很多年&#xff0c;LinkedIn 的产品组合、会员基础和服务器负载都取得了巨大的增长。 如今&#xff0c;LinkedIn 在全球运营&#xff0c;拥有超过 3.5 亿会…

fuzzywuzzy,一个好用的 Python 库!

目录 前言 安装 基本功能 1. 字符串相似度比较 2. 模糊匹配与排序 实际应用场景 1. 数据清洗 2. 文本匹配与搜索 3. 搜索引擎优化 总结 前言 大家好&#xff0c;今天为大家分享一个好用的 Python 库 - fuzzywuzzy Github地址&#xff1a;https://github.com/seatgeek/fu…

企业如何乘上跨境电商的风口?

近年来&#xff0c;国内跨境电商成为内贸外贸发展的一个亮点&#xff0c;国家工作会议也提出&#xff1a;“要加快培育外贸新动能&#xff0c;巩固外贸外资基本盘&#xff0c;拓展中间品贸易、服务贸易、数字贸易、跨境电商出口”。多因素推动下&#xff0c;使得跨境电商成为我…

星光/宝骏/缤果/长安 车机CarPlay盒子权限破解原理普及----码农版本

从 app 申请 usbdevice 权限说起&#xff0c;通用 app 申请 usbdevice 权限代码如下 一般通过监听 ACTION_USB_DEVICE_ATTACHED usb 设备插入广播获取 UsbDevice 设备&#xff0c;或者通过 UsbManager 枚举出我们感兴趣的 UsbDevice 设备 然后调用 requestPermission(UsbDevi…

使用pytorch构建一个无监督的深度卷积GAN网络模型

本文为此系列的第二篇DCGAN&#xff0c;上一篇为初级的GAN。普通GAN有训练不稳定、容易陷入局部最优等问题&#xff0c;DCGAN相对于普通GAN的优点是能够生成更加逼真、清晰的图像。 因为DCGAN是在GAN的基础上的改造&#xff0c;所以本篇只针对GAN的改造点进行讲解&#xff0c;其…

Mac OS 开启原生NTFS读写功能

方法一&#xff1a; 使用终端命令授予读写移动硬盘的权限&#xff0c;但每次重插移动硬盘都要手动输入命令 (disk4s1是当前硬盘的标识&#xff0c;通过终端输入以下命令获取&#xff1a;diskutil list) diskutil unmount disk4s1 sudo mkdir /Volumes/disk4s1 sudo mount -t …

RedisTemplate的一些常用方法

RedisTemplate 是 Spring Data Redis 提供的一个用于与 Redis 进行交互的模板类&#xff0c;它封装了 Redis 的各种操作方法&#xff0c;提供了更加方便的使用方式。以下是 RedisTemplate 的一些常用方法&#xff1a; 操作字符串数据&#xff1a; // 设置字符串值 redisTempla…

【React】vite + react 项目,安装、配置、使用 less

安装配置 less 1 安装 less2 vite.config.js 进行相关配置3 使用 less 在 React 项目中使用 Less&#xff08;一种 CSS 预处理器&#xff09;可以让你更方便地管理样式。 以下是在 React 项目中使用 Less 的一般步骤&#xff1a; 1 安装 less npm install less -D2 vite.confi…