1.1.4 • Published 11 months ago

antd-dynamic-form-render v1.1.4

Weekly downloads
-
License
ISC
Repository
-
Last release
11 months ago

DynamicForm

基于webapck5、react、antd5搭建的动态配置表单组件,支持编辑和视图模式

构建和发布

安装依赖

npm i

运行项目

npm run start

打包

npm run build

发布

npm run release

基本使用

支持类型(FORM_FIELD_TYPE)

引入方式

import { FORM_FIELD_TYPE } from 'antd-dynamic-form-render';

基本配置

类型字段
普通文本FIELD_TYPE_INPUT
大文本FIELD_TYPE_TEXTAREA
数字(整数)FIELD_TYPE_INT
数字(浮点)FIELD_TYPE_FLOAT
下拉单选FIELD_TYPE_SELECT
下拉多选FIELD_TYPE_MULTI_SELECT
下拉Tag选择FIELD_TYPE_TAG_SELECT
下拉单选搜索FIELD_TYPE_SEARCH
下拉多选搜索FIELD_TYPE_MULTI_SEARCH
下拉数形单选FIELD_TYPE_TREE_SELECT
下拉数形多选FIELD_TYPE_MULTI_TREE_SELECT
日期FIELD_TYPE_DATE
日期区间FIELD_TYPE_RANGE
开关FIELD_TYPE_SWITCH
单选框FIELD_TYPE_RADIO
复选框FIELD_TYPE_CHECKBOX
组合组件FIELD_TYPE_FIELD_GROUP
自定义组件FIELD_TYPE_COMPONENT

表单项组件(FormFieldRender)

引入方式

import { FormFieldRender } from 'antd-dynamic-form-render';

基本配置

参数描述
mode字段模式,可选值可为edit、view,默认edit
fieldType字段类型,可选择为FORM_FIELD_TYPE支持类型
rules规则字段,数字类型rules可以转换为antd属性
...其他prop参考antd各个表单组件配置

动态表单项组件

此组件和表单项组件的区别在于mode字段多了hover模式,表示字段默认为为view模式,当字段被点击是,会切换成edit模式;除此之外 此组件支持配置rules,在字段onChange时自动进行校验。

引入方式

import { DynamicFieldRender } from 'antd-dynamic-form-render';

基本配置

参数描述
mode字段模式,可选值可为edit、view、hover,默认edit
fieldType字段类型,可选择为FORM_FIELD_TYPE支持类型
rules规则字段,onChange时会自动进行表单项的校验
...其他prop参考antd各个表单组件配置

动态表单组件(DynamicFormRender)

引入方式

import { DynamicFormRender } from 'antd-dynamic-form-render';

基本配置

参数描述
mode字段模式,可选值可为edit、view
formantd的form实例
size字段尺寸大小,可选small、default、large
layoutType布局方式,顺序布局normal、栅格布局layout, 默认layout
rowCount一行显示的字段个数,默认为3
initialValues表单初始值
formLayout自定义表单布局,否则默认通过 layoutType和rowCount值进行生成
formItemProps其他antd的Form.item的配置
formList配置表单项字段,具体参考formList配置
...其他prop参考antd的Form配置

formList配置

参数描述
title字段名称
name字段编码
fieldType字段类型
rules校验规则,参考antd的表单rules配置
isEnabled字段是否使能,字符串0或1,0表示不使能,1表示使能, 默认使能
isEditable字段是否可编辑,字符串0或1,0表示不可编辑,1表示可编辑,默认可编辑
isRequired字段是否可必填,字符串0或1,0表示不必填,1表示必填,默认不必填
isRowAlone字段是否可单行展示,字符串0或1,1表示单行展示
dataSource数据源字段,针对部分字段类型有效
fetch搜索类型字段必填,自定义搜索接口
onLoaded数据源字段加载数据回调
groupFields只针对字段组字段类型有效,数组类型,配置参考formList配置
component只针对自定义组件字段类型有效,可自定义表单项组件
...其他prop参考antd各个表单组件配置

完整案例(在线调试地址

import React, { useRef, useState } from "react";
import { Form, Button, Input } from 'antd';
import jsonp from 'fetch-jsonp';
import qs from 'qs';

import { FORM_FIELD_TYPE, DynamicFormRender, DynamicFieldRender } from 'antd-dynamic-form-render'

const { 
  FIELD_TYPE_INPUT,
  FIELD_TYPE_TEXTAREA,
  FIELD_TYPE_INT,
  FIELD_TYPE_FLOAT,
  FIELD_TYPE_SELECT,
  FIELD_TYPE_MULTI_SELECT,
  FIELD_TYPE_TAG_SELECT,
  FIELD_TYPE_SEARCH,
  FIELD_TYPE_MULTI_SEARCH,
  FIELD_TYPE_DATE,
  FIELD_TYPE_RANGE,
  FIELD_TYPE_FIELD_GROUP,
  FIELD_TYPE_SWITCH,
  FIELD_TYPE_RADIO,
  FIELD_TYPE_CHECKBOX,
  FIELD_TYPE_COMPONENT,
} = FORM_FIELD_TYPE;

const DATASOURCE = [{ code: '1', name: '1111'}, { code: '2', name: '2222'}];

const UNIT_DATA = [{ code: '1', name: 'cm'}, { code: '2', name: 'm'}];

const defaultValue = {
  field1: '1233',
  field2: 222.332,
  field3: '1',
  field33: ['1', '2'],
  field4: 123431,
  field5: '114311.8010847826',
  field6: ['114311.8010847826'],
  field7: 1680019200000,
  field8: [1677945600000, 1682092799000],
  field9: '测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试',
  field11: true,
  field12: '1',
  field13: ['1', '2'],
  field14: '啦啦啦',
  component: {field1: '123', field2: '2' }
}


const TestDynamicFormRender = (props) => {

  const [mode, setMode]= useState('view');

  const initialValues = useRef(defaultValue)

  const [form] = Form.useForm();

  const fetchData = (params) => {
    const { name } = params || {}
    return jsonp(`https://suggest.taobao.com/sug?code='utf-8'&q=${name}`).then((response: any) => response.json())
  }

  const handleFetchLoaded = (res) => {
    return (res.result || []).map(v => ({ code: v[1], name: v[0]}))
  }

  const handleSubmit = () => {
    form.validateFields().then(values =>{
      console.log(values)
    })
  }

  const handleReset = () => {
    form.resetFields();
  }

  const handleChangeMode = () => {
    setMode(mode === 'edit' ? 'view' : 'edit')
  }

  const generateComponent = (props) => {
    const aProps = _.omit(props, ['mode', 'component'])
    return (
      <div style={{ display: 'flex', alignItems: 'center' }}>
        <Input {...aProps}/>
        <a style={{ marginLeft: '10px' }}>link</a>
      </div>
    )
  }
  
  const formProps = {
    form,
    mode: mode,
    initialValues: initialValues.current,
    size: 'small',
    // layout: 'vertical',
    // formLayout: { labelCol: { span: 3 }, wrapperCol: { span: 12 } },
    layoutType: 'normal',
    rowCount: 4,
    formList: [
      {
        title: '文本',
        name: 'field1',
        fieldType: FIELD_TYPE_INPUT,
        rules: [
          { max: 5, message: '最大长度为5' },
        ],
      },
      {
        title: '浮点数字',
        name: 'field2',
        rules: [
          { max: 100, type: 'number', message: '最大值为100' },
          { min: 10,  type: 'number', message: '最小值为10' },
        ],
        // isRequired: '1',
        fieldType: FIELD_TYPE_FLOAT,
      },
      {
        title: '下拉单选',
        name: 'field3',
        // isRequired: '1',
        fieldType: FIELD_TYPE_SELECT,
        dataSource: [...DATASOURCE],
      },
      {
        title: '下拉多选',
        name: 'field33',
        isRequired: '1',
        fieldType: FIELD_TYPE_MULTI_SELECT,
        dataSource: [...DATASOURCE],
      },
      {
        title: '整数',
        name: 'field4',
        fieldType: FIELD_TYPE_INT,
      },
      {
        title: '下拉单选搜索',
        name: 'field5',
        fieldType: FIELD_TYPE_SEARCH,
        isClearOptionsAfterSelect: true,
        fetch: fetchData,
        onLoaded: handleFetchLoaded,
      },
      {
        title: '下拉多选搜索',
        name: 'field6',
        fieldType: FIELD_TYPE_MULTI_SEARCH,
        fetch: fetchData,
        onLoaded: handleFetchLoaded,
      },
      {
        title: '日期',
        name: 'field7',
        fieldType: FIELD_TYPE_DATE,
      },
      {
        title: '日期区间',
        name: 'field8',
        fieldType: FIELD_TYPE_RANGE,
      },
      {
        title: '大文本',
        name: 'field9',
        fieldType: FIELD_TYPE_TEXTAREA,
      },
      {
        title: '开关',
        name: 'field11',
        fieldType: FIELD_TYPE_SWITCH,
      },
      {
        title: '单选框',
        name: 'field12',
        fieldType: FIELD_TYPE_RADIO,
        dataSource: [...DATASOURCE],
      },
      {
        title: '复选框',
        name: 'field13',
        fieldType: FIELD_TYPE_CHECKBOX,
        dataSource: [...DATASOURCE],
      },
      {
        title: '自定义组件',
        name: 'field14',
        fieldType: FIELD_TYPE_COMPONENT,
        isRequired: '1',
        component: generateComponent,
      },
      {
        title: '组合组件',
        name: 'component',
        fieldType: FIELD_TYPE_FIELD_GROUP,
        isRowAlone: '1',
        isRequired: '1',
        style: { maxWidth: '400px' },
        groupFields: [
          {
            name: 'field1',
            title: '数字',
            fieldType: FIELD_TYPE_INT,
            // isRequired: '1',
          },
          {
            name: 'field2',
            title: '单位',
            // allowClear: false,
            fieldType: FIELD_TYPE_SELECT,
            dataSource: [...UNIT_DATA],
            // isRequired: '1',
          },
          {
            title: '下拉多选搜索',
            name: 'field6',
            fieldType: FIELD_TYPE_MULTI_SEARCH,
            fetch: fetchData,
            onLoaded: handleFetchLoaded,
          },
        ]
      },
    ]
  }

  const fieldProps = {
    fieldType: FIELD_TYPE_MULTI_SELECT,
    id: 'ceshi1',
    mode: 'hover',
    size: 'default',
    dataSource: DATASOURCE, 
    style: { width: 200 },
    placeholder: '请输入',
    rules: [
      { required: true, message: '字段不能为空' }
    ],
    
  }

  return (
    <>
      <DynamicFormRender {...formProps}/>
      <div style={{ padding: '10px 0'}}>
        <Button onClick={handleChangeMode}>切换模式</Button>
        <Button style={{ marginLeft: '10px' }} onClick={handleSubmit}>提交</Button>
        <Button style={{ marginLeft: '10px' }} onClick={handleReset}>重置</Button>
      </div>
      <div style={{ marginTop: '20px' }}>
        <DynamicFieldRender {...fieldProps}/>
      </div>
    </>
  )
}

export default TestDynamicFormRender;
1.1.4

11 months ago

1.1.3

1 year ago

1.1.2

1 year ago

1.1.1-1

1 year ago

1.1.1

1 year ago

1.1.0

1 year ago

1.0.17

1 year ago

1.0.16

1 year ago

1.0.15

1 year ago

1.0.14

1 year ago

1.0.13

1 year ago

1.0.12

1 year ago

1.0.11

1 year ago

1.0.10

1 year ago

1.0.9

1 year ago

1.0.8

1 year ago

1.0.7

1 year ago

1.0.6

1 year ago

1.0.5

1 year ago

1.0.4

1 year ago

1.0.3

1 year ago

1.0.1

1 year ago

1.0.0

1 year ago