ReviewAdd.js
const [reviewAdd, setReviewAdd] = useState(false);
const onClick = () => {
setReviewAdd(true);
};
<button className="reviewAdd" onClick={onClick}>
<FontAwesomeIcon icon={faPlus} />
<span className="reviewAddDesc">리뷰 쓰기</span>
</button>
{reviewAdd && <ReviewAdd />}
// ReviewBox.js
const [reviewAdd, setReviewAdd] = useState(false);
const onClick = () => {
setReviewAdd(true);
};
{reviewAdd && (
<ReviewAdd reviewAdd={reviewAdd} setReviewAdd={setReviewAdd} />
)}
// ReviewAdd.js
<button className="close" onClick={() => setReviewAdd(false)}>
<FontAwesomeIcon icon={faX} />
</button>
{ReviewAdd ? (
<div
className="reviewWriteWarp"
ref={outSection}
onClick={e => {
if (outSection.current === e.target) {
setReviewAdd(false);
}
}}
>
<div className="reviewWriteFrom">
<h3 className="reviewWriteHead">리뷰 쓰기</h3>
<select name="상품선택">
{menu.map(({ id, menuName }) => (
<option key={id}>{menuName}</option>
))}
</select>
<form className="reviewWriteForm">
<p className="reviewFileTitle">사진 첨부 (선택)</p>
<p className="reviewFileDesc">
오늘의집에 올렸던 사진에서 고르거나 새로운 사진을 첨부해주세요.
(최대 1장)
</p>
<div className="reviewFileUplode">
<label className="reviewFileUplodeTitle">사진 첨부하기</label>
<input className="reviewFileUplodeInput" type="file" />
</div>
<div className="review">
<label className="userReviewWrite">리뷰 작성</label>
<textarea
placeholder="자세하고 솔직한 리뷰는 다른 고객에게 큰 도움이 됩니다 (최소 20자 이상)"
required
maxLenth="200"
minLength="20"
/>
</div>
<button className="reviewSubmitBtn">완료</button>
</form>
<details>
<summary>Namba1 리뷰 정책</summary>
<div class="detailsDesc">
{DETAILS_DESC.map(({ id, detailsDesc }) => (
<span key="id" className="detail">
{detailsDesc}
<br />
</span>
))}
</div>
</details>
<button className="close" onClick={() => setReviewAdd(false)}>
<FontAwesomeIcon icon={faX} />
</button>
</div>
</div>
) : null}
useEffect(() => {
const escKeyModalClose = e => {
if (e.keyCode === 27) {
setReviewAdd(false);
}
};
window.addEventListener('keydown', escKeyModalClose);
return () => window.removeEventListener('keydown', escKeyModalClose);
}, [setReviewAdd]);
참고
아스키코드 사용하지 않는다는 스택오버플로우 답변
keyCode 는 요즘 안쓴다고 한다.
최근에는 아래와 같다.
useEffect(() => {
const escKeyModalClose = e => {
if (e.Code === "Escape") {
setReviewAdd(false);
}
};
window.addEventListener('keydown', escKeyModalClose);
return () => window.removeEventListener('keydown', escKeyModalClose);
}, [setReviewAdd]);
다음 프로젝트에서 많이 참고할게요!!!