Skip to content

Higher Order Component providing clickout functionality for React components

License

Notifications You must be signed in to change notification settings

danielmoi/react-clickout

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Dec 28, 2018
1ceefbd · Dec 28, 2018

History

73 Commits
Dec 20, 2018
Dec 15, 2018
Jan 21, 2017
Jan 22, 2017
Dec 15, 2018
Dec 15, 2018
Jan 16, 2017
Dec 15, 2018
Jan 16, 2017
Jan 24, 2017
Dec 28, 2018
Dec 20, 2018
Dec 15, 2018
Dec 15, 2018

Repository files navigation

React Clickout

Higher Order Component providing clickout functionality for React components.

Build Status npm version

Installation

With Yarn:

yarn add react-clickout

With NPM:

npm install react-clickout

Usage

react-clickout returns a Higher Order Component that wraps a provided component with the ability to detect a click event outside of that component.

Such a "clickout" event will call the wrapped component's handleClickout method. (Note the character casing.)

See the test suite for more detailed example usage.

import React, { Component } from 'react';
import wrapWithClickout from 'react-clickout';

class ToWrap extends Component {
  constructor() {
    ...
    this.state = {
      isVisible: true,
    };
  }
  handleClickout() {
    this.setState({
      isVisible: false,
    });
  }

  toggleVisible() {
    this.setState({
      isVisible: !this.state.isVisible,
    });
  }

  render() {
    return (
      <div className="to-wrap__container">

        {this.state.isVisible
          ?
            <div className="box" />
          :
            null
        }

        <button onClick={this.toggleVisible} >
          Toggle Box
        </button>

      </div>
    );
  }
}

export default wrapWithClickout(ToWrap);

Excluding elements from calling handleClickout

  • it is possible to prevent the handleClickout method from being called
  • the elements (outside the component wrapped with react-clickout) to be excluded should be marked with the data-react-clickout attribute with the value exclude
<div data-react-clickout="exclude" />

Details

  • React Clickout uses higher order functions (instead of using mixins)
  • React Clickout also uses callback refs (instead of ReactDOM.findDOMNode) (which will eventually be deprecated (see here and here))

Tests

With Yarn:

yarn run test

With NPM:

npm run test

Credits

Initially a fork from react-click-outside.

Thanks to Dan Abramov for the solution of using callback refs.

Licence

Apache-2.0

About

Higher Order Component providing clickout functionality for React components

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published