表單問題,無論是在 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
固然也能夠在線編輯:在線編輯性能