>웹 프론트엔드 >JS 튜토리얼 >React 학습 방법 소개

React 학습 방법 소개

巴扎黑
巴扎黑원래의
2017-08-11 11:11:491448검색

이 글에서는 주로 React에서 고급 컴포넌트의 디커플링에 대해 소개합니다. 이 글에서는 모든 사람의 공부나 업무에 확실한 참고가 되는 컴포넌트 분할 및 디커플링 방법을 소개합니다. 함께 배우는 편집자.

머리말

우리 모두 알고 있듯이 React의 구성 요소는 매우 유연하고 확장 가능합니다. 그러나 비즈니스 복잡성이 증가하고 많은 외부 도구 라이브러리가 도입되면서 구성 요소가 종종 비대해집니다. 단일 책임 원칙을 따르는 몇 가지 일반적인 구성 요소 분할 및 분리 방법을 살펴보겠습니다. 자세한 소개는 다음과 같습니다.

1. 분할 렌더링 기능

구성 요소가 많은 콘텐츠를 렌더링하는 경우, 빠르고 일반적인 방법은 원래의 거대한 렌더링을 단순화하기 위해 하위 렌더링 기능을 만드는 것입니다


class Panel extends React.Component {
 renderHeading() {
 // ...
 }

 renderBody() {
 // ...
 }

 render() {
 return (
 <p>
 {this.renderHeading()}
 {this.renderBody()}
 </p>
 );
 }
}

하위 렌더링 기능을 다시 단순화하기 위해 기능 구성 요소를 사용할 수도 있습니다. 작성 방법, 이 방법은 더 작은 처리 단위를 생성하고 테스트에 더 도움이 됩니다


const PanelHeader = (props) => (
 // ...
);

const PanelBody = (props) => (
 // ...
);

class Panel extends React.Component {
 render() {
 return (
 <p>
 // Nice and explicit about which props are used
 <PanelHeader title={this.props.title}/>
 <PanelBody content={this.props.content}/>
 </p>
 );
 }
}

2. props를 사용하여 요소를 전달합니다

컴포넌트에 상태나 구성이 많으면 다음을 사용할 수 있습니다. 예를 들어 상위 구성 요소가 구성에만 집중하도록 구성 요소를 선언합니다.


class CommentTemplate extends React.Component {
 static propTypes = {
 // Declare slots as type node
 metadata: PropTypes.node,
 actions: PropTypes.node,
 };

 render() {
 return (
 <p>
 <CommentHeading>
  <Avatar user={...}/>

  // Slot for metadata
  <span>{this.props.metadata}</span>

 </CommentHeading>
 <CommentBody/>
 <CommentFooter>
  <Timestamp time={...}/>

  // Slot for actions
  <span>{this.props.actions}</span>

 </CommentFooter>
 </p>
 );
 }
}

부모 구성 요소


class Comment extends React.Component {
 render() {
 const metadata = this.props.publishTime ?
 <PublishTime time={this.props.publishTime} /> :
 <span>Saving...</span>;

 const actions = [];
 if (this.props.isSignedIn) {
 actions.push(<LikeAction />);
 actions.push(<ReplyAction />);
 }
 if (this.props.isAuthor) {
 actions.push(<DeleteAction />);
 }

 return <CommentTemplate metadata={metadata} actions={actions} />;
 }
}

3. 고차 구성 요소 사용

클릭 수를 달성하기 위해 컴포넌트에 하이퍼링크를 걸어 컴포넌트의 ID를 보냅니다. 대부분의 솔루션은 다음과 같습니다


class Document extends React.Component {
 componentDidMount() {
 ReactDOM.findDOMNode(this).addEventListener(&#39;click&#39;, this.onClick);
 }

 componentWillUnmount() {
 ReactDOM.findDOMNode(this).removeEventListener(&#39;click&#39;, this.onClick);
 }

 onClick = (e) => {
 if (e.target.tagName === &#39;A&#39;) { // Naive check for <a> elements
 sendAnalytics(&#39;link clicked&#39;, {
 documentId: this.props.documentId // Specific information to be sent
 });
 }
 };

 render() {
 // ...
 }
}

그러나 코드를 재사용할 수 없고 컴포넌트 재구성이 어려운 등의 문제가 있습니다

고차 컴포넌트를 사용하여 문제를 해결할 수 있습니다. 이러한 문제의 경우 이름에서 알 수 있듯이 고차 컴포넌트는 함수이고, 이를 컴포넌트에 전달하면 새 컴포넌트를 반환합니다


function withLinkAnalytics(mapPropsToData, WrappedComponent) {
 class LinkAnalyticsWrapper extends React.Component {
 componentDidMount() {
 ReactDOM.findDOMNode(this).addEventListener(&#39;click&#39;, this.onClick);
 }

 componentWillUnmount() {
 ReactDOM.findDOMNode(this).removeEventListener(&#39;click&#39;, this.onClick);
 }

 onClick = (e) => {
 if (e.target.tagName === &#39;A&#39;) { // Naive check for <a> elements
 const data = mapPropsToData ? mapPropsToData(this.props) : {};
 sendAnalytics(&#39;link clicked&#39;, data);
 }
 };

 render() {
 // Simply render the WrappedComponent with all props
 return <WrappedComponent {...this.props} />;
 }
 }

 return LinkAnalyticsWrapper;
}

간단한 코드는 다음과 같습니다. 팔로우


class Document extends React.Component {
 render() {
 // ...
 }
}

export default withLinkAnalytics((props) => ({
 documentId: props.documentId
}), Document);

위 내용은 React 학습 방법 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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