Validation Helper for form in Mobx
Installation
npm i mobx-form-validate --save
API
@validate(regexp[, message])
@validate((value, this)=>string|undefined)
Use this decorator on your properties, which must be aslo decorated by @observable or @computed.
This will add a hidden @computed
field named with 'validateError' prefix in camel-case,
which should be undefined when validation successed, or be a string which indicate error message.
This will also add a computed field named 'validateError', which indicate any error occuered in this form.
This will also add a computed field named 'isValid', whether this form has no validation error.
Usage
Create a observable class with validation
;;; @observable @ mobile = ''; @observable @ pwd = ''; // Bind this for future use. { return Session; } const form = ;console; // Please enter a valid mobileconsole; // Please enter a valid mobileconsole; // false
Use with react
;; ; @observerComponent form = ; { return <div> <p>Mob: <input value=thisformmobile onChange=thisformmobile = evtargetvalue/></p> <p>thisformvalidateErrorMobile</p> <p>Pwd: <input type="password" value=thisformpwd onChange=thisformpwd = evtargetvalue/></p> <p>thisformvalidateErrorPwd</p> <button disabled=!thisformisValid onClick=thisformsubmit>Submit</button> </div> }
Use with react-native
Just replace all html element with react-native components.
;;;; @observerComponent form = ; { return <View> <View><Text>Mob:</Text> <TextInput value=thisformmobile onChangeText=thisformmobile = text/></View> <View>thisformvalidateErrorMobile</View> <View><Text>Pwd:</Text> <TextInput type="password" value=thisformpwd onChangeText=thisformpwd = text/></View> <View>thisformvalidateErrorPwd</View> <TouchableOpacity disabled=!thisformisValid onPress=thisformsubmit><Text>Submit</Text></button> </View> }
Custom valid condition
You can define your own isValid
getter, with any additional condition:
startAt = ; @computed { // This form is only submittable after 10 seconds. return !thisvalidateError && - thisstartAt > 10000; }
Optimize
To avoid re-render of the whole form, you can create a item component to observe a single field:
;; ;; // Only re-render when this field changes.const Input = ; // Only re-render when the whole form become valid or invalid.const Submit = ; // Do not re-render.Component form = ; { return <div> <Input label="Mob:" name="mobile" form=thisform /> <Input label="Pwd:" name="pwd" form=thisform type="password"/> <Submit form=thisform>Submit</Submit> </div> }
Sub-form
You can create sub-form or even sub-form list in your form:
@observable @ field1 = ''; @observable @ field2 = ''; @observable @ field3 = ''; @observable haveSubForm = false; @observable @ subForm = ; @observable @ itemList = ; @action { thisitemList; } @action { thisitemListclear; }