atnd 3.x版本中,如何爲表單設置、綁定默認值
在react的組件化開發思維,確實做到很綁,獨創的JSX
語言爲一切組件皆函數提供強有力的支撐。但是,對於需要雙向數據綁定場景來說,真的是噩耗。尤其是在做表單的數據綁定。
下面介紹一下,在react+antd如何實現表單字段的數據初始值設置,數據綁定等騷操作。
getFieldDecorator
及Form.create
要實現數據綁定,及初始化,getFieldDecorator
及Form.create
方法很重要。
getFieldDecorator
是用來裝飾form中的各種輸入控件的,如:input
select
…,裝飾啥呢,爲毛要去裝飾這些,搞得怪怪的,想幹嘛直接對input
進行設置或操作不行嗎?真的不行(至少不夠優雅,因爲你會陷入無窮無盡的事件綁定的定義及狀態修改的陷阱)
Form.create
則是用來包裹成一個form
的,這TMD又不是人話,好端端的,去包裹一個<form>
幹嘛?其實,簡單點來說,就是可以用Form.create
來創建一個完全自定義的<form>
,一般的HTML(react下的jsx)代碼被Form.create
包裹了一些,那麼,這個組件就具有form的一些特性了。
但是,我們貌似對自定義<form>
沒興趣啊? 爲毛用它呢? 這是因爲,用它包裹了組件後,組件就弄直接繼承一些很有用的屬性,這些屬性是可以直接操作使用 getFieldDecorator
裝飾過的各種輸入控件的。
1) 如何使用getFieldDecorator
getFieldDecorator
可以理解爲,一個用在form表單中爲input
進行數據綁定的工具或方法,antd貌似把它叫做裝飾器。怎麼使用呢,看下面:
class MyComp extends Componet{
render(){
const id = 'userName'
const options = {
initialValue: 'xiao.ming'
}
const { getFieldDecorator } = this.props.form
return (
<Form>
{getFieldDecorator(id, options)(<Input />)}
<Button htmlType="submit">提交</Button>
</Form>
}
}
1) 如何使用Form.create
呢?
很簡單,直接在組件最後導出時,用Form.create
執行以下就好了
export default Form.create({name: 'my-form'})(MyComp)
經過form.create後, 可以從組件props中獲取form。
經過 getFieldDecorator 包裝的控件,表單控件會自動添加 value(或 valuePropName 指定的其他屬性) onChange(或 trigger 指定的其他屬性),數據同步將被 Form 接管,這會導致以下結果:
1、’你不再需要也不應該用 onChange 來做同步,但還是可以繼續監聽 onChange 等事件。
2、你不能用控件的 value defaultValue 等屬性來設置表單域的值,默認值可以用 getFieldDecorator 裏的 initialValue。
3、你不應該用 setState,可以使用 this.props.form.setFieldsValue 來動態改變表單值。
注意:
1、getFieldDecorator 不能用於裝飾純函數組件。
2、如果使用的是 react@<15.3.0,則 getFieldDecorator 調用不能位於純函數組件中:
經過 getFieldDecorator 包裝的控件,表單控件會自動添加 value(或 valuePropName 指定的其他屬性) onChange(或 trigger 指定的其他屬性),數據同步將被 Form 接管。
上面這段話,也就是說,自定義的控件經過getFieldDecorator包裝後,會有onChange屬性,這樣自定義控件傳值是,用onChange傳入,就會改變value的值,在表單提交的時候,就可以獲取value的值。