Skip to content

Commit 62677b4

Browse files
committed
✨ feat(useUpdateLayoutEffect): add useUpdateLayoutEffect hooks
1 parent 94f1215 commit 62677b4

File tree

5 files changed

+111
-2
lines changed

5 files changed

+111
-2
lines changed

Diff for: src/index.ts

+5-2
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import { useTimeout } from './useTimeout';
1111
import { useToggle } from './useToggle';
1212
import { useUnmount } from './useUnmount';
1313
import { useUpdateEffect } from './useUpdateEffect';
14+
import { useUpdateLayoutEffect } from './useUpdateLayoutEffect';
1415

1516
export {
1617
useBoolean,
@@ -24,7 +25,8 @@ export {
2425
useTimeout,
2526
useToggle,
2627
useUnmount,
27-
useUpdateEffect
28+
useUpdateEffect,
29+
useUpdateLayoutEffect
2830
};
2931

3032
export default {
@@ -39,5 +41,6 @@ export default {
3941
useTimeout,
4042
useToggle,
4143
useUnmount,
42-
useUpdateEffect
44+
useUpdateEffect,
45+
useUpdateLayoutEffect
4346
};

Diff for: src/useUpdateLayoutEffect/__demo__/demo01.tsx

+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/**
2+
* title: 基础用法
3+
*/
4+
5+
import React, { useLayoutEffect, useState } from 'react';
6+
import { Button } from 'antd';
7+
import { useUpdateLayoutEffect } from '@pansy/react-hooks';
8+
9+
export default () => {
10+
const [count, setCount] = useState(0);
11+
const [layoutEffectCount, setLayoutEffectCount] = useState(0);
12+
const [updateLayoutEffectCount, setUpdateLayoutEffectCount] = useState(0);
13+
14+
useLayoutEffect(() => {
15+
setLayoutEffectCount((c) => c + 1);
16+
}, [count]);
17+
18+
useUpdateLayoutEffect(() => {
19+
setUpdateLayoutEffectCount((c) => c + 1);
20+
return () => {
21+
// do something
22+
};
23+
}, [count]); // you can include deps array if necessary
24+
25+
return (
26+
<div>
27+
<p>layoutEffectCount: {layoutEffectCount}</p>
28+
<p>updateLayoutEffectCount: {updateLayoutEffectCount}</p>
29+
<p>
30+
<Button onClick={() => setCount((c) => c + 1)}>
31+
reRender
32+
</Button>
33+
</p>
34+
</div>
35+
);
36+
};

Diff for: src/useUpdateLayoutEffect/__tests__/index.test.ts

+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/* eslint-disable max-nested-callbacks */
2+
import { renderHook } from '@testing-library/react-hooks';
3+
import { useUpdateLayoutEffect } from '../index';
4+
5+
describe('useUpdateLayoutEffect', () => {
6+
it('should be defined', () => {
7+
expect(useUpdateLayoutEffect).toBeDefined();
8+
});
9+
10+
it('test on mounted', async () => {
11+
let mountedState = 1;
12+
const hook = renderHook(() =>
13+
useUpdateLayoutEffect(() => {
14+
mountedState = 2;
15+
}),
16+
);
17+
expect(mountedState).toEqual(1);
18+
hook.rerender();
19+
expect(mountedState).toEqual(2);
20+
});
21+
22+
it('test on optional', () => {
23+
let mountedState = 1;
24+
const hook = renderHook(() =>
25+
useUpdateLayoutEffect(() => {
26+
mountedState = 3;
27+
}, [mountedState]),
28+
);
29+
expect(mountedState).toEqual(1);
30+
hook.rerender();
31+
expect(mountedState).toEqual(1);
32+
mountedState = 2;
33+
hook.rerender();
34+
expect(mountedState).toEqual(3);
35+
});
36+
});

Diff for: src/useUpdateLayoutEffect/index.md

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
---
2+
title: useUpdateLayoutEffect
3+
nav:
4+
title: Hooks
5+
path: /hooks
6+
group:
7+
title: Effect
8+
path: /effect
9+
---
10+
11+
# useUpdateLayoutEffect
12+
13+
`useUpdateLayoutEffect` 用法等同于 `useLayoutEffect`,但是会忽略首次执行,只在依赖更新时执行。
14+
15+
## 代码演示
16+
17+
### 基础用法
18+
19+
<code src="./__demo__/demo01.tsx" />
20+
21+
## API
22+
23+
API 与 `React.useLayoutEffect` 完全一致。
24+
25+
```typescript
26+
useUpdateLayoutEffect(
27+
effect: React.EffectCallback,
28+
deps?: React.DependencyList,
29+
)
30+
```

Diff for: src/useUpdateLayoutEffect/index.ts

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import { useLayoutEffect } from 'react';
2+
import { createUpdateEffect } from '../utils/createUpdateEffect';
3+
4+
export const useUpdateLayoutEffect = createUpdateEffect(useLayoutEffect);

0 commit comments

Comments
 (0)