구성 요소가 처음로드 될 때 material-ui Dialog의 DOM 노드에 대한 참조를 얻으려고하는데 참조는 항상 undefined
입니다.
내 접근 방식은 다음과 같습니다.
import React, { useEffect, useRef } from "react";
import {
Dialog,
DialogTitle,
DialogContent,
DialogContentText
} from "@material-ui/core";
export default function App() {
const dialogRef = useRef();
useEffect(() => {
console.log("Dialog Ref");
console.log(dialogRef.current);
}, []);
return (
<Dialog open ref={dialogRef}>
<DialogTitle>Ref Test Dialog</DialogTitle>
<DialogContent>
<DialogContentText>
Please check the console to see if a ref to this Dialog was logged.
</DialogContentText>
</DialogContent>
</Dialog>
);
}
재료 UI 대화 API 문서의 "심판이 루트 요소로 전달됩니다"하고는 내 접근 방식의 기반이되는 상태 useRef 문서 반응 이 작동해야 것 같다, 그래서.
사실, <div>
요소 에 동일한 접근 방식을 사용하면 작동합니다. 제가 뭔가 빠졌나요, 아니면 머티리얼 UI의 버그인가요?
다음은 문제의 "작동하는"예입니다.
https://codesandbox.io/s/hopeful-agnesi-3i0p3?file=/src/App.js
Dialog는 Modal 을 활용하여 Portal 을 활용합니다 . Material-UI의 Portal 구성 요소는 React의 createPortal API 를 사용 하여 부모 구성 요소의 DOM 계층 외부에서 대화 상자를 렌더링합니다.
의 인수 중 하나는 createPortal
렌더링 할 DOM 노드입니다. Dialog는 container prop 를 통해이 DOM 노드 (기본값은 document.body) 제어를 지원합니다 . Material-UI 는 효과에서 컨테이너의 DOM 노드를 가져오고 그 후 Dialog를 렌더링합니다 .
따라서 구성 요소의 초기 렌더링에서 Material-UI의 Portal 구성 요소는 컨테이너를 식별하고 실제로 대화 상자를 렌더링하는 Portal 구성 요소의 후속 렌더링을 트리거합니다.
disablePortal 속성 을 사용하여이 기능을 비활성화 할 수 있습니다. 이 경우 대화 상자가 즉시 렌더링 되고 참조가 예상대로 작동합니다.
기본 포털 동작을 유지하려면 참조를 처음 사용할 수있는 시점에서 코드를 실행하기 위해 콜백 함수를 참조로 전달할 수 있습니다. 이를 수행 할 때 접수 된 주장에 대해 방어적인 태도를 취하는 것이 중요합니다. 콜백 함수는 언 마운트 중에 null로 다시 변경되는 것을 포함하여 ref가 변경 될 때마다 호출됩니다.
이 기능을 넣을 수 있는 onRendered prop 도 있습니다. 그러나 문서 는 v5에서 더 이상 사용되지 않고 제거되고 대신 ref를 사용한다고 표시합니다.
다음은 ref에 콜백 함수를 사용하는 것을 보여주는 수정 된 샌드 박스 버전입니다.
import React, { useEffect, useRef } from "react";
import {
Dialog,
DialogTitle,
DialogContent,
DialogContentText
} from "@material-ui/core";
export default function App() {
const dialogRef = useRef();
useEffect(() => {
console.log("Dialog Ref", dialogRef.current);
}, []);
return (
<Dialog
open
ref={(node) => {
dialogRef.current = node;
// Do your work requiring the node here, but make sure node isn't null.
console.log("ref function", node);
}}
onRendered={() => console.log("onRendered", dialogRef.current)}
onEntering={() => console.log("onEntering", dialogRef.current)}
onEntered={() => console.log("onEntered", dialogRef.current)}
>
<DialogTitle>Ref Test Dialog</DialogTitle>
<DialogContent>
<DialogContentText>
Please check the console to see if a ref to this Dialog was logged.
</DialogContentText>
</DialogContent>
</Dialog>
);
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다