티스토리 뷰

useCallback

다음의 경우 버튼이 클릭될 때마다, Clicked와 Button rendered가 둘다 출력된다. App이 리렌더링될 때마다 Button도 리렌더링된다.
class App extends Component {
  handleClick() {
    console.log("Clicked")
  }
  render() {
    return (
    	<div>
      	<Button onClick={() => this.handleClick} />
      </div>
    )
  }
}

class Button extends Component {
  render() {
    console.log('Button rendered');
    return <button onClick={this.props.onClick}>버튼</button>
  }
}

 

그러나 constructor 을 만들어 bind하면 버튼은 최초에 렌더된 후 버튼이 클릭될 때마다 Clicked만 출력된다. handleClick이라는 함수가 한 번만 만들어진 뒤 재사용되는 것이다.
class App extends Component {
  constructor(props) {
    super(props);
    this.handleClick = this.handleClick.bind(this);
  }
  handleClick() {
    console.log("Clicked")
  }
  render() {
    return (
    	<div>
      	<Button onClick={this.handleClick} />
      </div>
    )
  }
}

 

함수형 컴포넌트 내에서 useCallback을 사용하면 마찬가지로 함수를 한 번 만든 뒤 재활용한다.
const App = () => {
  const handleClick = useCallback(() => console.log('Clicked'), []);
  return <Button onClick={handleClick} />
}

useCallback에 pass되는 두번째 아규먼트를 의도적으로 빈 어레이로 두면, handleClick 함수는 한 번 만들어진 뒤 갱신되지 않는다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함