@formily/react
English | 简体中文
@formily/react is based on
reactand @formily/core is already built in. It provide API to manuplate form state and components for rendering support. it mainly includes:
- Form
- Field
- VirtualField
- FormaSpy
- FormProvider
- FormConsumer(deprecated,pls using FormSpy)
- createFormActions (create sync API to manuplate form state)
- createAsyncFormActions (create async API to manuplate form state)
- FormEffectHooks (LifeCycles Hook)
Install
npm install --save @formily/reactTable Of Contents
Usage- Components
- Hook
- API
- Interfaces
IFormImutatorsIFormActionsIFormAsyncActionsIFieldStateIVirtualFieldStateIFormSpyPropsIFieldHookIVirtualFieldHookISpyHookSyncValidateResponseAsyncValidateResponseValidateResponseInternalFormatsCustomValidatorValidateDescriptionValidateArrayRulesValidatePatternRulesIFieldAPIIVirtualFieldAPI
Usage
Quick Start
import React from 'react'import ReactDOM from 'react-dom'import Form Field FormPath createFormActions FormSpy FormProvider FormConsumer FormEffectHooks from '@formily/react' const onFormInit$ onFormInputChange$ onFieldInputChange$ = FormEffectHooksconst actions = const App = return <Form = = = > <React.Fragment> <label>username: </label> <Field ="username"> state mutators <React.Fragment> <input = = = = = /> stateerrors statewarnings </React.Fragment> </Field> </React.Fragment> </Form> ReactDOMBasic Field
Example:Show you how to bind the <input> field and subsequent examples are based on this field
Validation
Example:required validation + error type validation + warning type validation + custom validation The type of rules is ValidatePatternRules which is InternalFormats | CustomValidator | ValidateDescription | ValidateArrayRules
import React from 'react'import ReactDOM from 'react-dom'import Form Field createFormActions from '@formily/react' const actions = const InputField = <Field > state mutators <React.Fragment> <input = = = = = /> <span =>stateerrors</span> <span =>statewarnings</span> </React.Fragment> </Field> const App = return <Form => <h5>required validation</h5> <span>username</span> <InputField ="username" /> <h5>error type validation</h5> <span>age</span> <InputField ="age" = /> <h5>warning type validation</h5> <span>gender</span> <InputField ="gender" = /> <h5>built-in validation default to error type validation</h5> <span>id</span> <InputField ="id" = /> <h5>custom validation</h5> <span>verifyCode</span> <InputField ="verifyCode" = /> <div> <button = > validate </button> </div> </Form> ReactDOMObject Field
Example:User info user(username, age)
import React from 'react'import ReactDOM from 'react-dom'import Form Field createFormActions from '@formily/react' const actions = const InputField = <Field > state mutators <React.Fragment> <input = = = = = /> <span =>stateerrors</span> <span =>statewarnings</span> </React.Fragment> </Field> const App = return <Form => <span>user</span> <Field ="user" = > state mutators return <React.Fragment> Object <button = > + </button> <button = > print </button> </React.Fragment> </Field> </Form> ReactDOMArrayField
Example:Id list
import React from 'react'import ReactDOM from 'react-dom'import Form Field createFormActions from '@formily/react' const actions = const InputField = <Field > state mutators <React.Fragment> <input = = = = = /> <span =>stateerrors</span> <span =>statewarnings</span> </React.Fragment> </Field> const App = return <Form => <Field ="idList" => state mutators return <React.Fragment> statevalue <button =>Add Item</button> </React.Fragment> </Field> </Form> ReactDOMArrayField<Object>
Example:User list
import React from 'react'import ReactDOM from 'react-dom'import Form Field createFormActions from '@formily/react' const actions = const InputField = <Field > state mutators <React.Fragment> <input = = = = = /> <span =>stateerrors</span> <span =>statewarnings</span> </React.Fragment> </Field> const App = return <Form => <Field ="userList" = > state mutators return <React.Fragment> statevalue <button = > Add Item </button> <button = > print </button> </React.Fragment> </Field> </Form> ReactDOMdisplay visible
Example: see how display 与 visible affect values
import React from 'react'import ReactDOM from 'react-dom'import Form Field createFormActions LifeCycleTypes FormSpy from '@formily/react' const InputField = <Field > state mutators const loading = statepropsloading return <React.Fragment> propslabel && <label>propslabel</label> loading ? ' loading... ' : <input = = = = = /> <span =>stateerrors</span> <span =>statewarnings</span> </React.Fragment> </Field> const CheckedField = <Field > state mutators const loading = statepropsloading return <React.Fragment> propslabel && <label>propslabel</label> loading ? ' loading... ' : <input ="checkbox" = = /> <span =>stateerrors</span> <span =>statewarnings</span> </React.Fragment> </Field> const actions = const App = return <Form = = > <div> <CheckedField ="visible" ="visibleTrigger" /> <InputField ="a" ="a" /> </div> <div> <CheckedField ="display" ="displayTrigger" /> <InputField ="b" ="b" /> </div> <FormSpy> state form return <div> JSON </div> </FormSpy> <button = > print </button> </Form> ReactDOMLinkage
Example:Show/hide field and modified props/value by using effects
import React from 'react'import ReactDOM from 'react-dom'import Form Field createFormActions LifeCycleTypes from '@formily/react' const InputField = <Field > state mutators const loading = statepropsloading return <React.Fragment> propslabel && <label>propslabel</label> loading ? ' loading... ' : <input = = = = = /> <span =>stateerrors</span> <span =>statewarnings</span> </React.Fragment> </Field> const CheckedField = <Field > state mutators const loading = statepropsloading return <React.Fragment> propslabel && <label>propslabel</label> loading ? ' loading... ' : <input ="checkbox" = = /> <span =>stateerrors</span> <span =>statewarnings</span> </React.Fragment> </Field> const actions = const App = return <Form = = > <CheckedField ="trigger" ="show/hide" /> <div> <InputField ="a" ="a" /> </div> <div> <InputField ="a-copy" ="a-copy" /> </div> </Form> ReactDOMAsync Linkage
Example:Change dataSource in select asynchronously by effects
import React from 'react'import ReactDOM from 'react-dom'import Form Field createFormActions LifeCycleTypes from '@formily/react' const InputField = <Field > state mutators const loading = statepropsloading return <React.Fragment> propslabel && <label>propslabel</label> loading ? ' loading... ' : <input = = = = = /> <span =>stateerrors</span> <span =>statewarnings</span> </React.Fragment> </Field>const CheckedField = <Field > state mutators const loading = statepropsloading return <React.Fragment> propslabel && <label>propslabel</label> loading ? ' loading... ' : <input ="checkbox" = = /> <span =>stateerrors</span> <span =>statewarnings</span> </React.Fragment> </Field> const SelectField = <Field > state mutators const loading dataSource = = stateprops return <React.Fragment> propslabel && <label>propslabel</label> loading ? ' loading... ' : <select = = = = = > dataSource </select> <span =>stateerrors</span> <span =>statewarnings</span> </React.Fragment> } </Field> const actions = const App = return <Form = = > <CheckedField ="trigger" ="show/reset dataSource" /> <div> <SelectField ="sync-source" ="sync-source" /> </div> <div> <SelectField ="async-source" ="async-source" /> </div> </Form> ReactDOMLinkage Validation
Example:validation when form mounted and re-trigger validation when field change
import React from 'react'import ReactDOM from 'react-dom'import Form Field createFormActions LifeCycleTypes from '@formily/react' const InputField = <Field > state mutators const loading = statepropsloading return <React.Fragment> propslabel && <label>propslabel</label> loading ? ' loading... ' : <input = = = = = /> <span =>stateerrors</span> <span =>statewarnings</span> </React.Fragment> </Field> const actions = const App = return <Form = = > <InputField ="a" ="a" /> <div> <InputField ="a-copy" ="a-copy" /> </div> </Form> ReactDOMComplex Linkage
Example:See how ArrayField communicate with other field by using effects
import React from 'react'import ReactDOM from 'react-dom'import Form Field createFormActions LifeCycleTypes from '@formily/react' const InputField = <Field > state mutators const loading = statepropsloading return <React.Fragment> propslabel && <label>propslabel</label> loading ? ' loading... ' : <input = = = = = /> <span =>stateerrors</span> <span =>statewarnings</span> </React.Fragment> </Field> const actions = const App = return <Form = = > <div> <Field ="trigger" ="show/hide username"> state mutators return <input ="checkbox" = = /> </Field> </div> <div> <Field = ="userList" > state mutators return <React.Fragment> statevalue <button = > Add Item </button> <button = > print </button> </React.Fragment> </Field> </div> </Form> ReactDOMReuse Effects
Make your own reusable effects.
import React from 'react'import ReactDOM from 'react-dom'import Form Field createFormActions FormEffectHooks from '@formily/react' const InputField = <Field > state mutators const loading = statepropsloading return <React.Fragment> propslabel && <label>propslabel</label> loading ? ' loading... ' : <input = = = = = /> <span =>stateerrors</span> <span =>statewarnings</span> </React.Fragment> </Field>const CheckedField = <Field > state mutators const loading = statepropsloading return <React.Fragment> propslabel && <label>propslabel</label> loading ? ' loading... ' : <input ="checkbox" = = /> <span =>stateerrors</span> <span =>statewarnings</span> </React.Fragment> </Field> const onFormMount$ onFieldValueChange$ = FormEffectHooksconst getEffects = const actions = const actions = const App = return <Form = = > <CheckedField ="trigger" ="show/hide" /> <div> <InputField ="a" ="a" /> </div> <div> <InputField ="a-copy" ="a-copy" /> </div> </Form> ReactDOMCombo
Example:Combo value of username and age. Check FormSpy for more inforation.
import React from 'react'import ReactDOM from 'react-dom'import Form Field createFormActions FormSpy from '@formily/react' const actions = const InputField = <Field > state mutators <React.Fragment> <input = = = = = /> <span =>stateerrors</span> <span =>statewarnings</span> </React.Fragment> </Field> const App = return <Form => <label>username</label> <InputField ="username" /> <label>age</label> <InputField ="age" /> <FormSpy> state form return <div> name: form <br /> age: form </div> </FormSpy> </Form> ReactDOMProvide and FormSpy
Dictionary--app |---components |---customFormExample:Cross-file consumption form state, Check FormProvider and FormSpy for more infomation.
import React from 'react'import ReactDOM from 'react-dom'import Form Field createFormActions FormSpy FormProvider from '@formily/react' const actions = const InputField = <Field > state mutators <React.Fragment> <input = = = = = /> <span =>stateerrors</span> <span =>statewarnings</span> </React.Fragment> </Field> const CustomForm = return <Form => <label>username</label> <InputField ="username" /> <label>age</label> <InputField ="age" /> </Form> const App = return <FormProvider> <CustomForm /> <FormSpy> state form return <div> name: form <br /> age: form </div> </FormSpy> </FormProvider> ReactDOMDeconstruction
import React useState from 'react'import ReactDOM from 'react-dom'import Form Field createFormActions FormSpy FormPath from '@formily/react' const actions = const App = return <Form => <label>range input</label> <Field ="[start,end]"> state mutators const start end = statevalue return <div> <label>start</label> <input = = /> <label>end</label> <input = = /> </div> </Field> <button = > set value </button> <FormSpy> state form return <div> Form values: <code> <pre> JSON </pre> </code> </div> </FormSpy> </Form> ReactDOMComplex Deconstruction
import React useState from 'react'import ReactDOM from 'react-dom'import Form Field createFormActions FormSpy FormPath from '@formily/react' const actions = const InputField = <Field > state mutators const loading = statepropsloading return <React.Fragment> propslabel && <label>propslabel</label> loading ? ' loading... ' : <input = = = = = /> <span =>stateerrors</span> <span =>statewarnings</span> </React.Fragment> </Field> const App = return <Form => <Field ="{aa:{bb:{cc:destructor1,dd:[destructor2,destructor3],ee}}}"> state mutators return <div> <button = > set value </button> <div>Field value:</div> <code> <pre>JSON</pre> </code> </div> </Field> <button = > outside set </button> <FormSpy> state form return <div> Form values: <code> <pre> JSON </pre> </code> </div> </FormSpy> </Form> ReactDOMComponents
<Form/>
<Form>Props
<Field/>
<Field>Props
Usage
Example:All type of field
import React from 'react'import ReactDOM from 'react-dom'import Form Field createFormActions from '@formily/react' const actions = const InputField = <Field > state mutators <React.Fragment> <input = = = = = /> <span =>stateerrors</span> <span =>statewarnings</span> </React.Fragment> </Field> const App = return <Form => <div> <h5>Basic Field</h5> <Field ="id"> state mutator return <input = = /> </Field> </div> <div> <h5>Object Field</h5> <Field ="user" = > state mutators return <React.Fragment> Object <button = > + </button> </React.Fragment> </Field> </div> <div> <h5>ArrayField Field</h5> <Field ="idList" => state mutators return <React.Fragment> statevalue <button =>Add Item</button> </React.Fragment> </Field> </div> <div> <h5>ArrayObject Field</h5> <Field ="userList" = > state mutators return <React.Fragment> statevalue <button = > Add Item </button> </React.Fragment> </Field> </div> <button = > print </button> </Form> ReactDOM<VirtualField/>
<VirtualField>Props
Usage
Example:Setting <Layout> size from 100x100 to 200x200
import React from 'react'import ReactDOM from 'react-dom'import Form Field createFormActions VirtualField from '@formily/react' const actions = const InputField = <Field > state mutators <React.Fragment> <input = = = = = /> <span =>stateerrors</span> <span =>statewarnings</span> </React.Fragment> </Field> const Layout = children width = '100px' height = '100px' return <div =>children</div> const App = return <Form => <Field ="user" => state mutator return <VirtualField ="user.layout"> state: layoutState return <Layout = = > <label>username</label> <InputField ="username" /> <label>age</label> <InputField ="age" /> </Layout> </VirtualField> </Field> <button = > change layout </button> </Form> ReactDOM<FormSpy/>
<FormSpy>Props
Usage
Example1: Form state change counter
import React from 'react'import ReactDOM from 'react-dom'import Form Field createFormActions FormSpy LifeCycleTypes from '@formily/react' const actions = const InputField = <Field > state mutators <React.Fragment> <input = = = = = /> <span =>stateerrors</span> <span =>statewarnings</span> </React.Fragment> </Field> const App = return <Form => <label>username</label> <InputField ="username" /> <label>age</label> <InputField ="age" /> <FormSpy = = > state type form return <div>count: statecount || 0</div> </FormSpy> </Form> ReactDOMExample2:Combo
import React from 'react'import ReactDOM from 'react-dom'import Form Field createFormActions FormSpy from '@formily/react' const actions = const InputField = <Field > state mutators <React.Fragment> <input = = = = = /> <span =>stateerrors</span> <span =>statewarnings</span> </React.Fragment> </Field> const App = return <Form => <label>username</label> <InputField ="username" /> <label>age</label> <InputField ="age" /> <FormSpy> state form return <div> name: form <br /> age: form </div> </FormSpy> </Form> ReactDOM<FormProvider/>
Used with FormSpy, often used in Cross-file consumption form state
Usage
import React from 'react'import ReactDOM from 'react-dom'import Form Field createFormActions FormSpy FormProvider from '@formily/react' const actions = const InputField = <Field > state mutators <React.Fragment> <input = = = = = /> <span =>stateerrors</span> <span =>statewarnings</span> </React.Fragment> </Field> const CustomForm = return <Form => <label>username</label> <InputField ="username" /> <label>age</label> <InputField ="age" /> </Form> const App = return <FormProvider> <CustomForm /> <FormSpy> state form return <div> name: form <br /> age: form </div> </FormSpy> </FormProvider> ReactDOM<FormConsumer/>(deprecated,pls using <FormSpy/>)
<FormConsumer>Props
Hook
useFormEffects
Implement local effects by using useFormEffects. Same effect as the example of Linkage Note: The life cycle of the listener starts from
ON_FORM_MOUNT
Signature
import React from 'react'import ReactDOM from 'react-dom'import Form Field createFormActions useFormEffects LifeCycleTypes from '@formily/react' const actions = const InputField = <Field > state mutators const loading = statepropsloading return <React.Fragment> propslabel && <label>propslabel</label> loading ? ' loading... ' : <input = = = = = /> <span =>stateerrors</span> <span =>statewarnings</span> </React.Fragment> </Field> const CheckedField = <Field > state mutators const loading = statepropsloading return <React.Fragment> propslabel && <label>propslabel</label> loading ? ' loading... ' : <input ="checkbox" = = /> <span =>stateerrors</span> <span =>statewarnings</span> </React.Fragment> </Field> const FormFragment = return <React.Fragment> <CheckedField ="trigger" ="show/hide" /> <div> <InputField ="a" ="a" /> </div> <div> <InputField ="a-copy" ="a-copy" /> </div> </React.Fragment> const App = return <Form => <FormFragment /> </Form> ReactDOMuseFormState
使用 useFormState 为自定义组件提供 FormState 扩展和管理能力
签名
用法
import React useRef from 'react'import ReactDOM from 'react-dom'import Form Field VirtualField createFormActions createEffectHook useForm useFormState useFormEffects useFieldState LifeCycleTypes from '@formily/react' const InputField = <Field > state mutators const loading = statepropsloading return <React.Fragment> propslabel && <label>propslabel</label> loading ? ' loading... ' : <input = = = = = /> <span =>stateerrors</span> <span =>statewarnings</span> </React.Fragment> </Field> const actions = const FormFragment = { const formState setFormState = const extendVar = formState return <div> <button = > add </button> <div>count: extendVar</div> </div> } const App = return <Form => <FormFragment /> </Form> ReactDOMuseFieldState
Manage state of custom field by using
useFieldState
Signature
import React useRef from 'react'import ReactDOM from 'react-dom'import Form Field VirtualField createFormActions createEffectHook useForm useFormEffects useFieldState LifeCycleTypes from '@formily/react' const InputField = <Field > state mutators const loading = statepropsloading return <React.Fragment> propslabel && <label>propslabel</label> loading ? ' loading... ' : <input = = = = = /> <span =>stateerrors</span> <span =>statewarnings</span> </React.Fragment> </Field> const changeTab$ = const actions = const TabFragment = { const fieldState setLocalFieldState = const current = fieldState const children dataSource form = props const ref = const update = { form } refcurrent = current const btns = dataSource return btns} const FormTab = { return <VirtualField ="layout_tab"> form return <TabFragment = /> </VirtualField> } const App = return <Form => <FormTab = /> <div> <InputField ="username" ="username" /> <InputField ="age" ="age" /> </div> </Form> ReactDOMuseForm
get IForm instance
Signature
Usage
useField
get IFieldHook instance
Signature
Usage
useVirtualField
get IVirtualFieldHook instance
Signature
Usage
useFormSpy
get ISpyHook instance. Same effect as the first example of FormSpy.
Signature
Usage
API
The API is fully inherited from @formily/core. The specific API of @formily/react is listed below.
createFormActions
Return IFormActions
Signature
createFormActions: IFormActionsUsage
console.logactions.getFieldValue'username'createAsyncFormActions
Return IFormAsyncActions
Signature
createAsyncFormActions: IFormAsyncActionsUsage
actions.getFieldValue'username'.thenconsole.logvalFormEffectHooks
Return all @formily/core lifeCycles hook which can be subscribe
Usage
createEffectHook
Custom your own hook by this api
Signature
Usage
import Form createEffectHook createFormActions from '@formily/react' const actions = const diyHook1$ = const diyHook2$ = const App = return <Form = = > <button = > notify diy1 </button> <button = > notify diy2 </button> </Form> ReactDOMInterfaces
The Interfaces is fully inherited from @formily/core. The specific Interfaces of @formily/react is listed below.
IForm
Form instance object API created by using createForm
Imutators
The instance API created by crewikiutators is mainly used to operate field data.
IFormActions
IFormAsyncActions
IFieldState
IVirtualFieldState
IFormSpyProps
IFieldHook
IVirtualFieldHook
ISpyHook
SyncValidateResponse
declare AsyncValidateResponse
declare ValidateResponse
declare InternalFormats
CustomValidator
declare ValidateDescription
ValidateArrayRules
declare ValidatePatternRules
declare IFieldAPI
IVirtualFieldAPI

