프로젝트에서 사용한 Hooks

  • 리액트 v16.8에 새로 도입된 기능으로 함수형 컴포넌트에서도 상태 관리를 할 수 있는 useState, 렌더링 직후 작업을 설정하는 useEffect 등 기능을 제공
  • 현재 프로젝트에서는 useState, useEffect 그리고 custom Hook useInput을 사용했습니다.

useState

컴포넌트의 State관리를 class의 state 상태 관리가 아니라 function에서도 사용할 수 있게 됐습니다.

useInput.js에서 useState를 사용하고 있는데 어떻게 사용되고 있는지 설명합니다.

  • 예를 들어 Post 컴포넌트에서 좋아요 버튼 상태 관리를 useState로 하고 있는데 어떻게 사용하는지 보겠습니다.
//PostContainer.js 
import React, { useState } from 'react';
...
const PostContainer = ({ 
	...
	isLiked
	...
)} => {
	const [isLikedS, setIsLiked] = useState(isLiked);

	const toggleLike = () => {
    toggleLikeMutation();
    if (isLikedS === true) {
      setIsLiked(false);
      setLikeCount(likeCountS - 1);
    } else {
      setIsLiked(true);
      setLikeCount(likeCountS + 1);
    }
  };
}

useEffect

  • 리액트 컴포넌트가 레더링 될 때마다 특정 작업을 수행할 수 있도록 하는 Hook
  • 특정 값 currentItem이 업데이트 될 때만 실행하기 위해서 어떻게 했을까?

    • useEffect 함수 두번째 파라미터에 [currentItem]을 설정 했습니다.
  • slide기능은 어떤 방법으로 설정했을까?

    • postContainer.js에 사진 slide 기능을 useEffect로 구현했는데 어떻게 구현했는지 설명합니다.
    • rendering이 완료 된후 useEffect 함수가 수행되면서 slide 함수가 동작하면서 setTimeout에 설정한 초마다 setCurrentItem을 해준다.
    • currentItem 변수를 PostPresenter로 전달해 선택된 이미지만 보이도록 css opacity, transition 속성을 통해서 설정할 수 있습니다.
//PostContainer.js 

import React, { useState, useEffect } from 'react';
import PostPresenter from './PostPresenter';

const PostContainer = ({
  ...
  files,
  ...
}) => {
	const [currentItem, setCurrentItem] = useState(0);
	...
	const slide = () => {
    const totalFiles = files.length;
    if (currentItem === totalFiles - 1) {
      setTimeout(() => setCurrentItem(0), 3000);
    } else {
      setTimeout(() => setCurrentItem(currentItem + 1), 3000);
    }
  };

	useEffect(() => {
    slide();
  }, [currentItem]);
	...

	return (
	    <PostPresenter	
				...
	      currentItem={currentItem}
				...
	    />
	  );
}

useInput

  • Header.js에 serach Input에서 useInput을 사용하고 있습니다.
  • input을 입력할때 마다 state를 설정하는 custom hook "useInput"을 만들어 사용하는 곳에서 로직이 줄고 재사용 할 수 있게 됐습니다.
  • custom hook "Input"을 import 한 곳(Header.js)에서 import해 value, onChange를 SearchInput 컴포넌트 value, onChange에 설정하고 있다.
//input.js 
import { useState } from 'react';

export default (defaultValue) => {
  const [value, setValue] = useState(defaultValue);

  const onChange = (e) => {
    const {
      target: { value },
    } = e;
    setValue(value);
  };

  return { value, onChange, setValue };
};

//Header.js 
import Input from './Input';

const HeaderComponent = ({ history }) => {
	const search = useInput('');
	
	return (<SearchInput
	  value={search.value}
	  onChange={search.onChange}
	  placeholder="search"
	/>)
}