Skip to content

Commit a1209bf

Browse files
committed
feat(useInterval): autorun options
1 parent 1ff5214 commit a1209bf

File tree

3 files changed

+67
-7
lines changed

3 files changed

+67
-7
lines changed

README.md

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -228,10 +228,11 @@ const Demo = ({ value: Object }) => {
228228

229229
Handle the setInterval timer function.
230230

231-
| option | type | default | explain |
232-
| ------ | -------- | ------- | --------------------------------------- |
233-
| fn | function | - | Handle function. (setInterval callback) |
234-
| delay | number | - | setInterval ms. |
231+
| option | type | default | explain |
232+
| --------------- | -------- | ------- | --------------------------------------- |
233+
| fn | function | - | Handle function. (setInterval callback) |
234+
| delay | number | - | setInterval ms. |
235+
| options.autorun | boolean | true | Runs automatically when mounted |
235236

236237
| return | type | default | explain |
237238
| ------ | ----------------- | ------- | --------------------------------- |

src/useInterval.ts

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@ import useUnmount from "./useUnmount";
44

55
export type ETimerState = "idle" | "running";
66

7+
export type UseIntervalOptions = {
8+
/** Runs automatically when mounted. @default true */
9+
autorun?: boolean;
10+
};
11+
712
/**
813
* useInterval
914
*
@@ -12,8 +17,10 @@ export type ETimerState = "idle" | "running";
1217
*/
1318
export default function useInterval(
1419
fn: () => void,
15-
delay?: number
20+
delay?: number,
21+
options?: UseIntervalOptions
1622
): { state: ETimerState; cancel: () => void; run: () => void } {
23+
const { autorun = true } = options || {};
1724
const timer = useRef<ReturnType<typeof setTimeout>>();
1825
const fnRef = useRef<() => void>();
1926

@@ -51,8 +58,10 @@ export default function useInterval(
5158
cancel();
5259
}
5360

54-
run();
55-
}, [delay, cancel, run]);
61+
if (autorun) {
62+
run();
63+
}
64+
}, [delay, cancel, run, autorun]);
5665

5766
useUnmount(cancel);
5867

tests/useInterval.test.ts

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,56 @@ describe("useInterval", () => {
175175
expect(count).toBe(3);
176176
});
177177

178+
it("options: autoRun", () => {
179+
const fn = jest.fn();
180+
const { rerender, result, unmount } = renderHook(() =>
181+
useInterval(fn, 100, { autorun: false })
182+
);
183+
184+
rerender();
185+
expect(fn).toHaveBeenCalledTimes(0);
186+
expect(result.current.state).toEqual("idle");
187+
188+
jest.advanceTimersByTime(100);
189+
expect(fn).toHaveBeenCalledTimes(0);
190+
expect(result.current.state).toEqual("idle");
191+
192+
rerender();
193+
rerender();
194+
rerender();
195+
jest.advanceTimersByTime(100);
196+
expect(fn).toHaveBeenCalledTimes(0);
197+
expect(result.current.state).toEqual("idle");
198+
199+
act(() => {
200+
result.current.run();
201+
});
202+
203+
expect(fn).toHaveBeenCalledTimes(0);
204+
expect(result.current.state).toEqual("running");
205+
jest.advanceTimersByTime(100);
206+
expect(fn).toHaveBeenCalledTimes(1);
207+
expect(result.current.state).toEqual("running");
208+
jest.advanceTimersByTime(100);
209+
expect(fn).toHaveBeenCalledTimes(2);
210+
expect(result.current.state).toEqual("running");
211+
212+
act(() => {
213+
result.current.cancel();
214+
});
215+
expect(result.current.state).toEqual("idle");
216+
217+
jest.advanceTimersByTime(100);
218+
expect(fn).toHaveBeenCalledTimes(2);
219+
expect(result.current.state).toEqual("idle");
220+
221+
unmount();
222+
223+
jest.advanceTimersByTime(100);
224+
expect(fn).toHaveBeenCalledTimes(2);
225+
expect(result.current.state).toEqual("idle");
226+
});
227+
178228
it("Unmount", () => {
179229
const fn = jest.fn();
180230
const { result, rerender, unmount } = renderHook(() =>

0 commit comments

Comments
 (0)