ES6 클래스 기반 React 구성 요소와 기능적 ES6 React 구성 요소를 언제 사용해야합니까?


211

React를 배우는 데 시간을 보낸 후 구성 요소를 만드는 두 가지 주요 패러다임의 차이점을 이해합니다.

내 질문은 언제 어느 것을 사용해야 하는가? 다른 것의 장점 / 무역은 무엇입니까?


ES6 수업 :

import React, { Component } from 'react';

export class MyComponent extends Component {
  render() {
    return (
      <div></div>
    );
  }
}

기능의:

const MyComponent = (props) => {
    return (
      <div></div>
    );
}

나는 그 구성 요소에 의해 조작 될 상태가 없을 때마다 기능적이라고 생각하고 있습니까?

라이프 사이클 메소드를 사용하면 클래스 기반 구성 요소를 사용하는 것이 가장 좋습니다.


7
이미 답을 알고있는 것 같습니다.
Felix Kling 2016 년

2
render 메소드 만있는 컴포넌트가있는 경우이를 기능적인 형태로 전환 할 수 있습니다. 상태 비 저장 렌더 기능 이상의 것이 필요한 경우 클래스를 사용하십시오
just-boris

2
더 간결하게하기 위해 이것을 시도하십시오 :const MyComponent = (props) => <div>...</div>
Viliam Simko

1
피할 수 있으면 절대 기능을 사용하지 않습니다. 필연적으로 클래스 기반의 리팩토링이 필요하기 때문입니다. 그리고 나서 종종 그 후에 기능적으로 리팩토링해야합니다.
keithjgrant

2020 년에 올바른 접근 방식은 기능 구성 요소가 후크를 지원하고 후크가 대안에 비해 성능이 우수하고 구조적으로 우수하기 때문에 가능하면 기능 구성 요소를 사용하는 것입니다.
polkovnikov.ph

답변:


161

당신은 올바른 생각을 가지고 있습니다. 구성 요소가 소품을 가져오고 렌더링하는 것 이상을 수행하지 않으면 기능을 수행하십시오. 동일한 소품이 주어지면 항상 동일하게 렌더링되고 작동하기 때문에 이러한 함수를 순수한 함수로 생각할 수 있습니다. 또한 수명주기 방법에 신경 쓰지 않거나 자체 내부 상태가 있습니다.

가볍기 때문에 이러한 간단한 구성 요소를 기능 구성 요소로 작성하는 것이 매우 표준입니다.

상태를 유지하는 등 구성 요소에 더 많은 기능이 필요한 경우 클래스를 대신 사용하십시오.

추가 정보 : https://facebook.github.io/react/docs/reusable-components.html#es6-classes


편집 : React Hooks가 도입 될 때까지 위의 많은 부분이 사실이었습니다.

  • componentDidUpdate로 다시 복제 할 수 있습니다 useEffect(fn). 여기서 다시 fn렌더링 할 때 실행되는 함수입니다.

  • componentDidMount메소드는을 사용하여 복제 할 수 있습니다 useEffect(fn, []). 여기서, fn렌더링 할 때 실행할 함수 []이며, 이전 렌더링 이후 하나 이상의 값이 변경된 경우에만 컴포넌트가 다시 렌더링 할 객체의 배열입니다. 없는 경우 useEffect()첫 번째 마운트시 한 번 실행됩니다.

  • state를 사용하여 복제 할 수 있습니다 useState(). 이의 반환 값은 상태의 참조 및 상태를 설정할 수있는 함수 (예 :)로 구조화 될 수 있습니다 const [state, setState] = useState(initState). 예를 들어이를보다 명확하게 설명 할 수 있습니다.

const Counter = () => {
  const [count, setCount] = useState(0)

  const increment = () => { 
    setCount(count + 1);
  }

  return (
    <div>
      <p>Count: {count}</p>
      <button onClick={increment}>+</button>
    </div>
  )
}

default export Counter

클래스 오버 기능 구성 요소 사용시기에 대한 권장 사항과 관련하여 Facebook은 공식적으로 가능한 경우 기능 구성 요소 사용을 권장 합니다 . 작은 측면에서, 많은 사람들이 성능상의 이유로 기능적 구성 요소를 사용하지 않는 것에 대해 이야기하는 것을 들었습니다.

"기능 구성 요소에서 렌더링마다 이벤트 처리 기능이 재정의됩니다."

사실이지만 구성 요소가 실제로 그런 속도 나 볼륨으로 렌더링되는지 고려해보십시오.

이러한 경우 useCallbackuseMemo후크를 사용하여 재정의 기능을 방지 할 수 있습니다 . 그러나 이로 인해 코드의 성능이 미세하게 저하 될 수 있습니다. .

그러나 솔직히 React 앱에서 병목 현상을 재정의하는 기능에 대해 들어 본 적이 없습니다. 조기 최적화는 모든 악의 근원입니다-이것이 문제가 될 때 걱정하십시오


상태를 유지하지 않지만 구성 요소와 밀접하게 연결된 기능은 어떻습니까 (예 : 렌더링의 동적 속성 결정).
Dennis

이 구성 요소의 두 가지 유형의 차이에 대한 최고의 기사 반응입니다 : code.tutsplus.com/tutorials/...
아리안 아코 스타

5
React 16.8부터 useState후크 를 통해 기능 구성 요소의 상태를 사용할 수 있습니다 .
Greg

React 16.8부터는 기능 컴포넌트에서 거의 모든 작업을 수행 할 수 있으며 성능에 미치는 영향을 최소화하면서 모든 효과를 모듈화 할 수 있습니다.
polkovnikov.ph

1
어디에서 정보를 찾 Facebook officially recommends using functional components wherever possible습니까?
johannchopin

40

가능하면 항상 상태 비 저장 기능 (기능 구성 요소)을 사용하십시오. 일반 React 클래스를 사용해야하는 시나리오가 있습니다.

  • 구성 요소는 상태를 유지해야합니다.
  • 구성 요소가 너무 많이 다시 렌더링되므로 다음을 통해 제어해야합니다. shouldComponentUpdate
  • 컨테이너 구성 요소 가 필요합니다

최신 정보

이제 얕은 소품 비교를 처리 하는 자체 구현을 구현하는 PureComponent(대신 대신 Component) 확장 할 수 있는 React 클래스 shouldComponentUpdate가 있습니다. 더 읽어보기


43
Always try to use stateless functions (functional components) whenever possible.나는 열 사람이 그 말을 읽었습니다. 여전히 그들 중 누구도 이유를 설명하지 못했습니다.
Rotareti

25
In an ideal world, most of your components would be stateless functions because in the future we’ll also be able to make performance optimizations specific to these components by avoiding unnecessary checks and memory allocations. This is the recommended pattern, when possible.더 많은 정보 : facebook.github.io/react/docs/…
Diogo Cardoso

2
@rotareti 나는 당신이 당신의 질문에 대답했다고 생각하는지 모르겠지만, 순수한 함수는 이해하고 테스트하고 유지하는 것이 훨씬 간단합니다. 동일한 매개 변수가 주어지면 항상 동일한 것을 렌더링합니다. 수명주기 이벤트가 발생할 때 상태를 유지하고 변경하는 구성 요소는 이해하기 어렵습니다. 그들이 때때로 필요하지 않다는 것은 아니지만, 그들의 장점이 필요하지 않다면 원하지 않는 보일러 플레이트와 오버 헤드를 추가하지 않고 이익을 얻는 것이 분명합니다.
door_number_three

자체 이벤트 핸들러 정의가있는 경우 Component 클래스도 작성하려고합니다. 이렇게하면 모든 렌더에서 새로운 함수를 생성하는 대신 해당 이벤트 핸들러를 생성자의 구성 요소에 미리 바인딩 할 수 있습니다. 모든 이벤트 핸들러가 소품에서 나온 경우에는 필요하지 않습니다.
Dobes Vandermeer

인용 된 Facebook 추천은 더 이상 존재하지 않습니다 ( 위의 내 의견 참조).
개렛

34

2019 년 3 월 업데이트

https://overreacted.io/how-are-function-components-different-from-classes/

2019 년 2 월 업데이트 :

반응 고리 의 도입으로 되면 React 팀은 가능한 한 기능적 구성 요소를 사용하는 것처럼 보입니다 (JavaScript의 기능적 특성을 더 잘 준수 함).

그들의 동기 :

1.) Its hard to reuse stateful logic between components
2.) Complex components become hard to understand
3.) Classes confuse both people and machines

후크가있는 기능적 구성 요소 는 위에서 언급 한 단점없이 클래스 구성 요소가 수행 할 수있는 거의 모든 것을 할 수 있습니다.

가능한 빨리 사용하는 것이 좋습니다.

원래 답변

기능적 구성 요소는 클래스 기반 구성 요소보다 더 가볍지 않습니다. -https : //github.com/facebook/react/issues/5677#issuecomment-241190513

위의 링크는 약간 오래되었지만 React 16.7.0의 설명서에는 기능 및 클래스 구성 요소가 나와 있습니다.

"React의 관점과 동일합니다." --https //reactjs.org/docs/components-and-props.html#stateless-functions

구문 이외의 render 메소드를 구현하는 기능 컴포넌트와 클래스 컴포넌트 사이에는 본질적으로 차이가 없습니다.

앞으로 (위의 링크를 인용) "우리는 [반응] 그러한 최적화를 추가 할 수 있습니다."

불필요한 렌더링을 제거하여 성능을 향상시키려는 경우 두 방법 모두 지원을 제공합니다. memo기능성 부품PureComponent 클래스

-https : //reactjs.org/docs/react-api.html#reactmemo

-https : //reactjs.org/docs/react-api.html#reactpurecomponent

정말 당신에게 달려 있습니다. 상용구를 줄이려면 기능을 수행하십시오. 함수형 프로그래밍을 좋아하고 클래스를 좋아하지 않으면 기능적으로 이동하십시오. 코드베이스의 모든 구성 요소간에 일관성을 유지하려면 클래스를 사용하십시오. 와 같은 것이 필요할 때 기능 기반에서 클래스 기반 구성 요소로 리팩토링하는 데 지쳤다면 state클래스를 사용하십시오.


1
모든 구성 요소를 React.Component로 확장하면 특히 새로운 사람들에게 코드를 더 읽기 쉽게 만듭니다. 구성 요소가 매번 같은 방식으로 생성 된 것을 볼 때 좋습니다. @Galupuf가 말했듯이 간단한 컴포넌트에는 "render ()"라는 하나의 메소드 만 있습니다. "this"바인딩, 상태 등을 시작하고 싶을 때 모든 것을 리팩터링 할 필요가 없으므로 필요한 것을 추가 할 수 있기 때문에 모든 것이 React.Component를 확장시키는 것도 좋습니다.
jeffski13

10

React 16.8부터 Stateless Functional 구성 요소라는 용어는 오해의 소지가 있으므로 더 이상 Stateless가 아닌 원인이되므로 피해야합니다 ( React.SFC 사용 중단됨 , Dan Abramov on React.SFC ). 수명주기 방법), 클래스 구성 요소와 다소 겹칩니다.

클래스 기반 구성 요소

기능적 구성 요소 :

Funtional 구성 요소를 선호하는 이유

  • 을 결합 할 수있는 명확하고 간결한 방법입니다 useEffect 후크를 제공 반응 componentDidMount, componentDidUpdatecomponentWillUnmount수명주기 방법
  • 후크를 사용하면 구성 요소간에 쉽게 공유 하고 테스트 할 수있는 로직을 추출 할 수 있습니다
  • 범위 지정에 대한 혼동이 줄어 듭니다

반응 의욕을 후크 (즉, 기능적 구성 요소)를 사용하는 이유에 대해.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.