Function 컴포넌트와 Class 컴포넌트의 차이는 기존에 궁금했던 부분이어서 강의를 찾아보고, 검색을 통해 추가적인 내용을 보충해서 이해했다.

인프런 - React class vs. function style coding

class형 보다 함수형 컴포넌트가 사용이 더 쉽지만, 예전에는 class형 컴포넌트만 state나 react life cycle을 이용할 수 있었기 때문에 대부분 class 문법으로 작성이 되었다.

하지만 Hook이 등장하면서 함수형에서도 state나 react life cycle을 이용할 수 있게 되어서 함수형으로도 많이 쓰인다.






컴포넌트 생성

function 컴포넌트

function FuncComp(){
  return(
    <h1>
      함수형 컴포넌트
    </h1>
  );
}


class 컴포넌트

class ClassComp extends Component{
  render(){
    return (
      <h1>
        클래스형 컴포넌트
      </h1>
    );
  }
}

render() 메서드를 이용해 컴포넌트를 생성한다.






props

상위 컴포넌트에서 props 값을 넘길 때 하위 컴포넌트에서 받는 법의 차이가 있다.

function 컴포넌트

function FuncComp(props){
  return(
    <h1>
      {props.이름}
    </h1>
  );
}

파라미터로 props를 정의해서 사용한다.


class 컴포넌트

class ClassComp extends Component{
  render(){
    return (
      <h1>
        {this.props.이름}
      </h1>
    );
  }
}

class 객체로 자동으로 넘어와서 this.props 로 호출한다.






state

function 컴포넌트

useState() Hook을 import 해서 사용한다.

function FuncComp(props){

  const [ 이름, set이름 ] = useState('');

  return(
    <h1>
      {이름}
    </h1>
  );
}


class 컴포넌트

방법1 constructor 로 state를 생성한다.

이 때 this.props 의 정의를 위해 super() 선언을 해 주어야 한다.

이때 들어가는 값이 state의 초기값이다.

class ClassComp extends Component{

  constructor(props) {
    super(props);
    this.state = { 이름: '' };
  }

  render(){
    return (
      <h1>
        {this.state.이름}
      </h1>
    );
  }
}


방법2 class field 에 변수를 선언한다.

ES6 이후 함수와 변수의 선언을 해당 인스턴스 bind를 기본으로 해서 작성할 수 있다.

변수 선언은 const , let 없이 바로 선언하면 되며, 함수는 화살표함수 ()=>{} 의 형태여야 한다.

class ClassComp extends Component{

  state = { 이름: '' }

  render(){
    return (
      <h1>
        {this.state.이름}
      </h1>
    );
  }
}






함수 호출

function 컴포넌트

state가 개별적인 변수로 호출이 되어 있으므로 (this 를 사용하는 것이 아니므로) 일반적으로 호출한다.

function FuncComp(props){

  const [ 이름, set이름 ] = useState('');

  return(
    <button onClick={function(){
      console.log(이름);
    }}>
      클릭하세요
    </button>
  );
}


class 컴포넌트

class 내부의 프로퍼티를 사용하므로 this를 바인딩 해 주어야 한다.

그냥 호출할 경우 this가 전역인 window를 바라보면서 해당 프로퍼티를 찾지 못한다.

class ClassComp extends Component{

  state = { 이름: '' }

  render(){
    return(
      <button onClick={function(){
        console.log(this.state.이름);
      }.bind(this)}>
        클릭하세요
      </button>
    );
  }
}






life cycle

function 컴포넌트

useEffect() Hook 을 import 해서 사용한다.

useEffect() 의 첫번째 인자로는 호출할 함수를 입력하고, 두번째 인자로는 배열의 형태로 state를 넣을 수 있다.

배열이 없으면 마운트, 업데이트 직전에 해당 함수를 실행하고, 빈 배열이면 마운트 시에만 실행된다.

배열에 state가 있으면, 마운트시와 해당 state의 값 업데이트 시에만 실행된다.

state가 여러개인데 배열로는 하나의 state 만 지정하면, 지정한 state를 제외한 나머지 state가 변경 될 때에는 실행되지 않는다.

function FuncComp(props){

  useEffect(()=>{
    console.log('마운트 or 업데이트 되었습니다.');

    return(()=>{
      console.log('언마운트 or Did업데이트 되었습니다.');
    });
  });

  return(
    <h1>
      내용
    </h1>
  );
}

위 컴포넌트가 마운트 또는 업데이트되면 콘솔창에는 ‘마운트 되었습니다.’ 가 출력된다.

마운트 시에만 호출하고 싶다면 useEffect(함수, []); 의 형태로 빈 배열을 넣어준다.

만약 언마운트 또는 Did업데이트 시 함수를 실행하고 싶다면 useEffect(함수) 의 함수 내부에서 언마운트시 실행할 함수를 return 하면된다.

위 컴포넌트의 언마운트 또는 Did업데이트 시에는 콘솔에 ‘언마운트 되었습니다.’ 가 출력 될 것이다.


class 컴포넌트

class 컴포넌트는 render() 실행 전, 즉 컴포넌트가 마운트 되기 전에 componentWillMount() 를 먼저 실행하고, render() 실행 후에, 즉 마운트가 되고 난 후에 componentDidMount() 를 실행해서 마운트에 대해 원하는 타이밍에 원하는 코드를 적용할 수 있다.

class ClassComp extends Component{

  componentWillMount(){
    console.log('마운트 되었습니다.');
  }
  componentDidMount(){
    console.log('마운트가 완료되었습니다.');
  }
  render(){
    console.log('렌더 되었습니다.');

    return(
      <h1>
        내용
      </h1>
    );
  }
}

위 컴포넌트가 마운트되면 콘솔창에는 ‘마운트 되었습니다.’, ‘렌더 되었습니다.’, ‘마운트가 완료되었습니다.’ 가 차례로 출력된다.

언마운트 시에 함수를 호출하고 싶다면 componentWillUnmount() 를 사용한다.


마운트가 아닌 재렌더(업데이트)에 대해 코드를 실행하고 싶다면 shouldComponentUpdate(), componentWillUpdate(), componentDidUpdate() 를 사용한다.

class ClassComp extends Component{

  shouldComponentUpdate(nextProps, nextState){
    console.log('업데이트 여부를 결정합니다.');
    return true;
  }
  componentWillUpdate(nextProps, nextState){
    console.log('업데이트를 실행합니다.');
  }
  componentDidUpdate(prevProps, prevState){
    console.log('업데이트가 완료되었습니다.');
  }
  render(){
    console.log('업데이트 되었습니다.');

    return(
      <h1>
        내용
      </h1>
    );
  }
}

shouldComponentUpdate() 에서 업데이트 조건을 지정하고, return 하는 boolean 값에 따라 업데이트를 실행 여부가 결정된다.

Will 및 Did 는 마운트에 대한 메서드와 비슷하다.

위 코드 실행 후 state 값이 변경되면 콘솔에는 ‘업데이트 여부를 결정합니다.’, ‘업데이트를 실행합니다.’, ‘업데이트 되었습니다.’, ‘업데이트가 완료되었습니다.’ 순으로 호출된다.






Hook 이 생기면서 Function 형 컴포넌트도 Class형 컴포넌트와 비슷한 효과를 낼 수 있게 되었다.

필요에 따라서 자신만의 custom Hook도 만들 수 있다고 한다.

정말 재밌는 기능이다.