bloom-context-forms
Version:
context-wrapped form functionality for your bloom projects
141 lines (112 loc) • 4.92 kB
Markdown
# Bloom Context Forms
#### A context-only alternative to [bloom-forms](https://github.com/vineyard-bloom/bloom-forms). No Redux here.
## What is this?
Bloom-Context-Forms provides a FormHandler wrapper that manages your internal form state inside React 16's context. All updates, validation, and other hooks are available through connecting your component to the specific Context it consumes.
## Suggested Use
It's suggested to use this package to manage your form state and validation, and use the [Bloom Inputs](https://github.com/vineyard-bloom/bloom-inputs) package for accessible, stylable inputs.
## Features:
- Standardized form value updates, regardless of input type.
- Integrates seamlessly with [bloom-starter](https://github.com/vineyard-bloom/bloom-starter) and [bloom-inputs](https://github.com/vineyard-bloom/bloom-inputs).
- Fully customizable validation. Works through the `<FormHandler>` and independently.
- Tracks any fields passed into `fieldNames`. Allows fully custom inputs without any special wrappers around each of them.
- Smaller size than bloom-forms. Does not depend on Redux.
## Why use Bloom Context Forms?
* Built-in state management
* Built-in error handling
* Built-in form population
* Built-in accessibility
* All field values and errors available through Context
* Unopinionated about contents
* Slim size
* Only dependency is React 16, but values are available anywhere (by default, they are Read Only outside of the form they belong to)
## Includes:
* connectForm (function)
* FormHandler
* getCurrentContext (function)
* validator
## README Contents:
### General:
- [Set Up](https://github.com/vineyard-bloom/bloom-context-forms#set-up)
- [Basic Usage](https://github.com/vineyard-bloom/bloom-context-forms#basic-usage)
- [Contributing](https://github.com/vineyard-bloom/bloom-context-forms#contributing)
### [`FormContext` and its helper methods](https://github.com/vineyard-bloom/bloom-context-forms/blob/master/docs/form-context.md)
### [`<FormHandler />` Wrapper](https://github.com/vineyard-bloom/bloom-context-forms/blob/master/docs/form-handler.md)
### [What Props are passed down to child inputs?](https://github.com/vineyard-bloom/bloom-context-forms/blob/master/docs/children-props.md)
### [Validation & Error Handling](https://github.com/vineyard-bloom/bloom-context-forms/blob/master/docs/validate-as-options.md)
## Setup
To use this package, you can install with either npm or yarn.
```
npm install bloom-context-forms --save
```
or
```
yarn add bloom-context-forms
```
To import the files/components in this package, import like:
```
import { FormHandler, getCurrentContext } from 'bloom-context-forms';
```
## Contributing
Fork this repo, and submit any changes as a PR to master. Accepted PRs will be merged and published to npm.
## Basic Usage
### Container Component:
```
import { FormHandler } from 'bloom-context-forms';
import LoginForm from './login-form';
class LoginFormContainer extends React.Component {
submitForm = async (formData, files, successCallback, failCallback) => {
// submit formData and files
}
validationHelp = {
dictionary: {
'must-equal-bloop': testData =>
testData !== 'bloop' ? 'Sorry, this field has to be "bloop."' : null
}
}
render() {
const fieldNames = ['username', 'password'];
return (
<FormHandler
fieldNames={fieldNames}
id='loginForm'
submitForm={this.submitForm}
validationHelp={this.validationHelp}
>
<LoginForm />
</FormHandler>
)
}
}
```
The above component can be written in the [renderProps](https://reactjs.org/docs/render-props.html) style like so:
```
// same as above
...
render() {
const fieldNames = ['username', 'password'];
return (
<FormHandler
fieldNames={fieldNames}
id='loginForm'
submitForm={this.submitForm}
validationHelp={this.validationHelp}
>
{formHandlerProps => <LoginForm { ...formHandlerProps } />}
</FormHandler>
)
}
}
```
This can be useful when you need to access the props passed down to children directly your Container's render method.
### Form component:
```
import { connectForm } from 'bloom-context-forms';
const LoginForm = () => { ... };
export default connectForm(LoginForm);
```
### Why Two Files?
The distinction between container and presentational component is to separate state and data-calling functionality from markup.
Container: Connects the component to the form context state; Submits data to the API; Updates state as needed
Presentation Component: Uses functionality passed down from parent containers; Focus is purely presentational / view layer
If you don't want to use this method, use the renderProps example above to access your needed methods directly on rendering.
[Back to Contents](https://github.com/vineyard-bloom/bloom-context-forms#readme-contents)