react-clickout-ts
Version:
A simple clickout handler for React
90 lines (65 loc) • 3.5 kB
Markdown
A React component to handle click-outside behavior for elements. Perfect for modals, dropdowns, and other overlay components.
[](https://www.npmjs.com/package/react-clickout-ts)
[](https://opensource.org/licenses/MIT)
- TypeScript-first implementation
- Handle click outside for single or multiple elements
- Ignore specific elements from triggering click-out
- Customizable event triggers
- Zero dependencies
```sh
yarn add react-clickout-ts
```
or
```sh
npm install --save react-clickout-ts
```
```js
import React from 'react';
import { ClickOutHandler } from 'react-clickout-ts';
const Modal = () => {
const handleClickOut = () => {
console.log('Close modal!');
};
return (
<ClickOutHandler onClickOut={handleClickOut}>
<div className="modal">This is a modal! Click outside to close it.</div>
</ClickOutHandler>
);
};
```
| Prop | Type | Required | Default | Description |
| ----------------- | --------------------- | -------- | ----------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
| `children` | `ReactNode` | true | | The element(s) you want to trigger the `onClickOut` callback when clicked outside of |
| `enabled` | `boolean` | false | `true` | Enables or disables the clickout behavior. This can be useful to ensure the `onClickOut` callback is only executed when you want it to be. |
| `events` | `string[]` | false | `['mousedown', 'touchstart']` | Allows for specifying custom events to trigger the `onClickOut` callback |
| `ignoredElements` | `HTMLElement[]` | false | `[]` | An array of refs for elements to exclude from triggering the clickout behavior |
| `onClickOut` | `(ev: Event) => void` | true | | Function to be called when the clickout behavior is triggered. Receives the click event as an argument. |
If there are any elements outside of your ClickOutHandler component that you do not want to trigger the clickout behavior when clicked, you can pass a ref to the `ignoredElements` prop.
```js
import { useRef, useState } from 'react'
import { ClickOutHandler } from 'react-clickout-ts'
const Component = () => {
const ignoreRef = useRef<HTMLElement>(null)
const handleClickOutside = (ev: Event) => {
console.log('Clicked outside')
}
return (
<div>
<div ref={ignoreRef}>This should be ignored!</div>
<ClickOutHandler ignoredElements={[ignoreRef.current]} onClickOut={handleClickOutside}>
<div>Content goes here</div>
</ClickOutHandler>
</div>
)
}
```
MIT