Skip to content

Commit 7819453

Browse files
authored
useEffect、useCallbackに使う値にuseMemoを用いる (#57)
1 parent 73363b5 commit 7819453

File tree

4 files changed

+30
-17
lines changed

4 files changed

+30
-17
lines changed

package-lock.json

Lines changed: 2 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
"types": "dist/index.d.ts",
1919
"dependencies": {
2020
"body-scroll-lock": "^3.1.5",
21-
"deepmerge": "^4.2.2",
2221
"focus-trap": "^7.0.0"
2322
},
2423
"devDependencies": {

src/components/Modal.tsx

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { Options as FocusTrapOptions } from 'focus-trap';
2-
import React, { useRef } from 'react';
2+
import React, { useMemo, useRef } from 'react';
33
import { createPortal } from 'react-dom';
44
import { ModalProps, OverlayProps, WrapperProps } from '..';
55

@@ -34,11 +34,15 @@ export const ModalWrapper: React.FC<ModalWrapperProps> = ({
3434
components,
3535
}) => {
3636
const dialogRef = useRef<HTMLDivElement>(null);
37-
useFocusTrap(dialogRef, isOpen, {
38-
onDeactivate: close,
39-
clickOutsideDeactivates: true,
40-
...focusTrapOptions,
41-
});
37+
const _focusTrapOptions = useMemo(
38+
() => ({
39+
onDeactivate: close,
40+
clickOutsideDeactivates: true,
41+
...focusTrapOptions,
42+
}),
43+
[close, focusTrapOptions]
44+
);
45+
useFocusTrap(dialogRef, isOpen, _focusTrapOptions);
4246
useBodyScrollLock(dialogRef, isOpen, preventScroll);
4347

4448
if (isOpen === false) {

src/index.tsx

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
1-
import deepmerge from 'deepmerge';
21
import { Options as FocusTrapOptions } from 'focus-trap';
3-
import React, { useCallback, useState } from 'react';
2+
import React, { useCallback, useMemo, useState } from 'react';
43
import {
54
DefaultModal,
65
DefaultOverlay,
@@ -49,12 +48,18 @@ export type UseModal = (
4948
isOpen: boolean
5049
];
5150

52-
export const useModal: UseModal = (elementId = 'root', options = {}) => {
53-
const {
54-
preventScroll = false,
55-
focusTrapOptions = {},
56-
components = {},
57-
} = deepmerge<UseModalOptions>(useModalConfig(), options);
51+
const defaultOptions: Required<UseModalOptions> = {
52+
preventScroll: false,
53+
focusTrapOptions: {},
54+
components: {},
55+
};
56+
57+
export const useModal: UseModal = (elementId = 'root', options) => {
58+
const modalConfig = useModalConfig();
59+
const { preventScroll, focusTrapOptions, components } = useMemo(
60+
() => Object.assign({}, defaultOptions, modalConfig, options),
61+
[modalConfig, options]
62+
);
5863
const [isOpen, setOpen] = useState<boolean>(false);
5964

6065
const open = useCallback(() => {
@@ -80,7 +85,11 @@ export const useModal: UseModal = (elementId = 'root', options = {}) => {
8085
description={description}
8186
preventScroll={preventScroll}
8287
focusTrapOptions={focusTrapOptions}
83-
components={{ Modal, Overlay, Wrapper }}
88+
components={{
89+
Modal,
90+
Overlay,
91+
Wrapper,
92+
}}
8493
>
8594
{children}
8695
</ModalWrapper>

0 commit comments

Comments
 (0)