Skip to content

Commit 06c12d4

Browse files
authored
feat: add useEffectOnce hook
2 parents 08f796a + d2bb09d commit 06c12d4

File tree

6 files changed

+65
-0
lines changed

6 files changed

+65
-0
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@
8383
<br/>
8484
<br/>
8585
- [**Lifecycles**](./docs/Lifecycles.md)
86+
- [`useEffectOnce`](./docs/useEffectOnce.md) &mdash; a modified [`useEffect`](https://reactjs.org/docs/hooks-reference.html#useeffect) hook that only runs once.
8687
- [`useEvent`](./docs/useEvent.md) &mdash; subscribe to events.
8788
- [`useLifecycles`](./docs/useLifecycles.md) &mdash; calls `mount` and `unmount` callbacks.
8889
- [`useRefMounted`](./docs/useRefMounted.md) &mdash; tracks if component is mounted.

docs/useEffectOnce.md

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
# `useEffectOnce`
2+
3+
React lifecycle hook that runs an effect only once.
4+
5+
## Usage
6+
7+
```jsx
8+
import {useEffectOnce} from 'react-use';
9+
10+
const Demo = () => {
11+
useEffectOnce(() => {
12+
console.log('Running effect once on mount')
13+
14+
return () => {
15+
console.log('Running clean-up of effect on unmount')
16+
}
17+
});
18+
19+
return null;
20+
};
21+
```
22+
23+
## Reference
24+
25+
```js
26+
useEffectOnce(effect: EffectCallback);
27+
```
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import {storiesOf} from '@storybook/react';
2+
import * as React from 'react';
3+
import {useEffectOnce} from '..';
4+
import ConsoleStory from './util/ConsoleStory'
5+
import ShowDocs from '../util/ShowDocs';
6+
7+
const Demo = () => {
8+
useEffectOnce(() => {
9+
console.log('Running effect once on mount')
10+
11+
return () => {
12+
console.log('Running clean-up of effect on unmount')
13+
}
14+
});
15+
16+
return <ConsoleStory />;
17+
};
18+
19+
storiesOf('Lifecycles|useEffectOnce', module)
20+
.add('Docs', () => <ShowDocs md={require('../../docs/useEffectOnce.md')} />)
21+
.add('Demo', () => <Demo/>)

src/__stories__/util/ConsoleStory.tsx

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import * as React from 'react';
2+
3+
const ConsoleStory = ({message = 'Open the developer console to see logs'}) => (
4+
<p>{message}</p>
5+
);
6+
7+
export default ConsoleStory

src/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import useDropArea from './useDropArea';
99
import useCounter from './useCounter';
1010
import useCss from './useCss';
1111
import useDebounce from './useDebounce';
12+
import useEffectOnce from './useEffectOnce';
1213
import useEvent from './useEvent';
1314
import useFavicon from './useFavicon';
1415
import useFullscreen from './useFullscreen';
@@ -77,6 +78,7 @@ export {
7778
useCounter,
7879
useCss,
7980
useDebounce,
81+
useEffectOnce,
8082
useEvent,
8183
useFavicon,
8284
useFullscreen,

src/useEffectOnce.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import {useEffect, EffectCallback} from 'react';
2+
3+
const useEffectOnce = (effect: EffectCallback) => {
4+
useEffect(effect, []);
5+
}
6+
7+
export default useEffectOnce;

0 commit comments

Comments
 (0)