한입 크기로 잘라 먹는 리액트 -일기장 프로젝트 one page-[인프런]
React에서 사용자 입력 처리하기
DiaryEditor 컴포 넌트 만들기
className과 컴포넌트 이름을 동일하게 해서 css스타일링할 떄 직관적으로 한다.
사용자의 입력을 처리하기 위해서는 state를 사용해야한다. ==> uesState를 사용한다.
onChange 사용
onClick 사용
스프레드 연산자 사용
공통된 State묶기
React에서 DOM 조작하기 - useRef

특정 길이 이상이 들어왔는지 확인
마우스 커서를 누르면 테두리가 진한 검정으로 바뀌나 커서가 깜박거린다.
UseRef 사용

MutableRefObject는 hmtl 즉, DOM 요소를 접근 할 수 있게 한다.
레퍼런스객체(useRef)는 current 현재 가리키는 값을 가르켜 fouce 기능을 준다.
React에서 배열 사용하기 1 - 리스트 렌더링 (조회)
DiaryList, DiaryItem컴포넌트를 만들기
React에서 배열 사용하기 2 - 데이터 추가하기



같은 레벨로 한번에 자식을 추가 할 수 없다.
DaryEdiotr에서 추가한 값을 DiaryList에 추가를 해야하는데 방법이 없을까 ?
state를 공통 부모로 올려서 해결 !
data는 배열이고 하나의 일기 데이터(item1)라 가정. 즉, 하나의 데이터만 렌더링하고 있다고 가정.
새로운 일기가 작성이 되면 app컴포넌트가 Editor 컴포넌트 prps으로 전달한 setData를 전달하게 된다.
즉 데이터 가 추가되고 그 추가된 데이터가 props으로 List 컴포넌트로 내려간다. ==> 리랜더링
즉 위와 같은 과정으로 리액트의 단반향 데이터 방식을 극복할 수 있다.
즉, 리액트로 만든 컴포넌트들은 트리 형태를 띄며 이벤트들은 아래서 위로 데이터들은 위에서 아래로 이동한다. ==> state끌어 올리기
React에서 배열 사용하기 3 - 데이터 삭제하기
React에서 배열 사용하기 4 - 데이터 수정하기



React Lifecycle 제어하기 - useEffect











React에서 API 호출하기

컴포넌트가 등장하는(마운트) 시점에 api를 호출하고 api의 결과값을 일기 데이터의 초기값으로 이용ㅎ !
React developer tools
어떤 컴포넌트가 리렌더링 되고 있는지 하이라이트로 알려준다.
최적화 1 - useMemo

일기 내용을 수정할때는 일기의 갯수들은 변하지 않지만 수정완료를 하면 모든 컴포넌트가 리렌더링된다.
불필요한 컴포넌트 리렌더링을 줄여보자 ==> memoization useMemo
의존성배열이 수정 될때만 콜백 함수가 다시 수행 되게 된다.
또한 usememo의 반환값은 함수가 아니라 값!이다 !
최적화 2 - React.memo





리액트 공식 문서를 참조 해서 공부해 보자 !
https://ko.legacy.reactjs.org/docs/getting-started.html


props가 객체이면 얕은 비교를 한다.



카운터 A에 대해서는 같은 변수로 되는것이어서 리렌더링이 일어나지 않지만
카운터 B의 경우에는 얕은 비교로 인해 객체가 다른걸로 인식하여 리렌더링이 된다 !

최적화 3 - useCallback


복잡한 상태 관리 로직 분리하기 - useReducer
app컴포넌트에는 많은 상태변화 함수가 있다. ==> 컴포넌트의 코드가 길어진다.
==> 상태변화 로직들을 컴포넌트에서 분리 시킬 수 있다.
useRducer는 useState의 훌륭한 대체제이다.
즉 이제 setData가 할 일을 dispatch가 하게 된다.
dispatch는 호출을 하면 현재 state를 reuder함수가 참조한다.
컴포넌트 트리에 데이터 공급하기 - Context
Provider컴포넌트는 자신의 자손에 해당하는 모든 컴포넌트 들에게 직통으로 데이터를 전달 해 줄 수 있따.
Provider가 데이터 공급 할시 위와같이 공급한다
Provider에게 공급을 받을 시에는 위와 같이 받는다.
데이터를 공급하는 Provider와 함수를 보내주는 Provider를 따로 생성한다.