vue3 + antd 封装动态表单组件(一)

前置条件:

vue版本 v3.3.11
ant-design-vue版本 v4.1.1

创建动态组件配置文件config.js

import { Input, Textarea, InputNumber, Select, RadioGroup, CheckboxGroup, DatePicker } from 'ant-design-vue';// 表单域组件类型
export const componentsMap = {Text: Input,Textarea,Number: InputNumber,Select,Radio: RadioGroup,Checkbox: CheckboxGroup,DatePicker,
}

创建dynamic-form.vue组件

<template><div><a-form ref="formRef" :model="formModel"><a-form-item:name="item.field":label="item.label"v-for="item in formSchema":key="item.field"v-bind="item.formItemProps"><component:is="componentsMap[item.component]"v-bind="item.componentProps"v-model:value="formModel[item.field]"/></a-form-item></a-form></div>
</template><script setup>
import { ref, watch, onMounted } from "vue";
import { componentsMap } from "./config.js";const props = defineProps({// 表单项配置schema: {type: Array,default: () => [],},// 表单model配置,一般用于默认值、回显数据model: {type: Object,default: () => ({}),},
});const formRef = ref(null);const formSchema = ref([]);
const formModel = ref({});// 表单初始化
const initForm = () => {formSchema.value = props.schema.map((x) => {return {...x,};});// model初始数据formModel.value = props.schema.reduce((pre, cur) => {if (!pre[cur.field]) {// 表单初始数据(默认值)pre[cur.field] = cur.value;return pre;}}, {});
};onMounted(() => {initForm();// 构建表单项后才回显model值,model会覆盖schema配置的value值watch(() => props.model,(newVal) => {formModel.value = { ...formModel.value, ...newVal };},{immediate: true,deep: true,});
});// 表单验证
const validateFields = () => {return new Promise((resolve, reject) => {formRef.value.validateFields().then((formData) => {resolve(formData);}).catch((err) => reject(err));});
};// 表单重置
const resetFields = (isInit = true) => {// 是否清空默认值if (isInit) {formModel.value = {};}formRef.value.resetFields();
};// 暴露方法
defineExpose({validateFields,resetFields,
});
</script>

使用dynamic-form.vue组件

<template><div style="padding: 200px"><DynamicForm ref="formRef" :schema="schema" :model="model" /><div style="display: flex; justify-content: center"><a-button @click="handleReset(true)">重置(全部清空)</a-button><a-button style="margin-left: 50px" @click="handleReset(false)">重置</a-button><a-button type="primary" style="margin-left: 50px" @click="handleSubmit">提交</a-button></div></div>
</template><script setup>
import DynamicForm from "@/components/form/dynamic-form.vue";
import { ref } from "vue";
import dayjs from "dayjs";
const formRef = ref(null);const schema = ref([{label: "姓名",field: "name",component: "Text",componentProps: {allowClear: true,showCount: true,maxlength: 20,style: {width: "500px",},},formItemProps: {rules: [{required: true,message: "请输入姓名",trigger: "blur",},],},},{label: "性别",field: "sex",component: "Radio",componentProps: {options: [{ value: 1, label: "男" },{ value: 2, label: "女" },{ value: 3, label: "保密" },],},formItemProps: {rules: [{required: true,message: "请选择性别",trigger: "blur",},],},value: 1,},{label: "生日",field: "birthday",component: "DatePicker",formItemProps: {rules: [{required: true,message: "生日日期不能为空",trigger: "blur",},],},},{label: "兴趣",field: "hobby",component: "Checkbox",componentProps: {options: [{ value: 1, label: "足球" },{ value: 2, label: "篮球" },{ value: 3, label: "排球" },],},},{label: "国家",field: "country",component: "Select",componentProps: {allowClear: true,options: [{ value: 1, label: "中国" },{ value: 2, label: "美国" },{ value: 3, label: "俄罗斯" },],},},{label: "简介",field: "desc",component: "Textarea",componentProps: {allowClear: true,autoSize: {minRows: 4,maxRows: 4,},maxlength: 200,showCount: true,},},
]);
const model = ref({ name: "百里守约" });
// 提交
const handleSubmit = async () => {const formData = await formRef.value.validateFields();if (formData.birthday) {formData.birthday = dayjs(formData.birthday).format("YYYY-MM-DD");}console.log("提交信息:", formData);
};// 重置
const handleReset = (isInit) => {formRef.value.resetFields(isInit);
};
</script>

效果图
在这里插入图片描述

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

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

相关文章

Python 异源mesh裁剪融合实现与优化

Python 异源mesh裁剪融合实现与优化 一、项目需求二、解决方案1. 代码2. 结果3. 耗时 三、优化探索0. 分析1. 在体素边界处进行裁剪2. 用mesh分块进行裁剪3. 用缓冲区的思路裁剪 一、项目需求 对mesh进行裁剪&#xff0c;但发现若非mesh是致密的&#xff0c;那么裁剪边会出现锯…

JVM工作原理与实战(十六):运行时数据区-Java虚拟机栈

专栏导航 JVM工作原理与实战 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、运行时数据区 二、Java虚拟机栈 1.栈帧的组成 2.局部变量表 3.操作数栈 4.帧数据 总结 前言 JVM作为Java程序的运行环境&#xff0c;其负责解释和执行字节码&#xff0c;管理…

图片太模糊我们怎么提高清晰度呢

在数字时代&#xff0c;图片是我们日常生活中不可或缺的一部分。然而&#xff0c;有时候由于各种原因&#xff0c;我们得到的图片清晰度可能并不理想。这篇文章将介绍三款软件&#xff0c;帮助你提高图片的清晰度&#xff0c;让你的图片更加生动、清晰。 一、水印云 水印云是…

小型机故障案例

小型机故障案例 小型机往往应用于金融、电力、电信等行业&#xff0c;Unix操作系统和专用服务器RAS特性、纵向扩展性和高并发访问下的出色处理能力**&#xff0c;如HP RX6600**本文章记录在机房直连服务器进行故障原因排查及解决过程 故障现象 HP RX6600小型机关机后&#xff…

uniapp 微信小程序 内嵌H5网页办法

uniapp 微信小程序 内嵌H5网页办法 如图所示 1.新建webView页面 <template><web-view v-ifhttpUrl :srchttpUrl></web-view> </template><script>export default {data() {return {httpUrl: "",};},onLoad(options) {options.http…

脏牛漏洞(CVE-2016-5195)复现过程(详细完整版)

1、实验环境 KaLi 攻击机 Linux靶机 靶场 实验目的&#xff1a; 掌握漏洞利用的方法 掌握脏牛漏洞的原理 提高对内核安全性的认识 2、靶场搭建 VMware导入靶场 靶场地址&#xff1a;链接&#xff1a;百度网盘 请输入提取码百度网盘为您提供文件的网络备份、同步和分享服务。…

element表格复选框回显,取消选择

this.dataList response.rowsthis.tableColumnListresponse.tableColumnListthis.queryParams.totalresponse.totalif (this.pointitle修改) {console.log("xxxx")let arrthis.dataListlet arr1this.tagsthis.$nextTick(()>{arr.forEach((row)>{arr1.forEach(…

Pypputeer自动化

Pyppeteer简介 pyppeteer 是 Python 语言的一个库&#xff0c;它是对 Puppeteer 的一个非官方端口&#xff0c;Puppeteer 是一个 Node 库&#xff0c;Puppeteer是Google基于Node.js开发的一个工具&#xff0c;它提供了一种高层次的 API 来通过 DevTools 协议控制 Chrome 或 Ch…

Gradio转换为API调用

Gradio UI应用转化调用的API接口&#xff0c; 1、Flask Web库框架创建一个API服务器。 2、下面是一个简单的代码示例&#xff1a; from flask import Flask, jsonify, request import gradio as grapp Flask(__name__)# define your Gradio interface function def say_hell…

分类预测 | Matlab实现ISSA-SVM基于多策略混合改进的麻雀搜索算法优化支持向量机的数据分类预测

分类预测 | Matlab实现ISSA-SVM基于多策略混合改进的麻雀搜索算法优化支持向量机的数据分类预测 目录 分类预测 | Matlab实现ISSA-SVM基于多策略混合改进的麻雀搜索算法优化支持向量机的数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 基于多策略混合改进的麻…

js实现购物车

### 嘎嘎原生&#xff0c;看就完了 ### # # html部分 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name"…

【笔记】语言实例比较 2. 两数之和 C++ Rust Java Python

语言实例比较 2. 两数之和 C Rust Java Python 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除…

【LeetCode算法题】各类排序算法的Python实现

系列文章目录 【LeetCode算法题】各类基础排序算法的Python实现 文章目录 系列文章目录【LeetCode算法题】各类基础排序算法的Python实现 1. 直接插入排序2. 折半插入排序3. 选择排序4. 冒泡排序5. 归并排序算法6.快速排序7. 堆排序总结 对于直接插入排序、折半插入排序、选择…

C++ 对一个结构体的集合进行排序,需要的代码

C 对一个结构体的集合进行排序&#xff0c;需要的代码 /* 4 50 10 60 20 100 30 120 16 45 */ #define _CRT_SECURE_NO_WARNINGS#include <iostream> #include<vector> #include <algorithm> // 需要包含 sort() 函数所在的头文件 struct P {int w;//重量int…

docker报错 missing signature key 无法拉去镜像,yum install docker-ce没有可用软件包 解决办法

错误场景描述 今天项目需要用到minio&#xff0c;我打算在虚拟机中使用docker装一个&#xff0c;可是发现当我docker pull minio/minio的时候&#xff0c;报错了missing signature key 这个报错提示的让人很蒙&#xff0c;翻译过来的意思是 “缺少签名密钥” &#xff1f;&am…

鸿蒙开发语言ArkTS--Ability中的生命周期

鸿蒙开发语言ArkTS–Ability中的生命周期 在ArkTS语言中&#xff0c;这是一个在ArkTS中定义Ability生命周期的示例。 Ability的生命周期&#xff1a; onCreate(want, launchParam)&#xff1a;在UI创建后执行的函数。在这个阶段&#xff0c;您可以执行初始化操作&#xff0c;…

7.C++ this指针

每一个非静态成员函数只会诞生一份函数实例&#xff0c;也就是说多个同类型的对象会共用一块代码。 那么这一块代码是如何区分那个对象调用自己的呢&#xff1f;C通过提供特殊的对象指针&#xff0c;this指针&#xff0c;解决上述问题。 this指针指向被调用的成员函数所属的对象…

用 Python 制作可视化 GUI 界面,一键实现自动分类管理文件!

经常杂乱无章的文件夹会让我们找不到所想要的文件&#xff0c;因此小编特意制作了一个可视化GUI界面&#xff0c;通过输入路径一键点击实现文件分门别类的归档。 不同的文件后缀归类为不同的类别 我们先罗列一下大致有几类文件&#xff0c;根据文件的后缀来设定&#xff0c;大…

GaussDB与openGauss有什么相同和不同?

众所周知&#xff0c;GaussDB是华为自主创新研发的分布式关系型数据库&#xff0c;为企业提供功能全面、稳定可靠、扩展性强、性能优越的企业级数据库服务&#xff0c;openGauss是开源数据库&#xff0c;两者之间又是什么样的关系&#xff0c;有什么相同和不同&#xff0c;让我…

如何使用Portainer部署web站点并实现无公网ip远程访问

文章目录 前言1. 安装Portainer1.1 访问Portainer Web界面 2. 使用Portainer创建Nginx容器3. 将Web静态站点实现公网访问4. 配置Web站点公网访问地址4.1公网访问Web站点 5. 固定Web静态站点公网地址6. 固定公网地址访问Web静态站点 前言 Portainer是一个开源的Docker轻量级可视…