Skip to content

Commit c50b887

Browse files
committed
[IMPL] useMeasure hook
1 parent 3684d8e commit c50b887

7 files changed

Lines changed: 86 additions & 5 deletions

File tree

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import { useMeasure } from "../../../../../../packages/react-tools/src"
2+
3+
/**
4+
The component tracks div element dimensions and display them on screen. Try to resize div to see its current dimensions.
5+
*/
6+
export const UseMeasure = () => {
7+
const [cbRef, state] = useMeasure<HTMLDivElement>();
8+
9+
return <div style={{margin: '0 auto'}}>
10+
<p>Dimensions: {JSON.stringify(state)}</p>
11+
<br />
12+
<div ref={cbRef} style={{margin:'0 auto', width: 100, height: 100, overflow: 'auto', resize: 'both', border: '1px solid lightblue'}}/>
13+
</div>
14+
}

apps/react-tools-demo/src/constants/components.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,8 @@ export const COMPONENTS = [
5555
"useIsOnline",
5656
"useResizeObserver",
5757
"useIntersectionObserver",
58-
"useMutationObserver"
58+
"useMutationObserver",
59+
"useMeasure"
5960
],
6061
//API DOM
6162
[
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
# useMeasure
2+
Hook to measure and track element's dimensions.
3+
4+
## Usage
5+
6+
```tsx
7+
export const UseMeasure = () => {
8+
const [cbRef, state] = useMeasure<HTMLDivElement>();
9+
10+
return <div>
11+
<p>Dimensions: {state.toString()}</p>
12+
<br />
13+
<div ref={cbRef} style={{width: 100, height: 100, resize: 'both', border: '1px solid lightblue'}}>
14+
15+
</div>
16+
</div>
17+
}
18+
```
19+
20+
> The component tracks div element dimensions and display them on screen. Try to resize div to see its current dimensions.
21+
22+
23+
## API
24+
25+
```tsx
26+
useMeasure <T extends Element>(): [React.RefCallback<T>, DOMRectReadOnly]
27+
```
28+
29+
> ### Params
30+
>
31+
>
32+
>
33+
34+
> ### Returns
35+
>
36+
> __result__: a refCallback for target element and a object with target element size.
37+
> - __Array__:
38+
> - _React.RefCallback<T>_
39+
> - _DOMRectReadOnly_
40+
>

packages/react-tools/README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
- [x] useMemoizedFunction
3838
- [x] useMemoCompare
3939
- [x] useMemoDeepCompare
40-
- [ ] useRaf
40+
- [x] useRaf
4141
- [ ] useMergedRef
4242
- [ ] useObjectRef
4343
- [ ] useArrayRef
@@ -58,7 +58,7 @@
5858
- [x] useResizeObserver
5959
- [x] useIntersectionObserver
6060
- [x] useMutationObserver
61-
- [ ] useSize (=useMeasuree?)
61+
- [x] useMeasure
6262
- [ ] useScrollIntoView
6363
- [ ] useMouse
6464
- [ ] useLongPress

packages/react-tools/src/hooks/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,4 +52,5 @@ export { useResizeObserver } from './useResizeObserver';
5252
export { useIntersectionObserver } from './useIntersectionObserver';
5353
export { useMutationObserver } from './useMutationObserver';
5454
export { useIdle } from './useIdle';
55-
export { useRaf } from './useRaf';
55+
export { useRaf } from './useRaf';
56+
export { useMeasure } from './useMeasure';
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import { useCallback, useState } from "react";
2+
import { useResizeObserver } from "."
3+
4+
/**
5+
* **`useMeasure`**: Hook to measure and track element's dimensions.
6+
* @returns {[React.RefCallback<T>, DOMRectReadOnly]} result - a refCallback for target element and a object with target element size.
7+
*/
8+
export const useMeasure = <T extends Element>(): [React.RefCallback<T>, DOMRectReadOnly] => {
9+
const [state, setState] = useState<DOMRectReadOnly>(()=>new DOMRect());
10+
const [cbRef] = useResizeObserver<T>(useCallback((entries) => {
11+
setState(state => {
12+
const dim = entries[0].target.getBoundingClientRect();
13+
if (dim.top !== state.top || dim.left !== state.left || dim.right !== state?.right || dim.bottom !== state.bottom) {
14+
return dim;
15+
}
16+
return state;
17+
});
18+
}, []));
19+
20+
return [
21+
cbRef,
22+
state
23+
]
24+
}

packages/react-tools/src/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,8 @@ export {
6666
useIntersectionObserver,
6767
useMutationObserver,
6868
useIdle,
69-
useRaf
69+
useRaf,
70+
useMeasure
7071
} from './hooks'
7172

7273
export {

0 commit comments

Comments
 (0)