2021년 1월 27일
리액트 훅을 사용하기 전에는 부모 컴포넌트에서 자식 컴포넌트로 상태를 전달할 때 props로 넘겨주는데, 리액트 훅에서는 어떻게 넘겨줘야 할 지 몰랐다.
구글링해보니, props와 같이 부모 컴포넌트에서 useState로 전달받을 데이터를 저장할 변수 하나를 선언하고 props로 전달하면 된다고 한다.
// Parent Component
function Parent() {
const [data, setData] = useState('initial data');
return (
<>
<div>{data}</div>
<Children setData={setData}/>
</>
);
}
// Children Component
function Children(props) {
const changeData = () => {
props.setData('data from child');
}
return (
<>
<button onClick={changeData}>
send data to parent
</button>
</>
);
}
실제 프로젝트에서 적용해보기
// Mode.tsx
import React, { Component, useState, ReactElement, ReactNode, FC, ReactChild, useEffect } from 'react';
import { Link, Route, Switch, useHistory } from 'react-router-dom';
import Modal from './Modal'
import CreateRoomForm from './CreateRoomForm';
import JoinRoomForm from './JoinRoomForm';
const Mode = () => {
...
const [isModalOpen, setModalOpen] = useState(false);
const [modalComponents, setmodalContent] = useState(null);
const openModal = (**modalComponents: any**) => {
setmodalContent(modalComponents)
setModalOpen(true)
}
return (
...
<button
onClick={() => openModal(<CreateRoomForm setModalOpen={setModalOpen} />)}
>
방 생성
</button>
<button
onClick={() => openModal(<JoinRoomForm setModalOpen={setModalOpen} />)}
>
방 참가
</button>
{isModalOpen &&
<Modal setModalOpen={setModalOpen}>{modalComponents}</Modal>
}
)
}
// CreateRoomForm.tsx
import React, { useState } from 'react';
import { useHistory } from 'react-router-dom';
function CreateRoomForm(**{ setModalOpen }: boolean** ) {
const history = useHistory();
const closeModal = () => {
setModalOpen(false);
history.push('/mode');
}
return (
...
<button onClick={closeModal}>닫기</button>
</div>
)
}
export default CreateRoomForm
2021년 1월 27일