表单问题,无论是在 jQuery 时代,仍是 Angular/React 时代,都永远是前端工程师们的痛,可是这又是没办法的事情,业务需求多种多样,对于中后台业务而言,表单页面和报表页面基本上是中后台业务的核心展示形式,可是,React的表单真的是复杂而又难以维护。前端
下面咱们尝试实现下面的表单:vue
export default class Example extends React.Component { constructor(){ super() this.state = { formData: { name: '', type: '' } } } render() { const { formData } = this.state return <div className="base-form-area"> <div className="form-item"> <span>名称:</span> <Input value={formData.name} onChange={event => { this.setState({ formData: { ...formData, name: event.target.value } }) }} /> </div> <div className="form-item"> <span>类型:</span> <Input value={formData.type} onChange={event => { this.setState({ formData: { ...formData, type: event.target.value } }) }} /> </div> </div> } }
看着这样的代码,是否有种人生很难的苦痛,这还只是功能最简单的表单,没有校验功能,也不存在任何控制、联动逻辑,其代码量已经很是庞大了。
除此以外,React原始代码实现的表单,数据和逻辑没有内敛,表单状态和数据散落在组件各个地方,致使表单复用和维护都比较困难。
@Form.create() export default class Editor extends React.Component { render() { const { getFieldDecorator } = this.props.form; return <div className="base-form-area"> <Form> <Form.Item label="名称"> { getFieldDecorator('name', { rules: [{required: true, message: '请输入名称'}], })( <Input /> ) } </Form.Item> <Form.Item label="类型"> { getFieldDecorator('type', { rules: [{required: true, message: '请输入类型'}], })( <Input /> ) } </Form.Item> </Form> </div> } }
Antd Form语法复杂、代码量也比较庞大,说实话,到目前为止,我也没记住过它的那些方法,最严重的问题是:Antd Form存在比较严重的性能问题,当表单组件比较多的时间,页面会卡顿。
JSXForm是借鉴vuejs的指令语法,在React中将表单组件的功能和逻辑进行抽象的组件,它的语法简单清晰。
JSXForm的文档地址为:JSXFormgit
JSXForm有如下优势:github
咱们用JSXForm的语法实现上面的简单表单:前端工程师
export default class Editor extends React.Component { render() { return <div className="base-form-area"> <JSXForm labelWidth={50}> <Input v-model="name" v-label="名称" /> <Input v-total={['type', '类型', 'required']}/> </JSXForm> </div> } }
JSXForm的性能表现能够在性能测试页面中测试出来。frontend
固然也能够在线编辑:在线编辑性能