Code Monkey home page Code Monkey logo

react-checkbox-context's Introduction

โš› React Checkbox Context

This package was heavily inspired by react-checkbox-group after it stopped working the way I used it. <Checkbox /> elements suddenly had to be direct children of <CheckboxGroup> (which was impossible for my use case) or the CheckboxGroup explicitly needed to have a checkboxDepth prop (which was not flexible enough for me). So I decided to write my own <CheckboxGroup> component based on React's (then) new Context API.

Big thank you to Ziad Saab for the inspiration!

Installation

npm install react-checkbox-context

or

yarn add react-checkbox-context

Example

What does react-checkbox-context do and how does it do that? Let me borrow the example from react-checkbox-group since the API is mostly identical:

This is your average checkbox group:

<form>
    <input onChange={this.handleFruitChange} type="checkbox" name="fruit" value="apple" /> Apple
    <input onChange={this.handleFruitChange} type="checkbox" name="fruit" value="orange" /> Orange
    <input onChange={this.handleFruitChange} type="checkbox" name="fruit" value="watermelon" />{' '}
    Watermelon
</form>

Repetitive, hard to manipulate and easily desynchronized. Lift up name and onChange, and give the group an initial checked values array:

import { Checkbox, CheckboxGroup } from 'react-checkbox-context';

<CheckboxGroup name="fruits" values={['kiwi', 'pineapple']}>
    <Checkbox value="kiwi" /> Kiwi
    <Checkbox value="pineapple" /> Pineapple
    <Checkbox value="watermelon" /> Watermelon
</CheckboxGroup>;

Since this component uses React's Context API, <Checkbox> elements can by anywhere inside of a <CheckboxGroup> and do not have to be a direct descendant! So this is easily possible without having to specify any checkboxDepth props or the like:

<CheckboxGroup
    name="frameworks"
    onChange={(event, selectedValues) => {
        console.log(selectedValues);
    }}
>
    <p>
        <label htmlFor="react">
            <Checkbox value="react" id="react" /> React
        </label>
    </p>
    <p>
        <label htmlFor="vue">
            <Checkbox value="vue" id="vue" /> Vue
        </label>
    </p>
</CheckboxGroup>

Attention: When migrating from react-checkbox-group please note that the prop name to pass the values to a CheckboxGroup is named values instead of value.

Props

<CheckboxGroup />

Prop Type Description
onChange (event: ChangeEvent, values: string[]) => void Will be called on every time a checkbox changes its state.
name string Name for all checkboxes within one <CheckboxGroup>
values string[] Values of the <Checkbox> elements marked as checked

Status of checkboxes (checked/unchecked) can be controlled from outside by passing new values to <CheckboxGroup> (e.g. <CheckboxGroup values={this.state.checkedItems} />).

<Checkbox />

The Checkbox component passes all of its props the the underlying <input type="checkbox" /> element. All valid HTML attributes can be used with the exception of checked, name, onChange as they will be set by the parent <CheckboxGroup> component.

Todo

  • Add more tests, more specifically a test if onChange events are fired correctly.

License

MIT.

react-checkbox-context's People

Contributors

manuelbieh avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

react-checkbox-context's Issues

Change CheckboxGroup into a fully controlled component

I suggest changing CheckboxGroup into a fully controlled (stateless) component.

The README states:

Status of checkboxes (checked/unchecked) can be controlled from outside by passing new values to <CheckboxGroup> (e.g. <CheckboxGroup values={this.state.checkedItems} />).

This is only true upon initialization. Any changes to this.state.checkedItems afterward will not be applied. For example:

<button onClick={() => this.setState({ checkedItems: [] })}>Clear</button>

<CheckboxGroup name="fruits" values={this.state.checkedItems} onChange={(e, values) => this.setState({ checkedItems: values })}>
   <Checkbox value="kiwi" /> Kiwi
   <Checkbox value="pineapple" /> Pineapple
   <Checkbox value="watermelon" /> Watermelon
</CheckboxGroup>

In this example, I created a button that clears the this.state.checkedItems variable. However, the button does nothing. This is because CheckboxGroup is not stateless and it does not listen for changes to its values property.

If you want to change this behavior, I think the best approach is to make the component stateless (rather than adding depreciated functions like componentWillReceiveProps). I've submitted a pull request which makes the necessary changes to make CheckboxGroup fully controlled.

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.