react-resize-aware
Version:
A React hook that makes it possible to listen to element resize events.
103 lines (69 loc) • 3.01 kB
Markdown
# react-resize-aware
It does one thing, it does it well: listens to resize events on any HTML element.
`react-resize-aware` is a zero dependency, **~600 bytes** [React Hook](https://reactjs.org/docs/hooks-reference.html) you can use to detect resize events without relying on intervals, loops, DOM manipulation detection or CSS redraws.
**It takes advantage of the `resize` event on the `HTMLObjectElement`, works on any browser I know of, and it's super lightweight.**
In addition, it doesn't directly alters the DOM, everything is handled by React.
> Looking for the 2.0 docs? [Click here](https://github.com/FezVrasta/react-resize-aware/tree/v2.7.2)
## Installation
```
yarn add react-resize-aware
```
or with npm:
```
npm install --save react-resize-aware
```
## Usage
The API is simple yet powerful, the `useResizeAware` [Hook](https://reactjs.org/docs/hooks-reference.html)
returns a React node you will place inside the measured element, and an object containing its sizes:
```jsx
import React from "react";
import useResizeAware from "react-resize-aware";
const App = () => {
const [resizeListener, sizes] = useResizeAware();
return (
<div style={{ position: "relative" }}>
{resizeListener}
Your content here. (div sizes are {sizes?.width} x {sizes?.height})
</div>
);
};
```
> **Heads up!**: Make sure to assign a `position != initial` to the HTMLElement you want to target (`relative`, `absolute`, or `fixed` will work).
## API
The Hook returns an array with two elements inside:
### `[resizeListener, ...]` (first element)
This is an invisible React node that must be placed as direct-child of the HTMLElement you want to listen the resize events of.
The node is not going to interfer with your layouts, I promise.
### `[..., sizes]` (second element)
This object contains the `width` and `height` properties, it could be `null` if the element is not yet rendered.
## Custom `reporter`
You can customize the properties of the `sizes` object by passing a custom `reporter` function as first argument of `useResizeAware`.
```tsx
const customReporter = (target: ?HTMLIFrameElement) => ({
clientWidth: target != null ? target.clientWidth : 0,
});
const [resizeListener, sizes] = useResizeAware(customReporter);
return (
<div style={{ position: "relative" }}>
{resizeListener}
Your content here. (div clientWidth is {sizes.clientWidth})
</div>
);
```
The above example will report the `clientWidth` rather than the default `offsetWidth` and `offsetHeight`.
## React to size variations
For completeness, below you can find an example to show how to make your code react to size variations using React Hooks:
```jsx
const App = () => {
const [resizeListener, sizes] = useResizeAware();
React.useEffect(() => {
console.log("Do something with the new size values");
}, [sizes.width, sizes.height]);
return (
<div style={{ position: "relative" }}>
{resizeListener}
Your content here.
</div>
);
};
```