# xrc-form2 **Repository Path**: yansen_zh/xrc-form2 ## Basic Information - **Project Name**: xrc-form2 - **Description**: No description available - **Primary Language**: JavaScript - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2019-12-16 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # xrc-form2 基于 [antd v4](https://ant.design/components/form-cn/) 版本进行的 form 组件封装,实现简单的 form 表单 json 配置化 ## 引用 ```jsx import {XForm, XItem} from '@zjxpcyc/xrc-form2' ``` ## 使用 ### 创建 Form ```jsx // 这样就可以使用 Form 了 class MyComponent extends React.Component { render() { return ( ); } } ``` 生成的 Form 有如下 Props 设置 | prop | 说明 | 类型 | |---|---|---| | onSubmit | 表单提交 | function(allFieldValues, setSubmittingFunc), setSubmittingFunc 可以设置提交状态 `true|false` | | onCancel | 表单取消 | function() {} | | onError | 表单校验出错 | function(err) {} | | footer | 表单底部 action 区域 | React.Element , 如果为 `null` 则不显示, 默认带有 `submit` 跟 `cancel` 按钮 | | ... | 其他 [Antd Form](https://ant.design/components/form-cn/#Form) 支持的属性 | | ### 添加表单字段 ```jsx import React from 'react'; import { Input } from 'antd'; const fields = [ { label: '姓名', name: 'userName', render: , help: '请填写您注册时的手机号或者邮箱', required: true, }, { label: '密码', name: 'userPassword', render: , required: true, }, ]; // some codes //
``` 表单字段是通过 `json` 配置实现的。支持的属性有 | 属性 | 说明 | 类型 | |---|---|---| | render | 字段节点,比如 `input` `select` 之类 | `React.node`, 非必填 | | ... | 其他 [Form.Item](https://ant.design/components/form-cn/#Form.Item) 支持的属性 | | ## 示例 请参考 `example` 目录内容 ## Q&A * 隐藏字段 部分场景下, 可能希望提交的 `values` 里面包含隐藏的字段, 这种情况下可以使用 ```jsx { name: 'hide-field-name', render: null, style: { display: none }, // style 跟 noStyle 二选一 noStyle: true, // noStyle 为 Form.Item 支持的属性 } ``` * 动态字段 还有一种情况, 某个字段可能因为另外一个字段的设置而显示或者隐藏, 这种情况也可以通过 `style` 与 `noStyle` 来控制. 只不过需要监听字段的修改. 字段的修改有两种方法,一种是监听 `Form.onChange` , 一种是监听 `Form.onValuesChange` . 两者的区别是, 前者实际上是表单字段的 `onChange` 事件代理, 后者是封装过的特殊 `change` 事件,除了提供字段的 `value` 之外,还提供了整个 `Form` 的 `values` 。所以推荐监听 `Form.onValuesChange` ```jsx const handleFormChange = (value, allValues) => { setFormValues(allValues) // setFormValues 用来缓存最新的表单内容 } const fields = [ { label: '姓名', name: 'userName', render: , help: '请填写您注册时的手机号或者邮箱', required: true, }, { label: ' ', colon: false, render: '此行文本会随着姓名的输入而显示', style: { display: formValue.userName ? undefined : 'none' }, // formValue 就是表单的最新值 } ] ``` * 级联选择 处理的方式跟动态字段的处理方式基本一致 * 初始化值 两种方式, 一种是把初始化值对象直接放到 `Form.initialValues` ```jsx const initialValues = { userId: '123', userName: 'foo' } ``` 另一种方式是将初始化 `value` 放入到每个 `field` 里面 ```jsx const fields = [ { label: '姓名', name: 'userName', value: 'foo', // 可以用来初始化数据 render: , help: '请填写您注册时的手机号或者邮箱', required: true, }, ... ] ``` ## 注意事项 * 字段组件支持自定义封装, 但是封装组件必须满足2个条件。1、值传递通过 `value` 属性, 2、提供 `onChange` 事件 * 字段组件必须支持 `ref` 传递. 因此函数式组件, 请使用 `React.forwardRef` 包裹起来