DEV Community

frustigor
frustigor

Posted on • Edited on

Better Form Programing in React

I have worked on forms for months. During this time, I found it is so complex to finish a form in my project. My team is facing a big system, in which have several forms whose fields logic is very complicated. The form development experience is so bad, makes me thinking more about how to develop form more understandfully.

Finally, I create a library which help react developers to manage form development more easy.

Model

A form will operate some state to store user's selected/input values. However, to use them in UI rendering is not as though. I provide a Model to bind form state.

import { Model, Meta, Enum } from 'tyshemo'

class Name extends Meta {
  static default = 'lucy'
  static type = String
  static required = true
  static hidden = function() {
    return this.sex === 'M'
  }
  static label = 'Name'
}

class Sex extends Meta {
  static default = 'F'
  static type = new Enum(['F', 'M'])
  static label = 'Sex'
}

class Person extends Model {
  static name = Name
  static age = Age

  attrs() {
    return ['label']
  }
}

In Model, you should define properties of form. So that, you can manage your form state more formulatable.

connect

Choose a way to connect a component by react-tyshemo, so that you can arrange your UI.

import { useLocal } from 'react-tyshemo'

export default function MyComponent() {
  const person = useLocal(function() {
    return Person
  })

  // ...
}

Field

To make form works, you may render a form in your component. However, wait for a minute. Each field of form may have its own UX, how to make them work tegother?

In fact, it is easy to find that, a field will need some common information:

  • value: the value to render on screen
  • logic: required, readonly, disabled, hidden
  • extra: label, placeholder
  • handle: the function to update value

As metioned, we can make it easy to implement.

import { useLocal } from 'react-tyshemo'
import { Field } from 'react-tyshemo-form'

export default function MyComponent() {
  const person = useLocal(function() {
    return Person
  })

  return (
    <form>
      <Field model={person} key="name" render={(view) => {
        return (
          <div>
            <label>{view.label} {view.required ? '*' : ''}</label>
            <input 
              type="text" 
              value={view.value} 
              onChange={e => view.onChange(e.target.value)} 
              disabled={view.disabled} 
              readonly={view.readonly} 
              hidden={view.hidden} 
            />
          </div>
        )
      }} />
      <Field model={person} key="age" render={...} />
    </form>
  )
}

We provide a Field component, which use the model instance to render with a view parameter which contains all informations. So that you can operate your form state very clearly.

This is what you may need to operate form in react. A Model, a Field component and a connect function.

Top comments (0)