useEffectOnce

This commit is contained in:
Ward Oosterlijnck 2019-03-31 17:58:44 +11:00
parent 94b4ea9d3e
commit 84973de1a1
6 changed files with 72 additions and 0 deletions

View File

@ -83,6 +83,7 @@
<br/>
<br/>
- [**Lifecycles**](./docs/Lifecycles.md)
- [`useEffectOnce`](./docs/useEffectOnce.md) &mdash; a modified [`useEffect`](https://reactjs.org/docs/hooks-reference.html#useeffect) hook that only runs once.
- [`useEvent`](./docs/useEvent.md) &mdash; subscribe to events.
- [`useLifecycles`](./docs/useLifecycles.md) &mdash; calls `mount` and `unmount` callbacks.
- [`useRefMounted`](./docs/useRefMounted.md) &mdash; tracks if component is mounted.

27
docs/useEffectOnce.md Normal file
View File

@ -0,0 +1,27 @@
# `useEffectOnce`
React lifecycle hook that runs an effect only once.
## Usage
```jsx
import {useEffectOnce} from 'react-use';
const Demo = () => {
useEffectOnce(() => {
console.log('Running effect once on mount')
return () => {
console.log('Running clean-up of effect on unmount')
}
});
return null;
};
```
## Reference
```js
useEffectOnce(effect: EffectCallback);
```

View File

@ -0,0 +1,21 @@
import {storiesOf} from '@storybook/react';
import * as React from 'react';
import {useEffectOnce} from '..';
import ConsoleStory from './util/ConsoleStory'
import ShowDocs from '../util/ShowDocs';
const Demo = () => {
useEffectOnce(() => {
console.log('Running effect once on mount')
return () => {
console.log('Running clean-up of effect on unmount')
}
});
return <ConsoleStory />;
};
storiesOf('Lifecycles|useEffectOnce', module)
.add('Docs', () => <ShowDocs md={require('../../docs/useEffectOnce.md')} />)
.add('Demo', () => <Demo/>)

View File

@ -0,0 +1,7 @@
import * as React from 'react';
const ConsoleStory = ({message = 'Open the developer console to see logs'}) => (
<p>{message}</p>
);
export default ConsoleStory

View File

@ -9,6 +9,7 @@ import useDropArea from './useDropArea';
import useCounter from './useCounter';
import useCss from './useCss';
import useDebounce from './useDebounce';
import useEffectOnce from './useEffectOnce';
import useEvent from './useEvent';
import useFavicon from './useFavicon';
import useFullscreen from './useFullscreen';
@ -77,6 +78,7 @@ export {
useCounter,
useCss,
useDebounce,
useEffectOnce,
useEvent,
useFavicon,
useFullscreen,

14
src/useEffectOnce.ts Normal file
View File

@ -0,0 +1,14 @@
import {useRef, useEffect, EffectCallback} from 'react';
const useEffectOnce = (effect: EffectCallback) => {
const didRun = useRef(false);
useEffect(() => {
if (!didRun.current) {
didRun.current = true;
return effect();
}
});
}
export default useEffectOnce;