> 웹 프론트엔드 > JS 튜토리얼 > 상태 부족 구성 요소로 반응 성능을 최적화합니다

상태 부족 구성 요소로 반응 성능을 최적화합니다

Lisa Kudrow
풀어 주다: 2025-02-16 11:35:08
원래의
266명이 탐색했습니다.

Optimizing React Performance with Stateless Components

이 기사는 React의 무국적 구성 요소를 탐색합니다. 이 유형의 구성 요소에는 Optimizing React Performance with Stateless Components 호출이 포함되어 있지 않으며 "소품"및 자식 구성 요소를 수신하는 프로세스 만 포함합니다.

키 포인트 요약

this.state = { ... }

RECT의 무국적 구성 요소에는 호출이 포함되어 있지 않습니다. 그들은 들어오는 "소품"과 하위 구성 요소 만 처리하여 테스트 관점에서 더 간단하고 쉽게 분석 할 수 있습니다.

무국적 구성 요소는 기능적 구성 요소로 변환 될 수 있으며, 이는 순수한 JavaScript와 비슷하며 사용 된 프레임 워크에 대한 의존성이 적습니다. 각 소품의 얕은 비교를 허용하는 메소드가 내장되어있는 react.purecomponent를 사용하여 무국적 구성 요소의 성능을 최적화 할 수 있습니다. recompose는 반응의 기능 구성 요소 및 고급 구성 요소를위한 유틸리티 라이브러리입니다. 소품이 변하지 않을 때 다시 렌더링하지 않고 함수 구성 요소를 렌더링하는 데 사용할 수 있습니다.

무국적 구성 요소는 자체 상태 또는 수명주기 방법을 관리하지 않기 때문에 CODE 볼륨 및 메모리 소비를 줄이기 때문에 React Applications의 성능을 크게 향상시킬 수 있습니다. 그러나 수명주기 방법을 사용하지 않거나 자체 상태를 관리하는 것과 같은 몇 가지 제한 사항도 있습니다.
  • this.state = { … } 기본 사항
  • 코드는 정상적으로 실행됩니다. 매우 기본적이지만 예제를 만듭니다. shouldComponentUpdate 에 주목해야합니다
  • 없이 상태가 없습니다.
  • 는 사용법을 이해하는 데 사용됩니다. 특히 성능 최적화를 수행 할 때는 소품이 실제로 변경되지 않으면 불필요한 재 렌더링을 피해야합니다.
  • 여기의 이벤트 핸들러는 "인라인"입니다. 이 구문은 코드가 처리하는 요소에 가깝기 때문에 편리 하며이 구문은
  • 를 수행 할 필요가 없음을 의미합니다.
이러한 인라인 함수를 사용하면 기능이 렌더링 될 때마다 기능이 생성되어야하므로 성능 손실이 거의 없습니다. 이것은 나중에 자세히 설명합니다.

디스플레이 구성 요소

이제 우리는 위의 구성 요소가 무국적자 일뿐 만 아니라 실제로 Dan Abramov가 디스플레이 구성 요소라고 부르는 것임을 알고 있습니다. 이름 일 뿐이지 만 기본적으로는 가볍고 일부 HTML/DOM을 생성하며 상태 데이터를 처리하지 않습니다.
import React, { Component } from 'react'

class User extends Component {
  render() {
    const { name, highlighted, userSelected } = this.props
    console.log('Hey User is being rendered for', [name, highlighted])
    return <div>
      <h3 style={{fontStyle: highlighted ? 'italic' : 'normal'}}
         onClick={event => {
           userSelected()
         }}>
        {name}
      </h3>
    </div>
  }
}
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
그래서 우리는 그것을 함수로 만들 수 있습니다! 이것은 "시원한"느낌을 줄뿐만 아니라 이해하기 쉽기 때문에 덜 끔찍하게 만듭니다. 입력을 받고 환경과 독립적으로 동일한 출력을 반환합니다. 물론 소품 중 하나가 호출 가능한 기능이기 때문에 "콜백".

다시 작성하자 : <🎜 🎜>

<🎜 🎜> <<>

<,> 기분이 좋아요? 순수한 자바 스크립트처럼 느껴집니다. 사용중인 프레임 워크에 대해 생각하지 않고 쓸 수 있습니다.
import React, { Component } from 'react'

class User extends Component {
  render() {
    const { name, highlighted, userSelected } = this.props
    console.log('Hey User is being rendered for', [name, highlighted])
    return <div>
      <h3 style={{fontStyle: highlighted ? 'italic' : 'normal'}}
         onClick={event => {
           userSelected()
         }}>
        {name}
      </h3>
    </div>
  }
}
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사

<<> 지속적인 재 렌더링 문제 <🎜 🎜> <🎜 🎜> <<>

이 코드를 실행하면 아무것도 변경되지 않더라도 구성 요소가 다시 렌더링 될 것임을 알 수 있습니다! 이것은 지금 큰 문제는 아니지만 실제 응용 분야에서는 구성 요소가 점점 더 복잡해지는 경향이 있으며 모든 불필요한 재 렌더링으로 인해 웹 사이트가 속도가 느려집니다.

<<>이 응용 프로그램을 지금 디버그하기 위해

를 사용하는 경우 렌더링에 시간이 낭비된다는 것을 알게 될 것입니다. 죄송합니다! 무엇을해야합니까? ! 반응이 소품이 다르다고 생각하는 방식을 다루기 위해

를 사용해야한다는 것을 보여주고 있으며, 우리는 그것들이 다르지 않다고 확신합니다. React Lifecycle Hook를 추가하려면 구성 요소가 클래스 여야합니다.

alas <🎜 🎜>. 그래서 우리는 원래 클래스 기반 구현으로 돌아가 새로운 라이프 사이클 후크 방법을 추가합니다 : <🎜 🎜>.

<<> 클래스 구성 요소로 돌아 가기
const User = ({ name, highlighted, userSelected }) => {
  console.log('Hey User is being rendered for', [name, highlighted])
  return <div>
    <h3 style={{fontStyle: highlighted ? 'italic' : 'normal'}}
       onClick={event => {
         userSelected()
       }}>
      {name}
    </h3>
  </div>
}
로그인 후 복사
로그인 후 복사

새로 추가 된

메소드에주의하십시오. 이것은 약간 추악합니다. 더 이상 기능을 사용할 수 없을뿐만 아니라 변경 될 수있는 소품을 수동으로 나열해야합니다. 여기에는

함수 소품이 변하지 않을 것이라는 대담한 가정이 포함됩니다. 이것은 거의 없지만주의가 필요합니다.

그러나 포함 된 앱 구성 요소가 다시 렌더링 되더라도 한 번만 렌더링됩니다! 따라서 이것은 성능에 좋습니다. 그러나 우리는 더 잘할 수 있습니까? react-addons-perf <🎜 🎜> <<> reft.purecomponent Users->User <🎜 🎜><15> 반응 15.3 이후 새로운 구성 요소 기본 클래스가 있습니다. <🎜

라고하며 각 소품의 "얕은 비교"를 만드는 내장 <🎜 🎜> 메소드가 있습니다. 기이! 우리가 이것을 사용하는 경우 특정 소품을 나열 해야하는 사용자 정의 PureComponent 메소드를 폐기 할 수 있습니다. shouldComponentUpdate shouldComponentUpdate <🎜 🎜> <<>

import React, { Component } from 'react'

class User extends Component {
  render() {
    const { name, highlighted, userSelected } = this.props
    console.log('Hey User is being rendered for', [name, highlighted])
    return <div>
      <h3 style={{fontStyle: highlighted ? 'italic' : 'normal'}}
         onClick={event => {
           userSelected()
         }}>
        {name}
      </h3>
    </div>
  }
}
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
로그인 후 복사
시도해 보면 실망 할 것입니다. 매번 렌더링됩니다. 왜? ! 대답은 기능이 앱의 <🎜

메소드에서 매번 재현되기 때문입니다. 이것은 a 기반 구성 요소가 자체 <🎜 일반적으로,이 문제에 대한 해결책은 구성 요소를 포함하는 생성자의 함수를 바인딩하는 것입니다. 먼저, 이렇게한다면 메소드 이름을 5 번 (및 1)를 입력해야한다는 것을 의미합니다.

<<> (생성자에서) userSelected <🎜 🎜> <<> (메소드 정의 자체로) render PureComponent <<> (사용자 구성 요소의 렌더링이 정의되는 경우) <🎜 🎜> shouldComponentUpdate() 또 다른 문제는 알 수 있듯이 true 메소드가 실제로 실행되면 폐쇄에 따라 다르다는 것입니다. 특히, 반복자의 범위 변수

에 의존합니다.

<,>는이 문제에 대한 해결책이 있습니다.이 문제는 먼저

메소드를 <🎜 🎜>에 바인딩 한 다음 메소드가 (자식 구성 요소에서) 호출되면 <🎜 🎜> (또는 그 이름을 전달하는 경우입니다. ) 돌아 가라. 다음은 이와 같은 해결책입니다.
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿