강의 유튜브 주소 :
https://www.youtube.com/watch?v=V3QsSrldHqI&list=PLcqDmjxt30RtqbStQqk-eYMK8N-1SYIFn
React에서 재 렌더링이 발생할때 성능을 생각하면 state나 props가 변경되는 것을 파악해서 재 렌더링이 필요없는 컴포넌트의 재 렌더링을 막아야한다.
즉 a 컴포넌트만 달라져야하는 부분이 있을 경우, 기능을 나눌 수 있다면 a와 b로 컴포넌트를 분리해야한다.
성능 최적화를 하기위해서 shouldComponent, pureComponent, useMemo, useCallback을 사용하는것이 좋다.
이것을 알기 위해서는 useEffect를 알아야한다. (이건 더 뒤에 강의에서)
class 컴포넌트와 함수형 컴포넌트의 차이.
class 컴포넌트는 render 만 재 렌더링이 되는데 함수형 컴포넌트 같은 경우에는 전체가 다시 재 렌더링이 된다.
함수형 컴포넌트같은 경우 useRef하게 될 경우
ref할 경우 접근
inputEl;
onRefInput = (c) => {
this.inputEl = c;
};
this.inputEl.focus();
useRef할 경우 접근
import React, {useRef} from 'react';
const Test = () => {
// 초기 셋팅
const = inputEl = useRef(null);
const onButtonClick = () => {
// useRef는 필수로 current로 접근해야한다.
inputEl.current.focus();
}
return (
<>
<input ref={inputEl} type="text" />
<button onClick={onButtonClick}>버튼</button>
</>
);
};
jsx에서 if문을 쓰고 싶다면? jsx에서 아래와 같이 쓰면된다.
{
(() => {
if(조건){
}else{
}
})()
}
반복문을 쓰고 싶다면?
{
(() => {
const array = [];
for(){
array.push();
}
return array;
})()
}
지저분하다고 느낀다면 자식 컴포넌트로 빼는것이 좋다.
이때 배열이라면 key값이 있어야한다.
return [
<div key="">사과</div>,
<div key="">사과</div>,
<div key="">사과</div>,
];
컴포넌트가 쓸데없이 재렌더링이 된다 싶다면 구글 확장프로그램을 이용해서 확인을 해본다.
그 후에 pureComponent를 사용할지 결정하면되는데,
pureComponent는 아래와 같이 선언하는 부분을 변경한 뒤 사용하면된다.(Class 컴포넌트에 해당)
import React, { Component } from 'react';
class Test extends Component {
render() {
return <h1>Hello, {this.props.name}</h1>;
}
}
// 아래처럼 변경
import React, { pureComponent } from 'react';
class Test extends pureComponent {
render() {
return <h1>Hello, {this.props.name}</h1>;
}
}
pureComponent는 props와 state를 얕게 비교하여 변경되었다면 재 렌더링을 해주는 것을 자동으로한다.
만약 복잡한 객체를 비교해야한다면 pureComponent가 아닌 forceUpdate를 사용해야한다고한다(이건 나중에공부하기!)
라이프사이클
렌더링이 실행되면 리액트가 돔을 붙여주는 순간 특정한 동작을 할 수 있다.
componentDidMount는 렌더링이 처음 실행되고 성공적으로 실행되었을 때 발생하는 라이플사이클 중에 하나이다.
그 다음 setState로 재렌더링이 되어야할때는 실행되지 않는다.
재렌더링이 실행될 때에는 componentDidUpdate가 일어나며 컴포넌트가 제거될때, 그 직전에는 componentWillMount가 실행된다.
만약에 render안에 setState를 사용하면 무한루프가 된다.
render(){
// (X)
setState({});
return(
<>
<div>안녕</div>
</>
);
};
따라서 render할때 setState의 작업을 하고 싶을때 라이프사이클을 맞게 사용하면된다.
class컴포넌트의 경우 constructor가 실행되고 (state나 메서드들)..
처음으로 render가 실행된다. 다음 componentDidMout가 실행되는데 그 전에 ref를 먼저 설정한다.
그리고 setState나 props가 변경될때 재 렌더링이 되면서 componentDidUpdate가 실행된다.
그리고 부모컴포넌트가 자식컴포넌트를 제거할때 자식컴포넌트에서는 componentWillunMount가 실행되고 그 컴포넌트는 소멸된다.
shouldComponentUpdate는 setState나 props가 변경되어 재렌더링이 일어날때 실행되는 시점과 같다.
클래스 -->
constructor -> render -> ref -> componentDidMount ->
setState/props -> shouldComponentUpdate (true일때)->
render->
componentDidupdate -> 부모가 나를 삭제 -> componentWillunmount ->소멸
강의보면서 글을써서 의식의 흐름대로 쓰느라.. 정신이없는 글이되버리네..