React개발 방식의 큰 특징은 페이지 단위가 아닌 컴포넌트 단위로 개발을 한다는 것이다. 그리고 props를 통해 데이터를 부모 컴포넌트에서 자식 컴포넌트로 내려주는것이 가능하다. 이를 단방향 데이터 흐름(one-way data flow)라 한다.
하지만 하위 컴포넌트의 에서 어떤 이벤트로 부모의 상태를 바꿔야만 하는 상황이 있을수도 있다. 이를 해결할 수 있는 방법이 'State 끌어올리기' 이다.
이는 상태를 변경하는 함수를 하위 컴포넌트에 props로 전달해서 해결할 수 있다.
import React, { useState } from "react";
export default function ParentComponent() {
const [value, setValue] = useState("바뀔 값");
const handleChangeValue = () => {
setValue("이렇게 바뀐 값");
};
return (
<div>
<div>값은 {value} 입니다</div>
<ChildComponent />
</div>
);
}
function ChildComponent() {
const handleClick = () => {
// 자식 컴포넌트의 이벤트를 이용해 부모의 요소를 바꾸고싶을때
};
return <button onClick={handleClick}>값 변경</button>;
}
React에서는 해결책을 다음과 같다고 말한다.
상위 컴포넌트의 "상태를 변경하는 함수" 그 자체를 하위 컴포넌트로 전달하고, 이 함수를 하위 컴포넌트가 실행한다
위 예시에서 value의 값을 변경해주는 함수는 handleChangeValue
이다. 이 함수를 적절한 이름을 지어 prop를 이용해 전달 해준다.
function ParentComponent() {
const [value, setValue] = useState("바뀔 값");
const handleChangeValue = () => {
setValue("이렇게 바뀐 값");
};
return (
<div>
<div>값은 {value} 입니다</div>
<ChildComponent handleButtonClick={handleChangeValue} />
</div>
);
}
props로 함수를 전달해주면 고차함수가 인자로 받은 함수를 실행하는것 처럼 컴포넌트 내부에서 함수를 실행 가능하다. 상태 변경 함수는 버튼 클릭 이벤트가 발생 했을때 실행되는것을 원하므로 handleClick
함수 내부에 콜백함수를 실행한다.
function ChildComponent({ handleButtonClick }) {
const handleClick = () => {
handleButtonClick()
}
return (
<button onClick={handleClick}>값 변경</button>
)
}
handleClick
에 콜백함수를 실행 한다.