리엑트의 데이터 흐름은 하향식(부모 컴포넌트 -> 자식 컴포넌트)
-hook을 사용해 state를 하위 컴포넌트에서 변경하거나, side effect를 처리할 수 있다.
hook은 컴포넌트 최상위에 선언해야 한다
state hook
텍스트박스에 입력한 글자가 나오는 react app
//상위 컴포넌트
function Parent() {
let [state, setState] = useState("initial value")
//state를 변경하는 메소드
function changeState(newStr){
setState(newStr);
}
return (
<div className="App">
<p>{state}</p>
{/* state를 변경하는 함수(handler)를 하위 컴포넌트에 props로 전달 */}
<Child changeState={changeState}/>
</div>
);
}
//하위 컴포넌트
function Child({changeState}){
function handleChange(ele){
//onChange이벤트가 일어날 때마다 changeState메소드가 실행된다.
changeState(ele.target.value);
}
return <input type="text" onChange={handleChange}></input>
}
'count 증가' 버튼을 누르거나 텍스트 박스에 문자를 입력하면 state가 변한다. 하지만 useEffect의 두 번째 인자로 주어진 배열에는 'state'라는 state만 들어가 있기 때문에 콜백 함수는 글자를 입력할 때만 실행된다.
//상위 컴포넌트
function Parent() {
let [state, setState] = useState("initial value")
let [count, setCount] = useState(0)
//state를 변경하는 메소드
function changeState(newStr){
setState(newStr);
}
function changeCount(){
setCount(count+1);
}
useEffect(() => {
console.log("글자 입력");
}, [state])
return (
<div className="App">
<p>{state}</p>
<p>{count}</p>
{/* state를 변경하는 함수(handler)를 하위 컴포넌트에 props로 전달 */}
<Child changeState={changeState} changeCount={changeCount}/>
</div>
);
}
//하위 컴포넌트
function Child({changeState, changeCount}){
function handleChange(ele){
//onChange이벤트가 일어날 때마다 changeState메소드가 실행된다.
changeState(ele.target.value);
}
function handleClick(){
changeCount();
}
return (
<div>
<input type="text" onChange={handleChange}></input>
<button onClick={handleClick}>{"count 증가"}</button>
</div>
)
}