리액트 공식문서 주요개념 5번에 데이터는 아래로 흐릅니다.
라는 개념이있다.
즉 리액트는 하향식 또는 단방향 흐름 원칙이다.
(부모:댓글화면 , 자식들중하나:댓글추가
)
그런데 댓글기능에서 새댓글 추가시 자식에 의해 부모 컴포넌트에 상태가 변한다. 그것은 어떻게 되는 경우일까? 역방향 흐름인데, 이 문제는 상태를 변경 시키는 함수를 자식에게 props
로 전달해 해결할 수 있다.
어떤 컴포넌트에 state가 위치해야 하는지 알 수 있다.
react에서 내부 데이터를 하위 컴포넌트로 전달할때는 props를 사용한다.
상태위치정하기
: 두개의 자식 컴포넌트가 하나의 상태에 접근 하고싶을때는 같은 부모 컴포넌트에 상태를 위치해야 한다. state를 부모 컴포넌트에 위치시키고, state갱신 값을 자식에게 받아와서 부모도 변경되도록 한다.
사이드 이펙트는 쉽게 말해서 외부 변수를 참조하거나, 변경하는 모든 종류의 코드를 의미한다.
함수 내에 설정값이 외부에 영향을 끼쳐 값이 변경 되는경우 그 함수는 side effect가 있다고 한다. 리액트에서는 컴포넌트 내에서 fetch를 사용해 api 정보를 가져오거나 dom을 조작할때 발생한다.
오직 함수의 입력만이 함수의 결과에 영향을 주는 함수를 의미하고, 그외 값이 바뀌거나 영향을 끼치는경우 순수함수가 아니다.
const Nike = ({dunk,jordan}) => {
return (
<div>
<div>{dunk}</div>
<div>{jordan}</div>
<div>
)
}
dunk, jordan 이라는 props를 입력받아 JSX 엘리먼트로 출력된다. Side Effect가 없고 순수 함수이다.
컴포넌트내에서 Side Effect를 실행할 수 있게 하는 Hook이다.
useEffect는 2개의 인자값을 입력받는데, 첫번째 인자는 함수이고, 함수내에서 SideEffect를 실행하도록 설정한다.
될때 함수가 실행된다.
두번째 인자로는 종속성 배열(Dependency Array) 을 입력받는다.
useEffect( () => {함수} , [종속성1,종속성2,...])
배열의 요소의 값이 변할때 함수가 실행되는 원리이다. 즉, 값이 바뀔때 함수내의 SideEffect가 발생한다.
빈배열을 인자로 받는경우 실행이 안되는데, 첫화면에 렌더링 될때만 effect가 실행되고 끝
이경우는 처음 한번만 외부 API 를 통해 리소스를 받고, 더이상 필요하지 않을때 사용한다.
2번째 인자가
useEffect( () => {함수} )
useEffect( () => {함수}, [])
최상위에서만 Hook을 호출한다.
React 함수 내에서 Hook을 호출한다.
React는 하향식, 단방향 데이터 흐름이다.
자식 컴포넌트로 인하여 부모의 상태가 변한다면 상태 변경 함수를 자식에게 전달한다.
State 끌어올리기
상태 변경 함수가 정의된 컴포넌트와, 상태 변경 함수를 호출하는 컴포넌트가 다름을 알 수 있다.
Side effect
비동기 호출 및 AJAX 요청과 같은것, 비순수함수, 렌더링, useEffect 함수내에서 사용