웹 프론트엔드 JS 튜토리얼 React 고차 컴포넌트 예제 분석

React 고차 컴포넌트 예제 분석

May 26, 2018 am 11:51 AM
react 분석하다

이 글은 주로 React 고차 컴포넌트에 대한 심층적인 이해를 제공합니다. React 고차 컴포넌트에 대해 좀 더 명확하게 이해하시기 바랍니다.

1. React에서 HOC(고차 컴포넌트)는 컴포넌트 로직을 재사용하기 위한 고급 기술입니다. HOC는 React API의 일부가 아닙니다. HOC는 구성 요소를 가져와서 새 구성 요소를 반환하는 함수입니다. React에서 컴포넌트는 코드 재사용의 기본 단위입니다.

2. HOC를 설명하려면 다음 두 가지 예를 들어보세요.

CommentList 구성 요소는 주석 목록을 렌더링하고 목록의 데이터는 외부 소스에서 가져옵니다.

class CommentList extends React.Component {

  constructor() {

   super();

   this.handleChange = this.handleChange.bind(this);

   this.state = {

    // "DataSource" is some global data source

    comments: DataSource.getComments()

   };

  }

 

  componentDidMount() {

   // Subscribe to changes

   DataSource.addChangeListener(this.handleChange);

  }

 

  componentWillUnmount() {

   // Clean up listener

   DataSource.removeChangeListener(this.handleChange);

  }

 

  handleChange() {

   // Update component state whenever the data source changes

   this.setState({

    comments: DataSource.getComments()

   });

  }

 

  render() {

   return (

    <p>

     {this.state.comments.map((comment) => (

      <Comment comment={comment} key={comment.id} />

     ))}

    </p>

   );

  }

 }
로그인 후 복사

다음은 블로그 정보를 표시하는 데 사용되는 BlogPost 컴포넌트입니다.

class BlogPost extends React.Component {

  constructor(props) {

   super(props);

   this.handleChange = this.handleChange.bind(this);

   this.state = {

    blogPost: DataSource.getBlogPost(props.id)

   };

  }

 

  componentDidMount() {

   DataSource.addChangeListener(this.handleChange);

  }

 

  componentWillUnmount() {

   DataSource.removeChangeListener(this.handleChange);

  }

 

  handleChange() {

   this.setState({

    blogPost: DataSource.getBlogPost(this.props.id)

   });

  }

 

  render() {

   return <TextBlock text={this.state.blogPost} />;

  }

 }
로그인 후 복사

두 컴포넌트는 서로 다르며 DataSource의 다른 메소드를 호출하고 출력도 다르지만 그 중 대부분의 구현은 동일합니다. :

1. 로딩이 완료된 후 DataSource에 변경 리스너를 추가합니다
2. 데이터 소스가 변경되면 리스너 내부에서 setState를 호출합니다. 3. 제거 후 변경 리스너를 제거합니다

애플리케이션에서는 DataSource에 액세스하고 setState를 호출하는 동일한 패턴이 계속해서 발생합니다. 우리는 이 논리를 한 곳에서만 정의한 다음 여러 구성 요소에서 공유할 수 있도록 이 프로세스를 추상화하려고 합니다.

다음으로 구성 요소를 생성하는 함수를 작성합니다. 이 함수는 두 개의 매개 변수를 받아들이는데, 그 중 하나는 구성 요소이고 다른 하나는 함수입니다. 아래에서는 withSubscription 함수가 호출됩니다

const CommentListWithSubscription = withSubscription(

 CommentList,

 (DataSource) => DataSource.getComments()

);

 

const BlogPostWithSubscription = withSubscription(

 BlogPost,

 (DataSource, props) => DataSource.getBlogPost(props.id)

);
로그인 후 복사

withSubscription 호출 시 전달되는 첫 번째 매개변수는 래핑된 컴포넌트이고, 두 번째 매개변수는 데이터를 검색하는 데 사용되는 함수입니다.


CommentListWithSubscription 및 BlogPostWithSubscription이 렌더링되면 CommentList 및 BlogPost는 DataSource에서 현재 검색된 데이터를 저장하는 data라는 prop을 허용합니다. withSubscription 코드는 다음과 같습니다:

// This function takes a component...

function withSubscription(WrappedComponent, selectData) {

 // ...and returns another component...

 return class extends React.Component {

  constructor(props) {

   super(props);

   this.handleChange = this.handleChange.bind(this);

   this.state = {

    data: selectData(DataSource, props)

   };

  }

 

  componentDidMount() {

   // ... that takes care of the subscription...

   DataSource.addChangeListener(this.handleChange);

  }

 

  componentWillUnmount() {

   DataSource.removeChangeListener(this.handleChange);

  }

 

  handleChange() {

   this.setState({

    data: selectData(DataSource, this.props)

   });

  }

 

  render() {

   // ... and renders the wrapped component with the fresh data!

   // Notice that we pass through any additional props

   return <WrappedComponent data={this.state.data} {...this.props} />;

  }

 };

}
로그인 후 복사

HOC는 입력 구성 요소를 수정하지 않으며 상속을 사용하여 동작을 재사용하지도 않습니다. HOC는 단지 함수일 뿐입니다. 래핑된 구성 요소는 컨테이너의 모든 prop을 허용하고 래핑된 구성 요소의 출력을 렌더링하는 데 사용되는 새 prop(데이터)도 허용합니다. HOC는 데이터가 어떻게 사용되는지, 왜 데이터가 사용되는지 신경 쓰지 않으며 래핑된 구성 요소는 데이터를 어디서 가져오는지 신경 쓰지 않습니다.


withSubscription은 일반적인 기능이므로 매개변수를 원하는 만큼 추가할 수 있습니다. 예를 들어, 래핑된 구성 요소에서 HOC를 추가로 격리하기 위해 데이터 속성의 이름을 구성 가능하게 만들 수 있습니다.


shouldComponentUpdate 구성을 수락하거나 데이터 소스의 매개변수를 구성하세요.

고차 컴포넌트를 사용할 때 주의해야 할 사항이 몇 가지 있습니다.

1. 원본 컴포넌트를 수정하지 마세요. 이것은 매우 중요합니다.

다음과 같은 예가 있습니다:

function logProps(InputComponent) {

 InputComponent.prototype.componentWillReceiveProps = function(nextProps) {

  console.log(&#39;Current props: &#39;, this.props);

  console.log(&#39;Next props: &#39;, nextProps);

 };

 // The fact that we&#39;re returning the original input is a hint that it has

 // been mutated.

 return InputComponent;

}

 

// EnhancedComponent will log whenever props are received

const EnhancedComponent = logProps(InputComponent);
로그인 후 복사

여기에는 몇 가지 문제가 있습니다. 1. 가져온 컴포넌트는 향상된 컴포넌트와 별도로 재사용할 수 없습니다. 2. EnhancedComponent에 다른 HOC를 적용하면 componentWillReceiveProps도 변경됩니다.


함수 유형 구성 요소에는 수명 주기가 없기 때문에 이 HOC는 함수 유형 구성 요소에 적용할 수 없습니다. 함수 HOC는 수정 대신 입력 구성 요소를 컨테이너 구성 요소로 래핑하여 구성을 사용해야 합니다.

function logProps(WrappedComponent) {

 return class extends React.Component {

  componentWillReceiveProps(nextProps) {

   console.log(&#39;Current props: &#39;, this.props);

   console.log(&#39;Next props: &#39;, nextProps);

  }

  render() {

   // Wraps the input component in a container, without mutating it. Good!

   return <WrappedComponent {...this.props} />;

  }

 }

}
로그인 후 복사

이 새로운 logProps는 이전 logProps와 동일한 기능을 가지고 있지만 새로운 logProps는 잠재적인 충돌을 방지합니다. 클래스 유형 구성 요소와 함수 유형 구성 요소에도 동일하게 적용됩니다.

2. 렌더링 메서드에 HOC를 사용하지 마세요

React의 diff 알고리즘은 구성 요소의 ID를 사용하여 기존 하위 트리를 업데이트할지 아니면 이전 하위 트리를 해체하고 렌더링에서 반환된 경우 새 하위 트리를 로드할지 결정합니다. 메소드 구성 요소가 이전에 렌더링된 구성 요소와 동일(===)하면 React는 diff 알고리즘을 통해 이전에 렌더링된 구성 요소를 업데이트합니다. 그렇지 않으면 이전에 렌더링된 하위 트리가 완전히 언로드됩니다.

render() {

 // A new version of EnhancedComponent is created on every render

 // EnhancedComponent1 !== EnhancedComponent2

 const EnhancedComponent = enhance(MyComponent);

 // That causes the entire subtree to unmount/remount each time!

 return <EnhancedComponent />;

}
로그인 후 복사

결과 구성 요소가 한 번만 생성되도록 구성 요소 정의 외부에서 HOC를 사용하세요. 몇몇 경우에는 HOC를 동적으로 적용해야 하며, 라이프 사이클 함수나 생성자에서 이를 수행해야 합니다.

3. 정적 메서드는 수동으로 복사해야 합니다.

때때로 React 구성 요소에 정적 메서드를 정의하는 것이 매우 유용합니다. 컴포넌트에 HOC를 적용하면 원래 컴포넌트가 컨테이너 컴포넌트에 래핑되더라도 반환된 새 컴포넌트에는 원래 컴포넌트의 정적 메서드가 없습니다.

// Define a static method

WrappedComponent.staticMethod = function() {/*...*/}

// Now apply an HOC

const EnhancedComponent = enhance(WrappedComponent);

 

// The enhanced component has no static method

typeof EnhancedComponent.staticMethod === &#39;undefined&#39; // true
로그인 후 복사

반환된 구성 요소가 원본 구성 요소의 정적 메서드를 가지려면 함수 내부에서 원본 구성 요소의 정적 메서드를 새 구성 요소에 복사해야 합니다.


function enhance(WrappedComponent) {

 class Enhance extends React.Component {/*...*/}

 // Must know exactly which method(s) to copy :(

  // 你也能够借助第三方工具

 Enhance.staticMethod = WrappedComponent.staticMethod;

 return Enhance;

}
로그인 후 복사
4. 컨테이너 컴포넌트의 참조는 래핑된 컴포넌트로 전달되지 않습니다.

컨테이너 컴포넌트의 props는 래핑된 컴포넌트로 쉽게 전달될 수 있지만 컨테이너 컴포넌트의 참조는 전달되지 않습니다. 래핑된 구성 요소에. HOC를 통해 반환된 구성 요소에 대한 참조를 설정하면 이 참조는 래핑된 구성 요소가 아닌 가장 바깥쪽 컨테이너 구성 요소를 참조합니다.

관련 추천

React 고차 컴포넌트 소개 예시 공유

Vue 고차 컴포넌트 사용법

아주 간단한 예시를 통해 React.js 고차 컴포넌트의 개념을 이해해보세요

위 내용은 React 고차 컴포넌트 예제 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Oracle 오류 3114에 대한 자세한 설명: 신속하게 해결하는 방법 Oracle 오류 3114에 대한 자세한 설명: 신속하게 해결하는 방법 Mar 08, 2024 pm 02:42 PM

Oracle 오류 3114에 대한 자세한 설명: 이를 신속하게 해결하는 방법, 구체적인 코드 예제가 필요합니다. Oracle 데이터베이스를 개발 및 관리하는 동안 다양한 오류가 발생하는 경우가 많으며 그중 오류 3114는 비교적 일반적인 문제입니다. 오류 3114는 일반적으로 네트워크 오류, 데이터베이스 서비스 중지 또는 잘못된 연결 문자열 설정으로 인해 발생할 수 있는 데이터베이스 연결 문제를 나타냅니다. 이 문서에서는 오류 3114의 원인과 이 문제를 신속하게 해결하는 방법을 자세히 설명하고 특정 코드를 첨부합니다.

PHP에서 중간점의 의미와 사용법 분석 PHP에서 중간점의 의미와 사용법 분석 Mar 27, 2024 pm 08:57 PM

[PHP 중간점의 의미와 사용법 분석] PHP에서 중간점(.)은 두 개의 문자열이나 객체의 속성이나 메소드를 연결하는 데 사용되는 일반적으로 사용되는 연산자입니다. 이 기사에서는 구체적인 코드 예제를 통해 PHP에서 중간점의 의미와 사용법을 자세히 살펴보겠습니다. 1. 문자열 중간점 연산자 연결 PHP에서 가장 일반적인 사용법은 두 문자열을 연결하는 것입니다. 두 문자열 사이에 .을 배치하면 두 문자열을 이어붙여 새 문자열을 만들 수 있습니다. $string1=&qu

PHP, Vue 및 React: 가장 적합한 프런트엔드 프레임워크를 선택하는 방법은 무엇입니까? PHP, Vue 및 React: 가장 적합한 프런트엔드 프레임워크를 선택하는 방법은 무엇입니까? Mar 15, 2024 pm 05:48 PM

PHP, Vue 및 React: 가장 적합한 프런트엔드 프레임워크를 선택하는 방법은 무엇입니까? 인터넷 기술이 지속적으로 발전함에 따라 프런트엔드 프레임워크는 웹 개발에서 중요한 역할을 합니다. PHP, Vue, React는 세 가지 대표적인 프론트엔드 프레임워크로 각각 고유한 특성과 장점을 가지고 있습니다. 사용할 프런트 엔드 프레임워크를 선택할 때 개발자는 프로젝트 요구 사항, 팀 기술 및 개인 선호도를 기반으로 정보를 바탕으로 결정을 내려야 합니다. 이 글에서는 세 가지 프론트엔드 프레임워크인 PHP, Vue, React의 특징과 용도를 비교해보겠습니다.

웜홀 NTT 구문 분석: 모든 토큰을 위한 개방형 프레임워크 웜홀 NTT 구문 분석: 모든 토큰을 위한 개방형 프레임워크 Mar 05, 2024 pm 12:46 PM

Wormhole은 블록체인 상호 운용성의 선두주자로서 소유권, 통제 및 무허가형 혁신을 우선시하는 탄력적이고 미래 지향적인 분산 시스템을 만드는 데 중점을 두고 있습니다. 이 비전의 기초는 단순성, 명확성 및 광범위한 다중 체인 솔루션 제품군으로 상호 운용성 환경을 재정의하기 위한 기술 전문 지식, 윤리적 원칙 및 커뮤니티 조정에 대한 헌신입니다. 영지식 증명, 확장 솔루션 및 풍부한 기능의 토큰 표준이 등장하면서 블록체인은 더욱 강력해지고 상호 운용성은 점점 더 중요해지고 있습니다. 이 혁신적인 애플리케이션 환경에서 새로운 거버넌스 시스템과 실용적인 기능은 네트워크 전반의 자산에 전례 없는 기회를 제공합니다. 프로토콜 빌더는 이제 이 새로운 멀티체인에서 어떻게 기능할지 고민하고 있습니다.

Java 프레임워크와 프런트엔드 React 프레임워크의 통합 Java 프레임워크와 프런트엔드 React 프레임워크의 통합 Jun 01, 2024 pm 03:16 PM

Java 프레임워크와 React 프레임워크의 통합: 단계: 백엔드 Java 프레임워크를 설정합니다. 프로젝트 구조를 만듭니다. 빌드 도구를 구성합니다. React 애플리케이션을 만듭니다. REST API 엔드포인트를 작성합니다. 통신 메커니즘을 구성합니다. 실제 사례(SpringBoot+React): Java 코드: RESTfulAPI 컨트롤러를 정의합니다. React 코드: API에서 반환된 데이터를 가져오고 표시합니다.

Win11의 새로운 기능 분석: Microsoft 계정 로그인을 건너뛰는 방법 Win11의 새로운 기능 분석: Microsoft 계정 로그인을 건너뛰는 방법 Mar 27, 2024 pm 05:24 PM

Win11의 새로운 기능 분석: Microsoft 계정 로그인을 건너뛰는 방법 Windows 11이 출시되면서 많은 사용자는 Windows 11이 더 편리하고 새로운 기능을 제공한다는 사실을 알게 되었습니다. 그러나 일부 사용자는 시스템을 Microsoft 계정에 연결하는 것을 좋아하지 않아 이 단계를 건너뛰기를 원할 수도 있습니다. 이 문서에서는 사용자가 Windows 11에서 Microsoft 계정 로그인을 건너뛰고 보다 개인적이고 자율적인 환경을 달성하는 데 도움이 되는 몇 가지 방법을 소개합니다. 먼저 일부 사용자가 Microsoft 계정에 로그인하기를 꺼리는 이유를 이해해 보겠습니다. 한편으로는 일부 사용자들은 다음과 같은 걱정을 합니다.

Apache2는 PHP 파일을 올바르게 구문 분석할 수 없습니다. Apache2는 PHP 파일을 올바르게 구문 분석할 수 없습니다. Mar 08, 2024 am 11:09 AM

공간 제한으로 인해 다음은 간략한 기사입니다. Apache2는 일반적으로 사용되는 웹 서버 소프트웨어이고 PHP는 널리 사용되는 서버측 스크립팅 언어입니다. 웹 사이트를 구축하는 과정에서 Apache2가 PHP 파일을 올바르게 구문 분석할 수 없어 PHP 코드가 실행되지 않는 문제가 발생하는 경우가 있습니다. 이 문제는 일반적으로 Apache2가 PHP 모듈을 올바르게 구성하지 않거나 PHP 모듈이 Apache2 버전과 호환되지 않기 때문에 발생합니다. 이 문제를 해결하는 방법은 일반적으로 두 가지가 있는데, 그 중 하나는

XML 구문 분석을 위한 Java 라이브러리 비교: 최상의 솔루션 찾기 XML 구문 분석을 위한 Java 라이브러리 비교: 최상의 솔루션 찾기 Mar 09, 2024 am 09:10 AM

소개 XML(Extensible Markup Language)은 데이터 저장 및 전송에 널리 사용되는 형식입니다. Java에서 XML을 구문 분석하는 것은 데이터 교환에서 문서 처리에 이르기까지 많은 응용 프로그램에 필요한 작업입니다. XML을 효율적으로 구문 분석하기 위해 개발자는 다양한 Java 라이브러리를 사용할 수 있습니다. 이 기사에서는 가장 널리 사용되는 XML 구문 분석 라이브러리 중 일부를 특징, 기능 및 성능에 중점을 두고 비교하여 개발자가 현명한 선택을 할 수 있도록 돕습니다. DOM(문서 개체 모델) 구문 분석 라이브러리 JavaXMLDOMAPI: Oracle에서 제공하는 표준 DOM 구현입니다. 개발자가 XML 문서에 액세스하고 조작할 수 있는 개체 모델을 제공합니다. DocumentBuilderFactoryfactory=D

See all articles