본문 바로가기

Do Your Best

2020.07.08.

* 아래의 글은 Do Your Best 프롤로그를 먼저 읽으신 후 읽으시기를 권장합니다.


2020.07.08

 

오늘의 목표

  • 리액트 훅 배우기(노마드 코더 실전형 리액트 Hooks 강의 정독)
  • 리액트 훅을 사용한 간단한 웹사이트 구현

동기

  • class형 컴포넌트가 아닌 함수형 컴포넌트로 개발하고 싶어서
  • 개발 시간 단축 및 효율성을 높이고싶기 때문에

React Hooks?

  • functional component에서 state를 가질 수 있게 해준다.
  • 함수형 프로그래밍 스타일로 개발할 수 있다.

React Hooks를 사용한다는 것은 class component, componentDidMount, render 이런 것들을 안해도 된다는 뜻이다.

 

React Hooks의 간단한 예시를 살펴보자. 이 예시를 살펴보면 React Hooks를 사용하는 것이 왜 효율성이 좋은지 알 수 있을것이다.

 

Counter를 할 수 있는 간단한 웹을 구현해보자.

import React from 'react';

class App extends React.Component{
	state = {
    	count : 0,
    };
    
    modify = (type, n) => {
    	switch(type){
        	case 'increment':
            	this.setState({ count : n });
                return null;
            case 'decrement':
            	this.setState({	count : n });
                return null;
            default:
            	return null;
        };
    };
    
    render(){
    	const { count } = this.state;
    	return(
        	<>
            	<div>{count}</div>
                <button onClick = {() => this.modify('increment', count + 1)}>increment</button>
                <button onClick = {() => this.modify('decrement', count - 1)}>decrement</button>
            </>
        );
    }
}

export default App;

위의 방법이 class형 component로 counter를 구현했을 때 모습이다.

이제 React Hooks를 사용하여 counter를 구현한 모습을 살펴보자.

import React, { useState } from 'react';

const App = () => {
  const [count, setCount] = useState(0);
  
  return(
    <>
      {count}
      <button onClick = {() => setCount(count + 1)}>Increment</button>
      <button onClick = {() => setCount(count - 1)}>Decrement</button>
    </>
  );
}

export default App;

코딩을 모르는 사람이 봐도 React Hooks를 사용하여 코드를 작성하는 것이 더 효율적이라는 것을 알겠죠!

 

const [count, setCount] = useState(0);

이 코드를 하나하나 알아가며 배워봅시다!

 

const [count, setCount]

useState는 2개의 요소를 포함한 array를 리턴합니다.

그 array의 첫번째 요소는 value이고, 두번째는 이를 변경하는 방법입니다.

 

useState(0);

array의 첫번째 요소인 value를 0에서 시작하게 만드는 것입니다.

class형 component에서 state = {count : 0}과 같은 코드인 것 같군요...

 

onClick = {() => setCount(count + 1)}

이 부분은 두 번째 요소인 value를 변경하는 방법을 작성한 것 입니다.

저는 value를 1증가하고 싶었기 때문에 setCount(count + 1)을 주었습니다.

 

이렇게 차근차근 알아보니 '리액트 훅을 사용안해도 되겠지?' 라는 생각을 가졌던 제가 너무 한심하군요...

이렇게 아름답게 코드를 짤 수 있다니... 놀랍고 빨리 코딩하고 싶은 마음이 듭니다...

 

지금까지 useState를 알아봤으니 이젠 useEffect를 같이 알아봅시다.

import React, { useState, useEffect } from 'react';

const App = () => {
	const sayHello = () => console.log("hello");
    const [number, setNumber] = useState(0);
    const [aNumber, setAnumber] = useState(0);
    useEffect(sayHello, []);
    return(
    	<div>
        	<button onClick = {() => setNumber(number + 1)}>{number}</button>
            <button onClick = {() => setAnumber(aNumber + 1)}>{aNumber}</button>
        </div>
    );
};

export default App;

React Hooks에서 useEffect는 class형 component의 componentDidMount, componentDidUpdate, componentWillUpdate의 역할을 합니다.

 

useEffect도 useState와 같이 두 개의 인자값을 제공합니다.

첫번째는 DidMount혹은 WillUpdate 시 작동되는 함수입니다. 두번째는 dependency를 받습니다.

 

여기서 useEffect의 재미있는 점, 유용한 점을 알았습니다.

왜냐하면 useEffect의 제공하는 인자값으로 DidMount, DidUpdate, WillUpdate를 컨트롤 할 수 있기 때문입니다.

 

only DidMount

useEffect(functionName, []) - dependency에 빈 array를 제공합니다.

 

위의 코드를 예시로 만약 number가 바뀔때마다 sayHello함수를 불러오고싶다면, 아래와 같은 코드를 작성하면 됩니다.

useEffect(sayHello, [number]);

 

그러면 number, aNumber 둘 다 바뀔때마다 sayHello함수를 작동시키고 싶다면 어떻게 해야할까요?

생각해보셨나요~?

정답은 어렵지 않습니다. 여러분이 예상하신 것처럼 useEffect(sayHello, [number, aNumber]); 이 코드 입니다.

 

그러면 componentWillUnMount를 호출하기 위해서는 어떠한 코드를 작성해야할까요?

import React, { useState, useEffect, useRef } from "react";

const useClick = onClick => {
  const element = useRef();
  useEffect(() => {
    if (element.current) {
      element.current.addEventListener("click", onClick);
    }
    return () => {
      if (element.current) {
        element.current.removeEventListener("click", onClick);
      }
    };
  }, []);
  return element;
};

const App = () => {
  const sayHello = () => console.log("say hello!");
  const title = useClick(sayHello);
  return (
    <div>
      <h1 ref={title}>dd</h1>
    </div>
  );
};

export default App;

위와 같은 코드에서 useClick 부부을 확인해주세요!

useEffect에서 첫번째 인자인 함수가 들어갔습니다. 위에서 읽으셨으니 저 함수의 역활은 아시겠죠?

네~ addEventListener는 componentDidMount일 때 실행하는 함수입니다.

하지만 이벤트리스너를 추가했으면 현재의 페이지가 끝날 때 이벤트리스너를 지워주어야겠죠.

이 때 사용하는 것이 componentWillUnMount이고 react hooks에서는 return () => {함수내용}과 같이 작성합니다.

위의 코드를 보시면 return () => {}안에 removeEventListener가 있죠... 이해하셨을거라 믿습니다..!

 

차근차근 알아가니 React Hooks는 정말 간단하고 유용하며 획기적인 것 같습니다.


2020.07.08. 회고

 

오늘의 목표를 이루었는가?

  • 리액트 훅 배우기(노마드 코더 실전형 리액트 Hooks 강의 정독)
  • 리액트 훅을 사용한 간단한 웹사이트 구현

위 두 목표 중 첫 번째는 반 정도 진행하였고, 두 번째는 시도조차 하지 못했다.

  • 정확한 수치는 노마드코더 실전형 리액트 Hooks 재생목록 10번까지 보았다.

목표를 이루지 못한 실패 요인

  • 스마트폰 사용(페이스북, 인스타, 유튜브)
  • 유튜브 시청(랩탑을 사용한 유튜브 시청)
  • 컨디션 조절 실패로 인한 피로감

위 실패 요인을 해결하기 위한 방안

  • 스마트폰 페이스북, 인스타 앱 삭제 (but, 처음부터 모든 걸 금지하는 건 과유불급이기 때문에 유튜브는 남긴다)
  • 컨디션 조절은 나의 재량에 맞겨서 조절해야 할 듯 하다

2020.07.08. 하루를 지낸 소감

처음에는 이걸 내가 할 수 있을까 하고 두렵기만 했다. 그렇지만 차근차근 하나하나 기록하면서 학습하니 학습 효과가 2배가 되는 것 같다...(오버인가..) 설래발일 수도 있지만 웹을 학습하고 싶은 초보 개발자가 이 글을 보고 도움이 된다고 생각하면 정말 기분이 좋을 것 같다.. 그러니까 이 글을 혹시나 읽으시면서 궁금한 점이나 틀린 점이 있으면 무조건 댓글을 남겨주세요! 우리 서로 지식을 공유하면서 서로 발전해 나갑시다.!

정말 솔직히 말하면 이게 얼마나 오래갈지 내일, 모래 하긴 하더라고 오늘같은 양을 할 수 있을지 걱정된다. 그래도 안하는 것 보다는 하는게 낫다라는 생각을 가지고 양이 얼마나 되든 내일도 글을 올릴 것이다.

말도 존댓말, 반말 왔다리 갔다리 하면서 엄청 글 내용이 전문적이지도 않고, 야매같기도 하고 그렇지만 그래도 정말 좋은 마음에 공유하고 싶어서 작성한 글이니까 좋게 봐주셨으면 좋겠습니다! 

대한민국의 모든 개발자들 모두 힘내고, 내일도 좋은 하루 보냅시다. 긴 글 읽어주셔서 감사합니다 :D

 

아래는 이 글을 쓰면서 도움을 받은 링크입니다.

저의 글보다 훨씬 더 좋은 영상과 자료들이 많으니 아래의 사이트도 한 번씩 들어가보시는 것을 추천드립니다!

 

리액트 Hooks 공식 문서 - https://ko.reactjs.org/docs/hooks-intro.html

노마드코더 실전형 리액트 Hooks - youtu.be/QhPFf-rhV3o

노마드코더 리액트 Hooks 10분만에 사용법 배우기 - https://www.youtube.com/watch?v=yS-BU6eYUDE

 

저의 깃헙 링크도 첨부하겠습니다. 공부하면서 작성한 코드가 있으니 들어오셔서 봐주시면 감사하겠습니다!

Bigstar1108 - https://github.com/Bigstar1108/Do_Your_Best

 

'Do Your Best' 카테고리의 다른 글

2020.07.12.  (0) 2020.07.12
2020.07.11.  (0) 2020.07.11
2020.07.10.  (0) 2020.07.10
2020.07.09.  (0) 2020.07.09
Do Your Best 프롤로그  (0) 2020.07.08