React의 개발 방식은 컴포넌트 단위로 개발을 시작하여 앱을 제작하는 상향식(bottom-up)개발 입니다.
장점으로는 테스트가 쉽고, 확장성이 좋습니다.
단방향 데이터 흐름(one-way data flow)
컴포넌트는 컴포넌트 바깥에서 props를 이용해 데이터를 마치 함수의 인자(arguments)처럼 전달 받는데, 데이터를 전달하는 주체는 부모컴포넌트 입니다.
이는 데이터 흐름이 하향식(top-bottom)임을 의미합니다.
만약 두개의 자식 컴포넌트가 하나의 상태(State)에 영향을 받을 때,
이 하나의 상태(State)는 공통의 부모 컴포넌트에 위치시켜야 합니다.
자식 컴포넌트에서의 어떤 변화(ex:클릭 이벤트)로 인해 상태(State)를 바꾸어야만 하는 상황이 온다면 부모에게 데이터를 전달해줘야 합니다.
이는 위에서 말한 단방향 데이터 흐름을 위반합니다.
이를 해결할 수 있는 방안이 State 끌어올리기(Lifting State Up) 입니다.
써먹는 방법은 상태를 변경시키는 함수(setState)를 특정 함수에 포함시키고 특정 함수를 자식 컴포넌트에 props로 전달합니다.(마치 콜백함수 처럼!)
그리고 props로 전달받은 특정 함수를 자식 컴포넌트에서 실행합니다.
단방향 데이터 흐름? 갑자기? 왜 쓰는거야?
자식 컴포넌트에서 상태 변경을 부모 컴포넌트에게 통보하고
부모 컴포넌트에서는 변경된 상태(State)에 대해서 자식 컴포넌트에게
다시 단방향 데이터 흐름을 통하여 렌더링 한다.
let foo = 'hello'
function bar(){
foo = 'world'
}
bar(); // 함수 bar 는 side effect를 발생시킵니다.
useEffect는 컴포넌트 내에서 side Effect를 실핼할 수 있게 하는 Hook입니다.
useEffect(함수)의 첫번쨰 인자는 함수(A) 입니다. 함수(A) 내에서 side effect를 실행합니다. 함수(A)는 다음과 같은 조건에서 실행됩니다.
Hook 사용 시 주의 사항
https://ko.reactjs.org/docs/hooks-rules.html#only-call-hooks-at-the-top-level
useEffect의 두번째 인자는 배열입니다. 이 배열은 조건을 담고 있습니다. 여기서 조건은 boolean 형태의 표현식이 아닌, 어떤 값의 변경이 일어날 때를 의미합니다.
따라서, 해당 배열엔 어떤 값의 목록이 들어갑니다. 이 배열을 특별히 종속성 배열이라고 부릅니다.
useEffect(함수, [종속성1, 종속성2, ...])
배열 내의 종속성1, 또는 종속성 2의 값이 변할 때, 첫번쨰 인자의 함수가 실행됩니다. 배열 내의 어떤 값이 변할 때에만, (effect가 발생하는) 함수가 실행됩니다.
useEffect(함수, [])
처럼 빈 배열 인 경우
useEffect(함수)
처럼 아무것도 넣지 않는 경우
느낀 점 && 미비한 점
겉핡기 식으로 아는게 너무 많다는 걸 느낀 챕터인거 같다.
구조 분해, Promise, 네트워크, AJAX 등 완벽하게 활용가능한게 하나도 없다. 다시 한번 되돌아보는 시간을 먼저 가져야 할거 같다.
그리고 이런 점을 느낀다는 거 자체가 React가 모든 것의 기본이라고 생각한다. 이 React를 통해 이전에 배운 것, 앞으로 배운 것을 활용하고 응용하고 체험하고 모든 걸 할수 있는 기본 바탕이라고 느껴졌다.
이것도 하고 저것도 하고 할게 너무 많지만 하나씩 하나씩 해치워보자!