Giter Site home page Giter Site logo

h0m3brew / formik-effect Goto Github PK

View Code? Open in Web Editor NEW

This project forked from jaredpalmer/formik-effect

0.0 0.0 0.0 176 KB

Declarative component for managing side-effects in Formik forms. 580 bytes

Home Page: https://npm.im/formik-effect

License: MIT License

JavaScript 47.81% TypeScript 52.19%

formik-effect's Introduction

Formik Effect

Declarative Formik component for side-effects. Use with caution. Please. I. beg. you.

npm install formik-effect --save

Note: this has peer dependencies of prop-types, react, and formik (obvs)

The Problem

Formik is an uncontrolled component. However, there are times when you want to trigger a side effect based on a state change. By design, Formik does not expose a prop for you to do this because I'm terrified as to how it would be abused--it encourages people to attempt to "sync" Formik's state in elsewhere (cough like in a Redux store cough cough). Anyways, please don't do that. You never ever ever ever want to store the same state in 2 places in a React application because it is almost impossible to keep them in sync unless you are a goddamn jedi. You may think it's working, and high five a teammate, but you are a just a lifecycle method away from lots and lots of pain and I can guarantee you are not considering all the edge cases. Sooooo....

SAY IT WITH ME:

"I WILL NOT USE THIS TO STORE FORMIK STATE ELSEWHERE IN MY APP."
"I WILL NOT USE THIS TO STORE FORMIK STATE ELSEWHERE IN MY APP."
"I WILL NOT USE THIS TO STORE FORMIK STATE ELSEWHERE IN MY APP."

Basic Usage

Import the <Effect > component and put it inside any Formik form. It renders null! Pass it an onChange() function and it will be called whenever your Formik form's state updates.

import React from 'react'
import { Formik, Field, Form } from 'formik'
import { Effect } from 'formik-effect'

export const Signup = () =>
  <div>
    <h1>My Cool Form with a SideEffect</h1>
    <Formik
      onSubmit={values => console.log(values)}
      initialValues={{ firstName: '', lastName: '', email: '' }}
      render={props =>
        <Form className="whatever">
          <Effect onChange={(currentFormikState, nextFormikState) => {
               // do whatevs
               // FYI if you alter state it will cause another render
            }} 
          />
          <Field name="firstName" placeholder="First Name" />
          <Field name="lastName" placeholder="Last Name" />
          <Field name="email" type="email" placeholder="Email Address" />
          <button type="submit">Submit</button>
         
        </Form>}
    />
  </div>;

API

Only one!

onChange: (currentState: FormikState<Values>, nextState: FormikState<Values> => void

Put your side effect here.

FormikState includes:

  • values
  • errors
  • touched
  • isSubmitting

Under the hood this calls componentWillReceiveProps(). When Formik refactors for React 16.3, it will use componentDidUpdate. Either way, it does shallow comparison on context with triple equals, which may not be what you want. Luckily, this whole component is like 500 bytes so you could just copy pasta it into your app.

Future Work

When Formik is updated to React 16.3, this library will need to be updated for use without PropTypes.

Author

formik-effect's People

Contributors

jaredpalmer avatar erikras avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.