Reactイベントバインディングthisのいくつかの方法

2706 ワード

Reactイベントハンドリング関数バインディングthisの集中方法
Follow me on GitHub
  • Reactイベントハンドラ関数バインディングthisの集中方法
  • 1.コンストラクタに
  • をバインドする.
  • .class propertiesを使用してバインディングする
  • .矢印関数
  • を使用する.
  • .bind()を使用する
  • 現在のReactには、React.create Class関数を用いて作成されたコンポーネントが、thisはコンポーネントの各方法に自動的に結合される3つの方法があります.Class ComponentまたはFuntional Componentを使用する場合は、マニュアルでthisをバインドする必要があります.
    1.コンストラクタに結合する
    class Toggle extends React.Component {
      constructor(props) {
        super(props);
        this.state = {isToggleOn: true};
    
        // This binding is necessary to make `this` work in the callback
        this.handleClick = this.handleClick.bind(this);
      }
    
      handleClick() {
        this.setState(prevState => ({
          isToggleOn: !prevState.isToggleOn
        }));
      }
    
      render() {
        return (
          
        );
      }
    }
    
    ReactDOM.render(
      ,
      document.getElementById('root')
    );
    
    2.class propertiesを使ってバインディングする
    class propertiesはstat-2ドラフトの段階にあります.babelはすでにサポートしています.
    class LoggingButton extends React.Component {
      // This syntax ensures `this` is bound within handleClick.
      // Warning: this is *experimental* syntax.
      handleClick = () => {
        console.log('this is:', this);
      }
    
      render() {
        return (
          
        );
      }
    }
    
    3.矢印関数を使う
    class LoggingButton extends React.Component {
      handleClick() {
        console.log('this is:', this);
      }
    
      render() {
        // This syntax ensures `this` is bound within handleClick
        return (
          
        );
      }
    }
    
    このような方法は、各コンポーネントがレンダリングされるたびに、onClickのコールバック関数が異なる匿名関数であるという潜在的な性能問題があり、このコンポーネントがプロpsを通じてそのサブコンポーネントにフィードバック関数を伝達すると、コンポーネントのレンダリングの度に、転送されるプロpsにおけるコールバック関数の変化によって、サブアセンブリの追加のレンダリングが生じる.(異なるコールバック関数ですが、実際の処理ロジックは全く同じです.)
    4.bindを使う()
    class LoggingButton extends React.Component {
      handleClick() {
        console.log('this is:', this);
      }
    
      render() {
        // This syntax ensures `this` is bound within handleClick
        return (
          
        );
      }
    }
    
    bindは矢印関数を使用するのと同じで、実際にはコンポーネントレンダリングのたびに新しいコールバック関数が生成されます.
    構造関数でのバインディングまたはclass properties特性を使用してバインディングすることを提案していますが、bindと矢印関数は特別なシーンで使用する必要があります.すなわち、追加のパラメータを転送する必要がある場合.