반응형
☘️ 파일 구조
리액트는 기본적으로 부모가 자식에게 값을 넘길 수 있고, 자식은 부모에게 값을 줄 수 없습니다.
기본적인 이러한 원칙을 깨는 방식을 생각해서 딱히 권장하는 방법은 아닌 것 같습니다. ( 제 생각입니다.)
<div className={styles.ReviewRegist}>
<Header title={"스터디 리뷰 작성"} />
<div className={styles.wrapper}>
<StudyReview data={studyInfo} />
<StudyReview data={leaderInfo} />
<div className={styles.writeFormButton}>
<MediumButton text={"취소"} type={"Gray"} onClick={onCancle} />
<MediumButton text={"등록"} type={"Purple"} onClick={onRegist} />
</div>
</div>
</div>
- page.js에 각각의 StudyReview 값을 받아서 page.js에 넘겨야 하는 구조
☘️ 방법
1) 부모 컴포넌트에 state 생성하기
이때의 state는 자식 컴포넌트에서 값을 받을 state를 생성해 주면 된다.
위에 같은 경우에는 별점과 input의 값을 담을 stdPoint, content를 생성했다.
const [studyValue, setStudyValue] = useState({
stdPoint: 0,
content: null,
stdId: stdId,
});
2) 부모 컴포넌트에 state를 변경해 줄 함수 생성하기
나의 경우는 2개의 state를 변경해야 했기 때문에 setValue도 변수를 사용했지만,
값이 하나라면 변수를 안 써도 된다.
원래의 state값, 변경할 state 함수, 변경할 값, key 값으로 함수를 만들어 줬다.
const changeState = (value, setValue, input, field) => {
setValue({ ...value, [field]: input });
};
3) 자식 컴포넌트에 props로 만든 state와 함수를 보내주기
<StudyReview value={studyValue} setValue={setStudyValue} changeState={changeState} />
4) 자식 컴포넌트에서 함수 실행하기
const handleTextarea = (e) => {
changeState(value, setValue, e, "content");
};
<textarea
value={value.content}
onChange={(e) => handleTextarea(e.target.value)}
placeholder={`${data.title}에 대한 상세한 리뷰를 남겨주세요.`}
/>
textarea에 이벤트 핸들러를 생성해서 입력한 값을 전달하고 그 전달받은 값을 부모에게서 받은 changeState로 상태를 변경해 주면 된다.
정리하자면, 상태를 변경하는 함수를 만들어서 부모에서 자식에게 전달하면 된다.
반응형
댓글