ð ðŦðĻðĶ ððĶðĐððŦðððĒðŊð ððð§ððĨððŽ ððĻ ððððĨððŦðððĒðŊð ððŦðĻðĐðŽ ððĻðŦ ððĨððð§ððŦ ððĻðð
ðŽðšððšðððð ððð―ðšð
ðððððŧðð
ððð ðð ðąðūðšðžð ðžððððððūððð ðð ðš ðžððððð ððšðð.
ðķððð
ðū ðððūðĻðððūððšððððūð§ðšðð―ð
ðū ðžðððŧðððūð― ðððð ðŋððððšðð―ðąðūðŋ ððŋðŋðūðð ðš ððððūððŋðð
ððšð ðð ðūðððððū ððūðððð―ð ðŋððð ðš ðžððð
ð― ðžððððððūðð ðð ððð ððšððūðð, ðð ððŋððūð ðððððð―ððžðūð ðšð ððððūððšððððū ðžðððððð
ðŋð
ðð ðððšð ðžðšð ðŧðū ð
ðūðð ðððððððððū ðððšð ðąðūðšðžð'ð ð―ðūðžð
ðšððšððððū ððšððšð―ððð.
ððĶðĐððŦðððĒðŊð ððĻð§ððŦðĻðĨ ð°ðĒððĄ ðĖēĖēðĖēĖēðĖēĖēðļĖēĖēðĖēĖēðĖēĖēðĖēĖēðĖēĖēðĖēĖēðĖēĖēðĖēĖēðĖēĖēðĖēĖēð·ĖēĖēðĖēĖēðĖēĖēðĖēĖēðĖēĖēðĖē
The initial pattern uses ĖēðĖēĖēðĖēĖēðĖēĖēð ĖēĖēðĖēĖēðĖēĖēðĖēĖēðĖēĖēðĖēĖēðĖē to pass a ref down to the ResultModal component. Inside the component, ðĖēĖēðĖēĖēðĖēĖēðļĖēĖēðĖēĖēðĖēĖēðĖēĖēðĖēĖēðĖēĖēðĖēĖēðĖēĖēðĖēĖēðĖēĖēð·ĖēĖēðĖēĖēðĖēĖēðĖēĖēðĖēĖēðĖē then allows us to define specific methods (like ĖēðĖēĖēðĖēĖēðĖēĖēðĖē() and ĖēðĖēĖēðĖēĖēðĖēĖēðĖēĖēðĖē()) that can be called directly from the parent via that ĖēðĖēĖēðĖēĖēðĖē.
// Parent component would call:
// modalRef.current.open();
// modalRef.current.close();
ððððĨððŦðððĒðŊð ððĻð§ððŦðĻðĨ ð°ðĒððĄ ððŦðĻðĐðŽ
ðĨðð ððððð
ðū ðððð/ððð―ðū ðŋðððžðððððšð
ððð, ðš ððððū 'ðąðūðšðžð-ð' ððšð ðð ðð ðžðððððð
ðððū ððð―ðšð
'ð ðððððŧðð
ððð ððððððð ððððð. ðķðū ðððððð―ððžðū ðšð ðĖēððŪððūð ðððð ðð ð―ððžððšððū ðððūðððūð ðððū ððð―ðšð
ððððð
ð― ðŧðū ðððūð ðð ðžð
ðððūð―, ðšðð― ðšð ðððĒð
ðððū ðððð ðð ððšðð―ð
ðū ðððū ðžð
ððððð ðūððūðð ðŋððð ðððððð ðððū ððð―ðšð
.
import { useRef, useEffect } from "react";
export default function ResultModal({ result, targetTime, isOpen, onClose }) {
const dialogRef = useRef();
// Crucially, we use useEffect to synchronize the modal's state
// with the `isOpen` prop.
useEffect(() => {
if (isOpen) {
// The HTML <dialog> element's showModal() method opens the modal
// in a top-layer, blocking state.
dialogRef.current?.showModal();
} else {
// The close() method dismisses the modal.
dialogRef.current?.close();
}
}, [isOpen]); // Dependency array: This effect runs ONLY when `isOpen` changes.
return (
<dialog ref={dialogRef} className="result-modal" onClose={onClose}>
<h2>You {result}</h2>
<p>The target time was <strong>{targetTime} seconds.</strong></p>
<p>You stopped the timer with <strong>X seconds left.</strong></p>
<form method="dialog">
<button onClick={onClose}>Close</button>
</form>
</dialog>
);
}
ððŦðĻðĐ-ðððŽðð ððĐðĐðŦðĻðððĄ:
- ððĶðĪððĒðģðĒðĩðŠð·ðĶ ðð°ðŊðĩðģð°ð: ðģððū ððšððūðð ðžððððððūðð ð―ðūðžð ðšððūð ðððū ð―ðūððððūð― ðððšððū (ðððŪððūð: ððððū ðð ðððŪððūð: ðŋðšð ððū
- ððđðąððŠðĪðŠðĩ ððĒðĩðĒ ððð°ðļ: ðģððū ðŋð ðð ððŋ ð―ðšððš ðð ðžð ðūðšð: ðĖēĖēðĖēĖēðūĖēĖēðĖēĖēðĖēĖēðĖē ðšðð― ðĖēĖēðĖēĖēðēĖēĖēðĖēĖēðĖēĖēðĖēĖēðĖē ðšððū ðūððð ððžððð ð ððšðððūð― ð―ððð ðšð ððððð.
- ððšðŊðĪðĐðģð°ðŊðŠðŧðĒðĩðŠð°ðŊ ðļðŠðĩðĐ ðķðīðĶðð§ð§ðĶðĪðĩ: ðģððū ðððūðĪðŋðŋðūðžð ðððð ðð ððððšð ððūððū. ðĻð ðūðððððūð ðððšð ðððū ðĖēĖēðĖēĖēðĖēĖēð ĖēĖēðžĖēĖēðĖēĖēðĖēĖēðĖēĖēðĖē() ðð ðĖēĖēðĖēĖēðĖēĖēðĖēĖēðĖē() ððūðððð―ð ððŋ ðððū ððšððððū ð§ðģðŽðŦ <ĖēðĖēĖēðĖēĖēðĖēĖēðĖēĖēðĖēĖēðĖē>
- ððĶð·ðĶðģðĒðĻðŠðŊðĻ ððĒðĩðŠð·ðĶ <ðĨðŠðĒðð°ðĻ>: This approach effectively uses the built-in functionality of the HTML <ĖēðĖēĖēðĖēĖēðĖēĖēðĖēĖēðĖēĖēðĖē> element.
ðķððð ðū ðĖēĖēðĖēĖēðĖēĖēðļĖēĖēðĖēĖēðĖēĖēðĖēĖēðĖēĖēðĖēĖēðĖēĖēðĖēĖēðĖēĖēðĖēĖēð·ĖēĖēðĖēĖēðĖēĖēðĖēĖēðĖēĖēðĖē ððšð ððð ð ðūððððððšððū ðððū ðžðšððūð (ðū.ð., ðūððððððð ðšð ð ðŊðĻ ðŋðð ðŋððžððððð ðūð ðūððūððð, ððððððūðððð ðšððððšððððð), ðŋðð ððððð ðū ðððšððū-ð―ððððūð ððððūððšðžððððð ð ðððū ððððððð/ððð―ððð ðš ððð―ðšð , ðš ðððð-ðŧðšððūð― ðšðððððšðžð ððŋððūð ð ðūðšð―ð ðð ððððū ððūðšð―ðšðŧð ðū, ððšððððšðððšðŧð ðū, ðšðð― ðððūð―ððžððšðŧð ðū ðąðūðšðžð ðžððððððūððð.
ðķððšð ðšððū ðððð ðððððððð ðð ððððūððšððððū ðð. ð―ðūðžð ðšððšððððū ððšðððūððð ðð ðąðūðšðžð? ðēððšððū ðððð ðððððððð!
Top comments (0)