kok202
React 기본 강좌 정리 - 3~4

2020. 2. 12. 02:28[정리] 기능별 개념 정리/React

import

require : node 의 모듈시스템

import 와 require 는 호환이 되긴한다.

import 를 쓰면 babel 이 require 로 변환해준다.

 

export

엄밀히 따지면 export defaut 와 module.export 는 다르다.

export 되는게 객체나 배열이면 구조분해하여 import 할 수 있다.

export 는 여러개 올수 있으나 export default 는 단 한번만 나올 수 있다.

 

defaultValue

value 와 onChange 는 같이 써야된다.

두 조합을 쓰기 싫다면 defaultValue 를 써야한다.

 

map

<ul>
    {["A", "B", "C", "D"].map((alphabet) => {
        return (
            <li> 
                {alphabet}
            </li>
        );
    })}
</ul>

배열에서 사용할 수 있는 함수. callback function 에 인덱스를 같이 받아올 수 있다. ex) (alphabet, i) => { ... }

리액트에서는 render 의 return 안에서 for 와 if 를 바로 쓸 수 없다. (함수 호출로 불러와서 쓰거나 즉시 실행함수로 하려면 할 수 있긴 하다) 그래서 다른 방식으로 표현해야 한다.

for -> map

if -> 3항 연산자

 

 

key

<ul>
    {["A", "B", "C", "D"].map((alphabet) => {
        return (
            <li key={alphabet}> 
                {alphabet}
            </li>
        );
    })}
</ul>

반복문으로 태그를 만들때 반드시 최상위 태그에 key 를 전달해줘야한다. 리액트는 key 를 보고 같은 컴포넌트인지 아닌지 판단한다. 리액트가 작업할 때 사용하는 값이기 때문에 반드시 고유한 값이 필요하다. 키 값은 인덱스 같은 값을 쓰지 않는 것이 좋다. (만약 배열에 원소가 추가 삭제 될 가능성이 있다면 같은 인덱스라고 같은 컴포넌트라 보장할 수 없으므로.)

 

state, props

멤버변수 : 컴포넌트 내에서 변하는 값

this.state : 컴포넌트 내에서 변하는 값 + 렌더링이 필요한 값

this.props : 부모 컴포넌트에서 전달해주는 값

this.state 안의 임의의 멤버 변수 배열에 push 해놓고 렌더링이 안된다고 생각하는 실수 많이한다.

원칙) 자기자신의 props 는 절대 자기자신이 바꿔서는 안된다. 왜냐하면 props 는 부모 컴포넌트에서 내려준 값인데 자기 자신의 변화가 부모 컴포넌트에 영향을 주기 때문. 만약 props 를 바꿔야할 일이 있다면 props를 state 로 만든 다음 그 state 를 바꿔야한다. 

 

React development tools

리액트 개발에 도움을 주는 확장 프로그램

아이콘이 빨간색이면 개발 모드라는 의미

배포환경이라면 webpack 설정으로 production 으로 변경해줘야한다.

Highlight update 를 활성화 해놓으면 사용자의 동작에 렌더링되는 컴포넌트들을 확인할 수 있다.

 

shouldComponentUpdate

this.setState 를 호출하기만해도 렌더링이 된다. (즉 this.setState({}) 를 실행하기만해도 렌더링이된다)

렌더링을 줄이기 위해 사용할만한 괜찮은 라이프 사이클 메소드이다.

shouldComponentUpdate(nextProps, nextState, nextContext) => {
    if(this.state.myValue !== nextState.myValue){
        return true;
    }
    return false;
}

 

React.PureComponent

위와 같이 shouldComponentUpdate 에서 값들을 일일히 비교해서 렌더링을 할지 말지 결정하는 동작을 넣어주는게 귀찮다면 순수 컴포넌트는 괜찮은 대안이다. 일반적인 리액트 컴포넌트가 state 의 참조 값을 보고 렌더링을 결정하는 반면, 순수 컴포넌트는 state 바로 아래 레벨의 프로퍼티들의 값을 보고 변경이 됬을 때만 렌더링을 할지 말지 결정한다.

 

React.memo

Hooks 에서는 상속구조를 가질 수 없기 때문에 PureComponent 를 쓸 수 없다. 이때 쓸 수 있는게 React.memo 다. 메모이제이션의 줄임말이며 마찬가지로 props랑 state 가 바뀌었을 때만 렌더링을 해준다.

const MyComponent = memo(props) => {
    return ( 
        ...
    )
}

 

React.createRef

class 에서 ref 를 참조하려면 아래와 같이 일일히 해줘야하는데 

myInputRef;

...

<input ref = {(e) => { this.myInputRef = e; }} />

Hooks 에서는 useRef 로 간단히 해줄 수 있다. class 기반의 컴포넌트에서도 useRef 처럼 간단히 사용할 수 있는 뭔가가 필요해서 나온 함수. 아래와 같이 사용할 수 있다.

myInputRef = React.createRef();

...

<input ref = {this.myInputRef} />

단 useRef 와 마찬가지로 myInputRef 를 참조할 때는 this.myInputRef.current 와 같이 current 가 하나 더 들어간다.

 

무한 루프

render 안에서는 setState 를 쓰면 안된다.

 

태그 없음

아래 3개의 값은 jsx 에서 태그 없음을 의미한다.

false

undefined

null 

 

setTimeout

myTimeout = setTimeout(() => {
   // callback 동작 
}, 1500);

특정 시간 이후 callback 이 동작하게 할 수 있다. 비동기 동작이다.

 

clearTimeout

위 코드에서 어딘가에 clearTimeout(myTimeout) 코드를 입력하면 1.5초 후 동작해야하는 callback 요청을 취소 할 수 있다. setTimeout 으로 넘어간 callstack을 clearTimeout 으로 지워줄 수 있다..

 

useState 와 useRef 의 차이

값이 바뀔 때 렌더링을 하고 싶다면 useState

값이 바뀔 때 렌더링을 원하지 않는다면 useRef

Hooks 에서 state 가 useState 이고

Hooks 에서 멤버 변수가 useRef 정도인 듯 싶다.

ref 는 무조건 current 로 접근해야한다.

 

배열에 JSX 를 담아서 return 하는 것도 유효한 문법이다.

단 반환한 배열안의 원소는 key 를 가지고 있어야한다.

잘 안쓰인다.

 

 

 

'[정리] 기능별 개념 정리 > React' 카테고리의 다른 글

React 기본 강의 정리 - 8~9  (0) 2020.02.14
React 기본 강좌 정리 - 5~7  (0) 2020.02.13
React 기본 강좌 정리 - 1~2  (0) 2020.02.11
React 강의 정리 (6)  (0) 2019.08.23
React 강의 정리 (5)  (0) 2019.08.18