react、vue动态form表单

需求在日常开发中反复写form 是一种低效的开发效率,布局而且还不同这就需要我们对其封装

为了简单明了看懂代码,我这里没有组件,都放在一起,简单抽离相信作为大佬的你,可以自己完成,

一、首先我们做动态form 要明白几点:

1、类型,2、检验,3、不同组件又不同的方法事件(重点)4、布局(更加通用型)

UI库是antd(element同理替换组件即可主要是父组件formItems标签替换)

TypeScript 复制代码
import {Button, Cascader, Col, DatePicker, Form, Input, InputNumber, Mentions, Row, Select, TreeSelect} from "antd";
import React from "react";
import style from "./style.less";

const {RangePicker} = DatePicker;

const formItemLayout = {
  labelCol: {
    xs: {span: 24},
    sm: {span: 6},
  },
  wrapperCol: {
    xs: {span: 24},
    sm: {span: 18},
  },
};

type ColSpanType = {
  offset?: number;
  xs?: number;
  sm?: number;
  md?: number;
  lg?: number;
  xl?: number;
};

const FormApp: React.FC = () => {
//根据ui 设置布局
  const responsiveLayout: ColSpanType = {
    xs: 24,
    sm: 24,
    md: 8,
    lg: 8,
    xl: 8,
  };

  const formItems = [
    {
      label: 'Input', 
      name: 'Input', 
      rules: [{required: true, message: "Please input!"}], 
      component: Input, 
      placeholder: '请输入',
      events: {
        onChange: (e) => console.log(e.target.value),
        onFocus: () => console.log('Input focused'),
        // Add other events here
      },
    },
    // ... other form items ...
  ];

  return (
    <Form {...formItemLayout} className={style.formContainer}>
      {formItems.map((item, index) => (
        <Col {...responsiveLayout} key={index}>
          <Form.Item label={item.label} name={item.name} rules={item.rules}>
            <item.component placeholder={item.placeholder} style={{width: "100%"}} {...item.events} />
          </Form.Item>
        </Col>
      ))}
      <Col span={24}>
        <Row justify='end'>
          <Form.Item>
            <Button type='primary' htmlType='submit'>
              Submit
            </Button>
          </Form.Item>
        </Row>
      </Col>
    </Form>
  );
};

export default FormApp;

二、完整组件分离代码

由于代码太多见gitee

父组件 src/pages/form/index.tsx · Jim/react-new-umi-antd-2024 - Gitee.com

表单组件 DynamicForms src/components/DynamicForms/index.tsx · Jim/react-new-umi-antd-2024 - Gitee.com

如果是vue 同学 DynamicForms直接拷贝使用(组件还是tsx/jsx 不要放在.vue 文档中组件还是不要用.vue 局限性太大),只需要把父组件的Dom 结构改的。推荐vu3 setup

原创不易,请关注谢谢支持

相关推荐
江城开朗的豌豆几秒前
小程序登录不迷路:一篇文章搞定用户身份验证
前端·javascript·微信小程序
aesthetician5 分钟前
React 19.2.0: 新特性与优化深度解析
前端·javascript·react.js
Django强哥8 分钟前
JSON Schema Draft-07 详细解析
javascript·算法·代码规范
FIN666820 分钟前
射频技术领域的领航者,昂瑞微IPO即将上会审议
前端·人工智能·前端框架·信息与通信
U.2 SSD29 分钟前
ECharts漏斗图示例
前端·javascript·echarts
江城开朗的豌豆29 分钟前
我的小程序登录优化记:从短信验证到“一键获取”手机号
前端·javascript·微信小程序
excel33 分钟前
Vue Mixin 全解析:概念、使用与源码
前端·javascript·vue.js
IT_陈寒40 分钟前
Java性能优化:这5个Spring Boot隐藏技巧让你的应用提速40%
前端·人工智能·后端
勇往直前plus1 小时前
CentOS 7 环境下 RabbitMQ 的部署与 Web 管理界面基本使用指南
前端·docker·centos·rabbitmq
Never_Satisfied1 小时前
在JavaScript / HTML中,Chrome报错此服务器无法证实它就是xxxxx - 它的安全证书没有指定主题备用名称
javascript·chrome·html