React 구성 요소 의 this 구체 적 인 사용

6690 단어 Reactthis
React 구성 요소 의 this 는 무엇 입 니까?
간단 한 구성 요 소 를 만 들 고 렌 더 링 을 통 해 사용자 정의 함수 와 render 의 this 를 각각 출력 합 니 다.

import React from 'react';

const STR = '   ,this  :';

class App extends React.Component{
  constructor(){
    super()
  }

  //    
  handler() {
    console.log(`handler ${STR}`,this);
  }

  render(){

    console.log(`render ${STR}`,this);
    return(
      <div>
        <h1>hello World</h1>
        <label htmlFor = 'btn'>      handler this   </label>
        <input id = "btn" type="button" value = '  ' onClick = {this.handler}/>
      </div>    
    )
  }
}
export default App
결 과 는 그림 과 같다.

render 함수 의 this 는 구성 요소 인 스 턴 스 를 가리 키 고 handler()함수 의 this 는 undefined 입 니 다.왜 그런 가요?
JavaScript 함수 의 this
자 바스 크 립 트 함수 중의 this 는 함수 가 성명 할 때 정 의 된 것 이 아니 라 함수 호출(즉 실행)할 때 정 의 된 것 임 을 잘 알 고 있 습 니 다.

var student = {
  func: function() {
    console.log(this);
  };
};

student.func();
var studentFunc = student.func;
studentFunc();
이 코드 가 실행 되면 student.func()가 student 대상 을 인쇄 한 것 을 볼 수 있 습 니 다.이때 this 가 student 대상 을 가리 키 기 때 문 입 니 다.student Func()는 window 를 인쇄 했 습 니 다.이 때 window 에서 호출 된 this 는 window 를 가리 키 기 때 문 입 니 다.
이 코드 이미지 가 검증 되 었 습 니 다.JavaScript 함수 중의 this 는 함수 가 설명 할 때 가 아니 라 함수 가 실 행 될 때 정 의 됩 니 다.
마찬가지 로 React 구성 요소 도 JavaScript 의 이러한 특성 을 따 르 기 때문에 구성 요소 방법의'호출 자'에 따라 this 가 다 를 수 있 습 니 다.(여기 서'호출 자'는 함수 가 실 행 될 때의 현재 대상 을 말 합 니 다)
"호출 자"가 다 르 면 this 가 달라 집 니 다.
테스트:구성 요소 자체 의 생명주기 함수 와 사용자 정의 함수 에 각각 this 를 인쇄 하고 render()방법 에 각각 this.handler(),window.handler(),onCilck={this.handler}이 세 가지 방법 으로 handler()를 호출 합 니 다.
/App.jsx

 //    
  handler() {
    console.log(`handler ${STR}`,this);
  }

  render(){
    console.log(`render ${STR}`,this);

    this.handler();
    window.handler = this.handler;
    window.handler();

    return(

      <div>
        <h1>hello World</h1>
        <label htmlFor = 'btn'>      handler this   </label>
        <input id = "btn" type="button" value = '  ' onClick = {this.handler}/>
      </div>    
    )
  }
}
export default App

볼 수 있 습 니 다:
  • render 에서 this->구성 요소 인 스 턴 스 앱 대상;
  • render 에서 this.handler()->구성 요소 인 스 턴 스 앱 대상;
  • render 에서 window.handler()->window 대상;
  • onClick ={this.handler} -> undefined
  • 이벤트 트리거 구성 요소 의 불 러 오기,업데이트,마 운 트 해제 과정 을 계속 사용 합 니 다:
    /index.js
    
    import React from 'react'
    import {render,unmountComponentAtNode} from 'react-dom'
    
    import App from './App.jsx'
    
    
    const root=document.getElementById('root')
    
    console.log("    ");
    let instance = render(<App />,root);
    
    window.renderComponent = () => {
      console.log("  ");
      instance = render(<App />,root);
    }
    
    window.setState = () => {
      console.log("  ");
      instance.setState({foo: 'bar'});
    }
    
    
    window.unmountComponentAtNode = () => {
      console.log('  ');
      unmountComponentAtNode(root);
    }
    세 개의 단 추 를 누 르 면 구성 요소 의 불 러 오기,업데이트,마 운 트 해제 과정 을 실행 합 니 다.
    /index.html
    
    <!DOCTYPE html>
    <html>
    <head>
      <title>react-this</title>
    </head>
    <body>
      <button onclick="window.renderComponent()">  </button>
      <button onclick="window.setState()">  </button>
      <button onclick="window.unmountComponentAtNode()">  </button>
      <div id="root">
        <!-- app -->
      </div>
    </body>
    </html>
    프로그램 을 실행 하려 면'마 운 트'를 누 르 고 onClick={this.handler}'클릭'단 추 를 누 르 십시오.'업데이트'와'마 운 트 해제'단 추 를 누 르 면 다음 과 같 습 니 다.

    1.render()와 componentDIdMount(),componentDIdUpdate()등 다른 수명 주기 함수 중의 this 는 모두 구성 요소 인 스 턴 스 입 니 다.
    2.this.handler()의 호출 자 는 render()의 this 이기 때문에 구성 요소 인 스 턴 스 를 인쇄 합 니 다.
    3.window.handler()의"호출 자"는 window 이기 때문에 window 를 인쇄 합 니 다.
    4.onClick={this.handler}의"호출 자"는 이벤트 바 인 딩 입 니 다.원본 이 다양 합 니 다.undefined 를 인쇄 합 니 다.
    -이렇게 혼 란 스 러 운 장면 에 직면 하여 onClick 에서 사용자 정의 구성 요소 방법 을 호출 하고 이 방법 에서 그룹 이 인 스 턴 스 를 가 져 오 려 면 컨 텍스트 즉 컨 텍스트 를 바 꾸 어야 합 니 다.
    자동 귀속 과 수 동 귀속
  • React.create Class 는 내 장 된 마법 이 있 습 니 다.사용 하 는 방법 을 자동 으로 연결 하여 this 가 구성 요소 의 정례 화 대상 을 가리 키 지만 다른 자바 스 크 립 트 류 는 이러한 특성 이 없습니다
  • 그래서 React 팀 은 React 구성 요소 류 에서 자동 연결 을 실현 하지 않 고 문맥 전환 의 자유 권 을 개발 자 에 게 맡 기기 로 결정 했다
  • 4.567917.그래서 우 리 는 보통 구조 함수 에서 바 인 딩 방법의 this 지향:4.567918.
    
    import React from 'react';
    const STR = '   ,this  :';
    class App extends React.Component{
      constructor(){
        super();
        this.handler = this.handler.bind(this);
      }
    //    
      handler() {
        console.log(`handler ${STR}`,this);
      }
    
      render(){
        console.log(`render ${STR}`,this);
        this.handler();
        window.handler = this.handler;
        window.handler();
    
        return(
          <div>
            <h1>hello World</h1>
            <label htmlFor = 'btn'>      handler this   </label>
            <input id = "btn" type="button" value = '  ' onClick = {this.handler}/>
          </div>    
        )
      }
    }
    export default App
    this.handler()를 구성 요소 인 스 턴 스 로 연결 한 후 this.handler()의 this 는 그룹 을 가리 키 며 onClick={this.handler}을 구성 요소 인 스 턴 스 로 인쇄 합 니 다.
    요약:
    React 구성 요소 수명 주기 함수 의 this 지향 구성 요소 인 스 턴 스;
    구성 요소 방법 을 사용자 정의 하 는 this 는 호출 자 에 따라 다 릅 니 다.
    구성 요소 의 사용자 정의 방법 에서 구성 요소 인 스 턴 스 를 가 져 오기 위해 서 는 this 를 그룹 에 수 동 으로 연결 하여 인 스 턴 스 를 사용 해 야 합 니 다.
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기