npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

rc-field-form-fresh

v0.0.1

Published

React Form Component

Downloads

3

Readme

rc-field-form

React Performance First Form Component.

NPM version build status Test coverage node version npm download

Development

npm install
npm start
open http://localhost:9001/

Feature

Install

rc-field-form

Usage

import Form, { Field } from 'rc-field-form';

<StateForm
  onFinish={values => {
    console.log('Finish:', values);
  }}
>
  <Field name="username">
    <Input placeholder="Username" />
  </Field>
  <Field name="password">
    <Input placeholder="Password" />
  </Field>

  <button>Submit</button>
</StateForm>;

export default Demo;

API

We use typescript to create the Type definition. You can view directly in IDE. But you can still check the type definition here.

Form

| Prop | Description | Type | Default | | --- | --- | --- | --- | | fields | Control Form fields status. Only use when in Redux | FieldData[] | - | | form | Set form instance created by useForm | FormInstance | Form.useForm() | | initialValues | Initial value of Form | Object | - | | name | Config name with FormProvider | string | - | | validateMessages | Set validate message template | ValidateMessages | - | | onFieldsChange | Trigger when any value of Field changed | (changedFields, allFields): void | - | | onValuesChange | Trigger when any value of Field changed | (changedValues, values): void | - |

Field

| Prop | Description | Type | Default | | --- | --- | --- | --- | | dependencies | Will re-render if dependencies changed | NamePath[] | - | | name | Field name path | NamePath | - | | rules | Validate rules | Rule[] | - | | shouldUpdate | Check if Field should update | (prevValues, nextValues): boolean | - | | trigger | Collect value update by event trigger | string | onChange | | validateTrigger | Config trigger point with rule validate | string | string[] | onChange |

List

| Prop | Description | Type | Default | | --- | --- | --- | --- | | name | List field name path | NamePath[] | - | | children | Render props for listing fields | (fields: { name: NamePath }[], operations: ListOperations): ReactNode | - |

useForm

Form component default create an form instance by Form.useForm. But you can create it and pass to Form also. This allow you to call some function on the form instance.

const Demo = () => {
  const [form] = Form.useForm();
  return <Form form={form} />;
};

For class component user, you can use ref to get form instance:

class Demo extends React.Component {
  setRef = form => {
    // Form instance here
  };

  render() {
    return <Form ref={this.setRef} />;
  }
}

| Prop | Description | Type | | --- | --- | --- | | getFieldValue | Get field value by name path | (name: NamePath) => any | | getFieldsValue | Get list of field values by name path list | (nameList?: NamePath[]) => any | | getFieldError | Get field errors by name path | (name: NamePath) => string[] | | getFieldsError | Get list of field errors by name path list | (nameList?: NamePath[]) => FieldError[] | | isFieldsTouched | Check if list of fields are touched | (nameList?: NamePath[]) => boolean | | isFieldTouched | Check if a field is touched | (name: NamePath) => boolean | | isFieldValidating | Check if a field is validating | (name: NamePath) => boolean | | resetFields | Reset fields status | (fields?: NamePath[]) => void | | setFields | Set fields status | (fields: FieldData[]) => void | | setFieldsValue | Set fields value | (values) => void | | validateFields | Trigger fields to validate | (nameList?: NamePath[], options?: ValidateOptions) => Promise |

FormProvider

| Prop | Description | Type | Default | | --- | --- | --- | --- | | validateMessages | Config global validateMessages template | ValidateMessages | - | | onFormChange | Trigger by named form fields change | (name, { changedFields, forms }) => void | - |

Interface

NamePath

| Type | | ---------------------------------------- | | string | number | (string | number)[] |

FieldData

| Prop | Type | | ---------- | ---------------------------------------- | | touched | boolean | | validating | boolean | | errors | string[] | | name | string | number | (string | number)[] | | value | any |

Rule

| Prop | Type | | --- | --- | | enum | any[] | | len | number | | max | number | | message | string | | min | number | | pattern | RegExp | | required | boolean | | transform | (value) => any | | type | string | | validator | (rule, value, callback: (error?: string) => void, form) => Promise | void | | whitespace | boolean | | validateTrigger | string | string[] |

validator

To keep sync with rc-form legacy usage of validator, we still provides callback to trigger validate finished. But in rc-field-form, we strongly recommend to return a Promise instead.

ListOperations

| Prop | Type | | ------ | ----------------------- | | add | () => void | | remove | (index: number) => void |

ValidateMessages

Validate Messages provides a list of error template. You can ref here for fully default templates.

| Prop | Description | | ------- | ------------------- | | enum | Rule enum prop | | len | Rule len prop | | max | Rule max prop | | min | Rule min prop | | name | Field name | | pattern | Rule pattern prop | | type | Rule type prop |

Different with rc-form

rc-field-form is try to keep sync with rc-form in api level, but there still have something to change:

🔥 Remove Field will not clean up related value

We do lots of logic to clean up the value when Field removed before. But with user feedback, remove exist value increase the additional work to keep value back with conditional field.

🔥 Nest name use array instead of string

In rc-form, we support like user.name to be a name and convert value to { user: { name: 'Bamboo' } }. This makes '.' always be the route of variable, this makes developer have to do additional work if name is real contains a point like app.config.start to be app_config_start and parse back to point when submit.

Field Form will only trade ['user', 'name'] to be { user: { name: 'Bamboo' } }, and user.name to be { ['user.name']: 'Bamboo' }.

🔥 getFieldsError always return array

rc-form returns null when no error happen. This makes user have to do some additional code like:

(form.getFieldsError('fieldName') || []).forEach(() => {
  // Do something...
});

Now getFieldsError will return [] if no errors.

🔥 Remove callback with validateFields

Since ES8 is support async/await, that's no reason not to use it. Now you can easily handle your validate logic:

async function() {
  try {
    const values = await form.validateFields();
    console.log(values);
  } catch (errorList) {
    errorList.forEach(({ name, errors }) => {
      // Do something...
    });
  }
}

Notice: Now if your validator return an Error(message), not need to get error by e => e.message. FieldForm will handle this.

🔥 preserve is no need anymore

In rc-form you should use preserve to keep a value cause Form will auto remove a value from Field removed. Field Form will always keep the value in the Form whatever Field removed.

🔥 setFields not trigger onFieldsChange and setFieldsValue not trigger onValuesChange

In rc-form, we hope to help user auto trigger change event by setting to make redux dispatch easier, but it's not good design since it makes code logic couping.

Additionally, user control update trigger onFieldsChange & onValuesChange event has potential dead loop risk.