mirror of
https://github.com/streamich/react-use.git
synced 2025-12-08 18:02:14 +00:00
useEffectOnce
This commit is contained in:
parent
94b4ea9d3e
commit
84973de1a1
@ -83,6 +83,7 @@
|
||||
<br/>
|
||||
<br/>
|
||||
- [**Lifecycles**](./docs/Lifecycles.md)
|
||||
- [`useEffectOnce`](./docs/useEffectOnce.md) — a modified [`useEffect`](https://reactjs.org/docs/hooks-reference.html#useeffect) hook that only runs once.
|
||||
- [`useEvent`](./docs/useEvent.md) — subscribe to events.
|
||||
- [`useLifecycles`](./docs/useLifecycles.md) — calls `mount` and `unmount` callbacks.
|
||||
- [`useRefMounted`](./docs/useRefMounted.md) — tracks if component is mounted.
|
||||
|
||||
27
docs/useEffectOnce.md
Normal file
27
docs/useEffectOnce.md
Normal 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);
|
||||
```
|
||||
21
src/__stories__/useEffectOnce.story.tsx
Normal file
21
src/__stories__/useEffectOnce.story.tsx
Normal 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/>)
|
||||
7
src/__stories__/util/ConsoleStory.tsx
Normal file
7
src/__stories__/util/ConsoleStory.tsx
Normal 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
|
||||
@ -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
14
src/useEffectOnce.ts
Normal 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;
|
||||
Loading…
x
Reference in New Issue
Block a user