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

react-fluid-form

v1.0.6

Published

Forms to react applications that combines mobx with context api

Downloads

80

Readme

Reactive forms for react and react native, using hooks and Mobx@6

npm version downloads

Installation:

npm install -s react-fluid-form mobx mobx-react yup lodash
// or:
yarn add react-fluid-form mobx mobx-react yup lodash

Inspiration

I made this library for particular use, because some libraries I used did not satisfy me: formik, mobx-react-form, unform. Some features are inspired by these libs.

The purpose of this library is to be easy to use, with hooks and mobx, which in my use proved to be more performative. Validation is completely optional and customizable. I hope it helps who needs something like this.

I used Mobx for store the state (https://mobx.js.org)

Edit fluid-form-example

Quick start

Table of Contents

1. Initial configuration

1.1 Define components

First, you need to create a bind components object, that tells to library how pass props to field component (like <input />):


const components = {
  textInput: {
    asValue: "value", // how pass value to field (default is "value")
    asChange: ["onChange", ev => ev.target.value], // event for onChange (default is "onChange")
    defaultValue: "", 
    type: String,
    asBlur: ["onBlur"] // event for onBlur (default is "onBlur")
  },
  checkbox: {
    asValue: "checked",
    asChange: ["onSelect"],
    defaultValue: false,
    type: Boolean
  }
}

1.2 Add <FormProvider />

After, you need wrap root component with <FormProvider />, and pass components:

import { FormProvider } form 'react-fluid-form'

function App() {
  return <FormProvider components={components}>
    // ...your code
  </FormProvider>
}

2. Create your form

2.1 Call useForm hook

Now, you need call useForm inside your component, that instantiate the form. With instance, you can get the result values, errors, validate programmatically, check validation, and more.

import { useForm } form 'react-fluid-form'

function MyForm() {
  const form = useForm({
    initialValues: {

    } // optional
  })
}

2.2 Validate the form

Optionally, pass the validator. React fluid form, by default, uses yup for validation, but you can create your custom validator, or use other libraries. There is no need to use react-fluid-form with validation, just you want.

Example code:

import {useYupValidator, useForm} form 'react-fluid-form'
import * as yup form 'yup'

// Inside component:

// Using yup:
const schema = yup.object().shape({
  person: yup.object({
    name: yup.string().required()
  }).required()
})

const validator = useYupValidator(schema)
const form = useForm({ validator })



// Custom validator:
const validator = function(path, values) {
  // params example: 
  // path: "person.name"
  // values: {person: {name: ""}}

  const { person: {name} } = values

  // If path is undefined, react-fluid-form is validating entire form
  if(path) {
    // validating specific path of form
    if(path === "person.name" && name) { 
      return "Name of person is required"
    }
    return ""
  } 

  // validating entire form
  if(!name) {
    return {
      "person.name": "Name of person is required"
    }
  }
}

2.3 Wrap your component with <Form />

import {useForm, Form, Field} form 'react-fluid-form'

function MyForm() {
  const form = useForm()
  
  return <Form
    form={form}
    validateOnBlur // to validate path on blur the field
    validateOnChange // to validate path on change
  >
    // ...
  </Form>
}

2.3 Wrap your field with <Field />

import {useForm, Form, Field} form 'react-fluid-form'
import {observer} form 'mobx-react'

function MyForm() {
  const form = useForm()
  
  return <Form
    form={form}
    validateOnBlur // to validate path on blur the field
  >
    <Field
      path={"person.name"}
      use={"textInput"}
    >
      <input placeholder={"Name"} />
    </Field>
  </Form>
}

// Important: for use form instance properties, wrap MyForm in observer (of mobx-react - https://github.com/mobxjs/mobx-react):
export default observer(MyForm)

To show the error on screen, Field pass "error" prop forward. So, you can render in custom input component

3. Form instance

Form instance has some helper properties and methods:

| Prop/Method | Return type | Description | | :------------------------------- | :---------: | :----------------------------------: | | form.isValid | boolean | Check if the form is valid | | form.result | object | Get values to save, without mobx observable | | form.errors | object | Errors object | | form.validateAll() | void | Validate entire form | | form.validatePath(path) | void | Validate path of form | | form.setValues(values) | void | Pass new values to form | | form.setPathValue(path, value, validate) | void | Set value for specific path | | form.setPathError(path, error) | void | Set error for specific path | | form.mergeValues(values) | void | Merge values with new values to form | | form.clear() | void | Clear form, with initialValues | | form.clearErrors() | void | Clear errors |

4. Hooks

Now, we have useFormChangeEffect hook. Use when you need to call a function, reacting to a change in the value of a field.


useFormChangeEffect((name) => {
  console.log("Name changed: ", name)
}, "name", [])

Contributions

All contributions are welcome. Just make a PR.