diff --git a/README.md b/README.md index 8a7bdeccfe..81d71f12a6 100644 --- a/README.md +++ b/README.md @@ -110,6 +110,7 @@ - [`useMount`](./docs/useMount.md) — calls `mount` callbacks. - [`useUnmount`](./docs/useUnmount.md) — calls `unmount` callbacks. - [`useUpdateEffect`](./docs/useUpdateEffect.md) — run an `effect` only on updates. + - [`useIsomorphicLayoutEffect`](./docs/useIsomorphicLayoutEffect.md) — `useLayoutEffect` that does not show warning when server-side rendering. - [`useDeepCompareEffect`](./docs/useDeepCompareEffect.md) — run an `effect` depending on deep comparison of its dependencies

diff --git a/docs/useIsomorphicLayoutEffect.md b/docs/useIsomorphicLayoutEffect.md new file mode 100644 index 0000000000..11620a5d02 --- /dev/null +++ b/docs/useIsomorphicLayoutEffect.md @@ -0,0 +1,24 @@ +# `useIsomorphicLayoutEffect` + +`useLayoutEffect` that does not show warning when server-side rendering, see [Alex Reardon's article](https://medium.com/@alexandereardon/uselayouteffect-and-ssr-192986cdcf7a) for more info. + +## Usage + +```jsx +import {useIsomorphicLayoutEffect} from 'react-use'; + +const Demo = ({value}) => { + useIsomorphicLayoutEffect(() => { + window.console.log(value) + }, [value]); + + return null; +}; +``` + + +## Reference + +```ts +useIsomorphicLayoutEffect(effect: EffectCallback, deps?: ReadonlyArray | undefined); +``` diff --git a/src/__stories__/useIsomorphicLayoutEffect.story.tsx b/src/__stories__/useIsomorphicLayoutEffect.story.tsx new file mode 100644 index 0000000000..0907d68585 --- /dev/null +++ b/src/__stories__/useIsomorphicLayoutEffect.story.tsx @@ -0,0 +1,7 @@ +import { storiesOf } from '@storybook/react'; +import * as React from 'react'; +import ShowDocs from './util/ShowDocs'; + +storiesOf('Lifecycle|useIsomorphicLayoutEffect', module).add('Docs', () => ( + +)); diff --git a/src/index.ts b/src/index.ts index 69002fa119..dd3723874f 100644 --- a/src/index.ts +++ b/src/index.ts @@ -25,6 +25,7 @@ import useGetSetState from './useGetSetState'; import useHover from './useHover'; import useHoverDirty from './useHoverDirty'; import useIdle from './useIdle'; +import useIsomorphicLayoutEffect from './useIsomorphicLayoutEffect'; import useKey from './useKey'; import useKeyboardJs from './useKeyboardJs'; import useKeyPress from './useKeyPress'; @@ -102,6 +103,7 @@ export { useHover, useHoverDirty, useIdle, + useIsomorphicLayoutEffect, useKey, useKeyboardJs, useKeyPress, diff --git a/src/useIsomorphicLayoutEffect.ts b/src/useIsomorphicLayoutEffect.ts index 3e079ab1af..b285db7843 100644 --- a/src/useIsomorphicLayoutEffect.ts +++ b/src/useIsomorphicLayoutEffect.ts @@ -1,9 +1,5 @@ import { useEffect, useLayoutEffect } from 'react'; -/** - * `useLayoutEffect` that does not show warning on server. - * See: https://medium.com/@alexandereardon/uselayouteffect-and-ssr-192986cdcf7a - */ const useIsomorphicLayoutEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect; export default useIsomorphicLayoutEffect;