컴포넌트의 라이프 사이클은 정말 중요한 개념이며 컴포넌트가 렌더링을 준비하는 순간부터 페이지에서 사라질 때까지가 라이프 사이클이다.
초기화 단계
- 초기화 단계는 최조에 컴포넌트 객체가 생성 될 때 한번 수행되는 과정
초기화 단계에서 실행되는 함수
constructor(props) {
super(props);
this.state = { count: 0 };
}
업데이트 단계
- 업데이트 단걔는 컴포넌트가 마운트 된 이후 컴포넌트의 속성값, 상태값이 변경되면 업데이트 단계가 실행된다.
업데이트 단계에서 실행되는 함수
소멸 단계
- 소멸 단계에서는 컴포넌트가 소멸 할 때의 과정이다.
소멸 단계에서 함수
useEffect : 리액트 훅에서 라이프사이클 구현에 사용되는 함수이다.
2번째 파라미터를 주지 않으면 컴포넌트가 리렌더링될 때마다 실행된다.(메모리 과다 사용)
useEffect(() => {
// 코드 적는 곳
})
마운트 이후 1회만 실행
useEffect(() => {
}, []) // 빈 배열을 줌으로써 마운트 이후 딱 1회만 실행
2번째 파라미터 배열에 명시한 변수가 변경될 때만 실행
useEffect(() => {
// 코드 적는 곳
}, [props명, state명,...])
useEffect(() => {
// 코드 적는 곳
return () => {
// unmount나 unsubscribe 코드
}
}, [props명, state명, ...])
- 함수 컴포넌트에서 React state와 생명주기 기능을 연동할 수 있게 해주는 함수이다.
- 훅은 class 안에서는 동작하지 않는다. class 없이 React를 사용할 수 있게 해준다.
useState()는 상태관리를 위한 훅이다.
useState()는 값을 넣어두고 참조하기 위한 변수(state 변수), 값을 바꿔주기 위한 함수를 반환한다.
const [value, setValue] = useState("hi!");
👉 구조 분해 할당
구조 분해 할당은 자바스크립트 표현식 중 하나로,
배열이나 객체의 속성을 해체해서 각각의 값을 개별 변수에 할당해준다.
배열이나 객체의 속성을 해체해서 각각의 값을 개별 변수에 할당해준다.
위의 예시 코드에서는, const [value, setValue] = useState(”hi!”); 에서
useState는 [a, b]를 리턴해주고 있고, a와 b를 한 번에 가져오기 위해 [value, setValue]로 받아오는 것이다.
useEffect(() => {
// 작업...
}, [value]);
👉 메모지에이션이란?
- 메모리 어딘가에 저장해두고 두고두고 사용한다는 의미
- 함수형 컴포넌트가 리렌더링되면 컴포넌트 안에 선언해둔 함수나 인라인으로 작성한 함수를 다시 한 번 생성하게 된다.
- 어떤 컴포넌트가 총 10번 렌더링된다면 그 안에 작성해둔 함수들도 10번 만들어지는 것이고, 메모리 관리에 효율적이지 않다.
- useCallBack()은 함수를 메모이제이션해서 여러번 만들지 않도록 해준다.
- 주로 자식 컴포넌트에게 전달해주는 콜백 함수를 메모리제이션할 때 쓴다.
const myNewFunction = useCallback(() => {
console.log("hey!", need_update);
}, [need_update]);입력하세요
useRef()는 ref객체를 다루기 위한 훅이다.
어떤 값을 넣어주면 그 값으로 초기화된 변경 가능한 ref객체를 반환해준다.
이 값은 원본이 아닌 똑같이 생긴 다른 값이기 때문에 변경도 가능하다.
변경해도 리렌더링이 일어나지 않는다.
const Input = () => {
const input_ref = React.useRef(null);
const clicker = (input_ref) => {
console.log(input_ref);
}
return (
<>
<input ref={input_ref}/>
<button onClick={clicker}>button</button>
</>
);
}
.current
useRef()는 주로 화면에 이미 노출된 것들을 관리할 때 사용한다.
DOM만을 위한 것은 아니다.
리액트 Redux 상태관리와, 페이지 이동을 시키는 React-router-dom, 기존 css로 적용했던 styles들을 styled-components로 적용하기 위한 스터디를 했다.
- 리액트 라이프 사이클
- 리액트 Hooks - useRef, useState, useEffect, useCallback
- styled-components
- react-router-dom
- Redux
투두리스트를 구현하는데 있어서 필요하거나 그 외의 추가적으로 알고 있어야 하는 자바스크립트 개념에 대한 스터디를 진행하였다.
- [JavaScript] 동시성
- [JavaScript] Promise
- [JavaScript] async, await
- [JavaScript] switch문
1) styled-component를 사용할 때 css를 분리하고 외부에서 사용할 수 있도록 export 시키는 과정에서 {…rest}를 사용하는지 모르겠었음
2) Redux를 왜 사용하는가? 명확히 이해가 안되었다.
❓ 초반에 useState를 사용하는 것과 Redux를 사용하는 것에 대한 큰 차이를 느끼지 못해서 발생한 의문이었다.
3) 스토어와 모듈 연결시 주의할 점
4) delete todo시, 데이터가 완전히 삭제되는 것인지, 남아 있는 것인지?
❓ delete todo를 할 때 이전 데이터가 메모리에서 아예 삭제되는 것인지, 아니면 새로운 배열로 업데이트 시켜서 보여주는 것이고 이전 데이터는 메모리에 남아있는 상태인지 명확하게 이해가 안되었다.
5) todo.length를 사용하면 안되는 이유?
1) 라이브러리 의존성을 낮추는 것이 좋다.
2) styled-component사용시 줄임말은 피하기
3) 타입스크립트를 왜 써야 하는지?
이번 주차는 저번 주차에서 진행했던 투두리스트를 가지고 redux를 적용해서 상태관리를 하는 프로젝트였다.
처음엔 redux에 개념에 대해서 이해를 해도 리덕스가 가진 가장 큰 장점을 제대로 활용할 줄 몰라서 굳이 useState를 안쓰고 redux를 왜 사용해야 하는지 차이점이 쉽게 분간이 안되었는데, 프로젝트를 하면서 redux의 장점과 상태관리의 장점을 제대로 느낄 수 있는 시간이었다.
대신 언제나 리덕스를 사용하는 것은 좋은 선택이 아닐 수 있고, 프로젝트 규모에 따라 본인이 판단하에 리덕스를 사용하는 것이 좋을 수 있다. (리덕스 자체가 무겁기 때문 등등)
또한 팀원분들과 서로 궁금한 점, 어려운 점 모르겠는 점들을 공유하면서 내가 간과하고 있었던 부분들도 함께 찾아보게 되고, 그런 과정속에서 정말 많은 도움과 학습이 되었던 것 같다.
이번 주차에는 저번 주차와 달리 정말 사소한 것이라도 내가 이해하고 있지 않거나, 모르면 멘토님들에게 약간 더 적극적으로 질문을 하면서 궁금증, 문제를 해결하고자 노력했다.
확실히 혼자서 찾아보고 알아보는 것보다 더 명쾌하게 궁금증이 해결이 되었다.