基于Ant-Design-Vue设计的配置化表单

适用vue 3.4 版本以上

在日常的前端开发中,表单开发必不可少,尤其是在遇到一些大型的复杂的表单,这往往会变成一个痛点。于是就想着开发一个可以list来配置的表单组件。

先上组件代码

<!-- 该组件 VUE 版本在 3.4 以上可使用-->
<template><Formref="formRef":model="model"v-bind='form'><Row :gutter="[8, 8]"><template v-for="config in newConfigs" :key="config.key"><Col v-bind="config.wrapperCol" v-if="config.when(model)"><Form.Item v-bind="config.forImteAttrs":label-col="config.labelCol"><component:is="config.type"v-bind="config.componentAttrs":config="config":raw="config.raw":options="config.componentAttrs.options || options?.[config.key]"v-model:[config.model]="model[config.key]"v-on='{change: (e: any) => {change(e, config.key);config.componentAttrs.onChange?.({update: change,value: model})}}'>{{ config.componentAttrs.buttonText || null }}</component></Form.Item></Col></template><slot /></Row></Form>
</template><script setup lang="ts">
import {Col,Form,FormInstance,Row,
} from 'ant-design-vue';
import {computed, Ref,toRefs,useAttrs,
} from 'vue';
import { FormItemConfig } from './ConfigFormType';const formRef = defineModel<Ref<null | undefined> | FormInstance>('formRef');
const model = defineModel<any>();interface IConfigFormProps {layout?: 'inline' | 'vertical' | 'horizontal';FormGrid?: {};labelCol?: any;wrapperCol?: any;form?: any;configs: FormItemConfig[];options?: { [index: string]: any[] }readonly?: boolean;
}
const props = defineProps<IConfigFormProps>();
const {configs, FormGrid, labelCol, options, wrapperCol, readonly,
} = toRefs(props);const generateUUID = () => 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {// eslint-disable-next-line no-bitwiseconst r = Math.random() * 16 | 0;// eslint-disable-next-line no-bitwise, no-mixed-operatorsconst v = c === 'x' ? r : (r & 0x3) | 0x8;return v.toString(16);
});const gloablAttrs = useAttrs();
const newConfigs = computed(() => configs.value.map((config: any) => {const {grid, key, type, attrs, itemModel, when, children, ...rest} = config;if (key) {rest.name = key;}if (!config.wrapperCol) {rest.wrapperCol = wrapperCol.value;}if (!config.labelCol) {rest.labelCol = labelCol.value;}const forImteAttrs: Partial<any> = rest;const componentAttrs = attrs || {};return {layout: { ...FormGrid, ...grid },name: [key || rest.name],key: key || rest.name || generateUUID(),when: when || (() => true),type,children,model: itemModel!,forImteAttrs,wrapperCol: rest.wrapperCol,labelCol: rest.labelCol,componentAttrs,readonly: gloablAttrs.readonly || readonly.value,disabled: gloablAttrs.disabled,raw: config,};
}));interface IConfigFormEmits {(e: 'finish', value: any): void;(e: 'change', value: any): void;
}
const emit = defineEmits<IConfigFormEmits>();
const change = (e: any, key: string) => emit('change', { value: e, key });
</script>

具体使用

<ConfigForm:configs="configComputed"v-model:formRef="formRef"v-model="formState"@finish="fetchInfo"layout="inline" />

configs
用来生成表单的具体配置,类型如下

// FormItemConfig.ts
import { ColProps } from 'ant-design-vue';
import { Slot } from 'vue';export type FormItemConfig = {title?: string;type: any;layout?: 'horizontal' | 'vertical' | 'inline';key?: string;name?: string;label?: string;rules?: any[] | any;colon?: boolean;options?: any[];hasFeedback?: boolean;help?: string | Slot;labelAlign?: 'left' | 'right';labelCol?: ColProps;required?: boolean;tooltip?: string | Slot;validateFirst?: boolean;validateStatus?: 'success' | 'warning' | 'error' | 'validating';validateTrigger?: string | string[];wrapperCol?: ColProps;extra?: string | Slot | any;model?: any;// eslint-disable-next-line no-unused-varswhen?: (values: Partial<any>, currentValue?: Partial<any>) => boolean;itemModel?: string;attrs?: Partial<any>;children?: FormItemConfig[];
};

configs配置
1、attrs属性为绑定到具体表单组件的属性,例如Select,Input之类的
2、其余大部分属性绑定到<Form.Item>组件上,故可以使用label,rules之类的属性,
3、itemModel一般情况下为value,type为Switch组件时,需根据实际情况变化
4、type属性是直接注入< components >组件的is属性上,所以一些自定义的组件也可以使用,注入到type组件中

import {AutoComplete, Button, Spin,
} from 'ant-design-vue';
import {ref } from 'vue';const autoCompleteLoading = ref<boolean>(false)
const configs = [{title: 'XXX',key: 'name',type: autoCompleteLoading.value ? Spin : AutoComplete,label: 'item 1',rules: { required: true, message: '请输入XXX', trigger: 'blur' },itemModel: 'value',attrs: {options: [{ label: 'item1', value: 'value1' }],allowClear: true,placeholder: 'XXXXXXXX',style: 'width: 280px',filterOption: (inputValue: string, option: any) => option.value.toLowerCase().indexOf(inputValue.toLowerCase()) >= 0,},},{title: 'XXXXXXX',type: Button,attrs: {type: 'primary',htmlType: 'submit',buttonText: '查询',},},];

也可以配合计算属性和响应式函数动态响应表单

// config.ts
import { computed, Ref } from 'vue';
import {AutoComplete, Button, Spin,
} from 'ant-design-vue';export function useConfigComputed(autoCompleteLoading:Ref<boolean>,dataNameList: Ref<{ label: string, value: any }[]>
) {return computed(() => [{title: 'XXX',key: 'name',type: autoCompleteLoading.value ? Spin : AutoComplete,label: 'item 1',rules: { required: true, message: '请输入XXX', trigger: 'blur' },itemModel: 'value',attrs: {options: [{ label: 'item1', value: 'value1' }],allowClear: true,placeholder: 'XXXXXXXX',style: 'width: 280px',filterOption: (inputValue: string, option: any) => option.value.toLowerCase().indexOf(inputValue.toLowerCase()) >= 0,},},{title: 'XXXXXXX',type: Button,attrs: {type: 'primary',htmlType: 'submit',buttonText: '查询',},},]);
}// index.vue <script setup lang='ts'>
const autoCompleteLoading = ref<boolean>(false);
const dataNameList = ref<{ label: string, value: any }[]>([]);
const configs = useConfigComputed(autoCompleteLoading,dataNameList,
)

世纪的使用情况

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

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

相关文章

【QT】定时器使用

文章目录 关于 Qt 定时器使用的注意细节总结实例-检查工具使用周期时间是否合理UI设计头文件 remind.h源文件 remind.cpp实现效果 关于 Qt 定时器使用的注意细节总结 一、创建与初始化 使用 QTimer 类来创建定时器。可以在构造函数中指定父对象&#xff0c;确保定时器在正确的…

JavaDS —— B树

前言 本章节将带领大家进入B树的学习&#xff0c;主要介绍B树的概念和B树的插入代码的实现&#xff0c;删除代码不做讲解&#xff0c;最后简单介绍B树和B*树。 B树的概念 1970年&#xff0c;R.Bayer和E.mccreight提出了一种适合外查找的树&#xff0c;它是一种平衡的多叉树&…

【制作100个unity游戏之32】unity开发属于自己的一个2d/3d桌面宠物,可以实时计算已经获取的工资

最终效果 文章目录 最终效果一、实现Windows消息弹窗二、将窗口扩展到工作区三、穿透能点击到其他区域四、模型交互1、我们可以新增ObjectDrag 代码控制人物拖拖动2、实现模型交互五、最终代码六、其他七、游玩地址七、源码参考完结一、实现Windows消息弹窗 参考:https://lear…

WEB打点

目录 web打点概述打点流程打点中的问题getshell手法汇总web打点批量检测端口扫描POC扫描指纹识别漏洞扫描 手工检测开源框架漏洞通用框架漏洞基础web漏洞商用系统漏洞 WAF绕过waf分类常见waf拦截界面WAF绕过思路侧面绕&#xff1a;适合云WAF直面WAF web打点概述 打点流程 资产…

QT模型视图结构2

文章目录 Qt 模型视图结构——模型类(二)1.基本概念1.1.模型的基本结构1.2.模型索引1.3.行号和列号1.4.父项1.5.项的角色 Qt 模型视图结构——模型类(二) ​ 模型/视图结构是一种将数据存储和界面展示分离的编程方法。模型存储数据&#xff0c;视图组件显示模型中的数据&#…

【AI赋能医学】基于深度学习和HRV特征的多类别心电图分类

一、数据集简介 论文中使用了来自三类不同心电图记录的162条数据&#xff0c;这些数据来自三个公开的数据库&#xff1a; MIT-BIH 心律失常数据库 (ARR) 96条记录&#xff0c;主要包含不同类型的心律失常样本。 MIT-BIH 正常窦性心律数据库 (NSR) 36条记录&#xff0c;包含健…

Gitlab实现多项目触发式自动CICD

工作中可能会遇到这种场景&#xff0c;存在上游项目A和下游项目B&#xff0c;项目B的功能依赖项目A&#xff08;比如B负责日志解析&#xff0c;A是日志描述语言代码&#xff09;&#xff0c;这种相互依赖的项目更新流程一般如下&#xff1a; A项目更新&#xff0c;通知B项目开发…

Unity中InputField一些属性的理解

先看代码&#xff1a; using UnityEngine; using UnityEngine.UI;public class TestInput : MonoBehaviour {[SerializeField]InputField inputField;void Start(){Debug.Log(inputField.text);Debug.Log(inputField.text.Length);Debug.Log(inputField.preferredWidth);Debug…

2024工业机器视觉产业现状

早在20世纪80年代美国国家标准局就预计&#xff0c;检测任务的80%乃至90%将由视觉测量系统来完成&#xff0c;该预测至今已基本变成现实。当前&#xff0c;以智能制造为核心的工业4.0时代背景下&#xff0c;新型工业化的战略部署逐步深入&#xff0c;伴随AI大模型技术应用的逐步…

泰语快速学习方法!速成方法学习!

要快速学习泰语&#xff0c;可以采取多种策略&#xff0c;如掌握基础语法和词汇&#xff0c;专注于发音练习以掌握泰语特有的音调系统&#xff0c;利用语言学习软件进行互动学习&#xff0c;通过观看泰语媒体内容提高听力理解&#xff0c;与母语者进行语言交换来锻炼口语&#…

I2C/IIC学习笔记

I2C/IIC 有些同学I2C和IIC分不清&#xff0c;I2C和IIC实际上是指同一种通信协议。I2C是Inter-Integrated Circuit的缩写&#xff0c;而IIC是它的另一种表述方式&#xff0c;代表的是同一个意思&#xff0c;即“集成电路间总线”。I2C是一种由飞利浦公司&#xff08;现恩智浦半…

python AssertionError: Torch not compiled with CUDA enabled

查看&#xff1a;torch import torch# 输出带CPU&#xff0c;表示torch是CPU版本的 print(ftorch的版本是&#xff1a;{torch.__version__}) # print(ftorch是否能使用cuda&#xff1a;{torch.cuda.is_available()}) 修改一下代码&#xff0c;将cuda改成cpu 最后运行正常&…

织物缺陷检测系统源码分享

织物缺陷检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

跨界融合,GIS如何赋能游戏商业——以《黑神话:悟空》为例

在数字化时代&#xff0c;地理信息系统&#xff08;GIS&#xff09;技术正以其独特的空间分析和可视化能力&#xff0c;为游戏产业带来革命性的变革。《黑神话&#xff1a;悟空》作为中国首款3A级别的动作角色扮演游戏&#xff0c;不仅在游戏设计和技术上取得了突破&#xff0c…

力扣刷题(6)

两数之和 II - 输入有序数组 两数之和 II - 输入有序数组-力扣 思路&#xff1a; 因为该数组是非递减顺序排列&#xff0c;因此可以设两个左右下标当左右下标的数相加大于target时&#xff0c;则表示右下标的数字过大&#xff0c;因此将右下标 - -当左右下标的数相加小于targ…

51单片机-系列-单片机基础知识入门流水灯

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 单片机基础知识入门 常用的单片机封装 DIP直插 在DIP直插中&#xff0c;我们根据引脚数量的不同分为8P,14P,16P,18P,20P&#xff0c;这些是窄体&#xff0c;除了窄体之外&…

【数字组合】

题目 思路 状态表示&#xff1a; f [ i ] [ j ] f[i][j] f[i][j] 对应考虑1到 i 号数字&#xff0c;和为 j 的方法&#xff0c;表示方法数 目标表示&#xff1a; f [ n ] [ m ] f[n][m] f[n][m] 状态转移&#xff1a; f [ i ] [ j ] f [ i − 1 ] [ j ] f [ i − 1 ] [ j …

2024.9.16 day 1 pytorch安装及环境配置

一、配置pytorch环境&#xff0c;安装pytorch 1.查看python版本 python --version 2.在anaconda命令中创建pytorch环境 conda create -n pytorch python3.12(python版本&#xff09; 3.pytorch安装 pytorch首页 PyTorchhttps://pytorch.org/ os为windows推荐package选择…

FPGA基本结构和简单原理

前言&#xff1a; FPGA全程为&#xff08;Field Programmable Gate Array&#xff09;现场可编程逻辑阵列&#xff0c;以基本的逻辑为主可以实现大多数芯片可以实现的功能&#xff0c;比如说&#xff1a;ASIC芯片等&#xff0c;在半导体领域有着重要的作用。 本文…

基于SpringBoot的校园社团活动管理系统设计与实现

文未可获取一份本项目的java源码和数据库参考。 一、设计&#xff08;论文&#xff09;研究背景与意义 在当今的社会&#xff0c;可以说是信息技术的发展时代&#xff0c;在社会的方方面面无不涉及到各种信息的处理。[1]信息是人们对客观世界的具体描述&#xff0c;是人们进行…