React component for handling clicks outside of a component.
npm install --save react-outclick
or
yarn add react-outclick
By default, clicks are detected everywhere outside your component.
import OnOutsiceClick from 'react-outclick';
function App() {
return (
<OnOutsiceClick
onOutsideClick={(ev: Event) => {
alert('You clicked outside of this component!!!');
}}>
Hello World
</OnOutsiceClick>
);
}
If a container
prop is also specified, clicks are only handled if they they happen outside of your component and inside the container
element.
import React from 'react';
import OnOutsiceClick from 'react-outclick';
export default function App() {
const click = () => {
console.log('click');
};
const ref = React.useRef();
return (
<div>
<nav>
<span>Clicks will not be handled here as it is outside the container</span>
</nav>
<main ref={ref}>
{/** Click will be detected here **/}
<div className='App'>
<h1>I am inside container</h1>
<OnOutsiceClick container={ref} onOutsideClick={click}>
<h2>I am inside OutsideClick component</h2>
</OnOutsiceClick>
</div>
</main>
</div>
);
}
Since the OnOutsiceClick
specifically handles clicks outside a specific subtree, children
is expected to be defined. A consumer should also not render the OnOutsiceClick
in the case that children
are not defined.
Note that if you use a Portal
(native or react-portal
) of any sort in the children
, the OnOutsiceClick
will not behave as expected.
The onOutsideClick
prop is also required as without it, the OnOutsiceClick
is basically a heavy-weight <div />
. It takes the relevant clickevent as an arg and gets triggered when the user clicks anywhere outside of the subtree generated by the DOM node.
By default, this library will detect any click
event that happens outside of your react component. But sometimes, you want to
detect event inside a container and outside one of its child. For that you can pass in a container (parent) element react ref as a prop.
By default, the OnOutsiceClick
renders a display: block
<div />
to wrap the subtree defined by children
. If desired, the display
can be set to inline-block
, inline
, flex
, or contents
instead. There is no way not to render a wrapping <div />
.
The type of touch event to detect. By default, it is touchend
.
The type of mouse event to detect. By default, it is click
.
MIT © tusharf5