formily/react

448 阅读1分钟

介绍

formily/react里面放的是react相关组件,目的是将其和formily/core绑定状态

功能

  • 实现Field
  • 将form通过context传出去

FormProvider

作为最外层的组件,使用Formcontext向自组组件传递form

import React from 'react'
import { FormContext } from './context'

export default function FormProvider(props) {
  const {form,children} = props
  return (
    <>
  <FormContext.Provider value={form}>{children}</FormContext.Provider>
    </>
  )
}

formily/core来管理数据,将数据变成响应式等操作发生在form的onmount函数中 严格模式下,第二次渲染会使得input被卸载

  useEffect(() => {
    form.onMount()//涉及到挂载
    return () => {
          //严格模式下,第二次渲染会使得input被卸载
    // return () => {
    //   form.onUnmount()//卸载
    // }
    }
  })

Field

  • component属性是其子组件
  • decorator属性里面的formItem需要包裹Field

提供FieldContext给antd的FormItem

  const form = useContext(FormContext)
  const field = form.createField(props)

component是函数组件没有执行所以用createElement来执行一下(decorator同理),将value,onChange赋值变成受控组件

  const component = createElement(field.component[0],{...field.component[1],value:field.value,onchange:field.onInput})
  const decorator = createElement(field.decorator[0],field.decorator[1],component)

此时提交没用,输入也没用,期数就是组件没渲染,要用响应式 observer(Field)

useParentForm(hook)

import React, { useContext } from 'react'
import { FormContext } from './context';

export default function useParentForm() {
  const form = useContext(FormContext)//antdPage使用createForm创建form,通过FormProvider使用FormContext传递
  return form
}