es6クラスを使用する場合のReactの「super()」と「super(props)」の違いは何ですか?


回答:


710

1を渡す必要がある唯一の理由があるpropsにはsuper()

this.propsコンストラクタでアクセスしたい場合。

通過:

class MyComponent extends React.Component {    
    constructor(props) {
        super(props)

        console.log(this.props)
        // -> { icon: 'home', … }
    }
}

不合格:

class MyComponent extends React.Component {    
    constructor(props) {
        super()

        console.log(this.props)
        // -> undefined

        // Props parameter is still available
        console.log(props)
        // -> { icon: 'home', … }
    }

    render() {
        // No difference outside constructor
        console.log(this.props)
        // -> { icon: 'home', … }
    }
}

渡すか渡さないことに注意propsするにはsuper持っていない何の効果の後の用途にthis.props外をconstructor。つまりrendershouldComponentUpdateまたはイベントハンドラ常にそれへのアクセス権を持っています。

これは、同様の質問に対する 1つのソフィーアルパートの回答で明示的に述べられています。


ドキュメント— 状態とライフサイクル、クラスへのローカル状態の追加、ポイント2 —推奨:

クラスコンポーネントは、常にで基本コンストラクターを呼び出す必要がありますprops

ただし、理由はありません。サブクラス化のためか、将来の互換性のためかと推測できます。

(リンクをありがとう@MattBrowne)


16
他の回答がより多くの票を得ているにもかかわらず、私はあなたが正しいと思います。this.propsundefined渡されない限りsuper()です。どちらにしても、後のレンダリングや関数this.props内での可用性には影響しませんrender()
Micros '29年

3
@Rotareti、いや、実際にはクラスの残りの部分はこの構成に依存していません、それがポイントです。コンポーネントは、コンストラクタパラメータとは異なる方法で小道具を受け取ります。また、最初の小道具をsuperに渡すので、コンストラクターでそれらを参照できます。
Robin Pokorny

7
Reactのドキュメントによると、必ずfacebook.github.io/react/docs/…に渡しpropssuper()ください。あなたが指摘しているように、他の方法でいずれかの方法でアクセスできるため、理由はわかりません...おそらく、Reactの将来のバージョンがコンストラクターで何かをしたい場合に備えて、将来の互換性のためにこれを推奨しているのでしょうか?this.propsprops
Matt Browne 2017年

23
たぶん私はちょうどここワームの缶を開けるんだけど、なぜ今まで渡しpropssuperあなたが指摘したように、とき、propsパラメータは、私たちは、コンストラクタ内で使用する権利が提供され、そしてthis.props他のどこでも動作しますか?使用this.propsするだけのメリットはありpropsますか?propsコンストラクターで分解するのは悪い習慣ですか?私はまだあなたがこれまでに合格する必要があるだろう場合を見に失敗していると思うpropssuper、私はそれがヘクタール、ちょうど私の無知だ賭けることを喜びました。
インディーズキッド2017

9
を使用する場合は、propsパラメータをそれらのメソッド/関数に渡す必要なく、のようにfromコンストラクタsuper(props)使用するメソッドを呼び出すことができます。この質問への回答によれば、私はこれを行うコンストラクタを書いたところです。this.props this.doStuffUsingThisDotProps()super(props)
ビクターザマニアン2018年

54

この例では、React.Componentクラスを拡張しており、ES2015仕様に従って、子クラスコンストラクターは呼び出されるthisまで使用できませんsuper()。また、ES2015クラスコンストラクターは、super()サブクラスの場合に呼び出す必要があります。

class MyComponent extends React.Component {
  constructor() {
    console.log(this); // Reference Error
  }

  render() {
    return <div>Hello {this.props.name}</div>;
  }
}

対照的に:

class MyComponent extends React.Component {
  constructor() {
    super();
    console.log(this); // this logged to console
  }

  render() {
    return <div>Hello {this.props.name}</div>;
  }
}

この優れたスタックオーバーフローの回答による詳細

React.Component呼び出さないクラスを拡張することによって作成されたコンポーネントの例が表示されるsuper()場合がありますが、これらにはがないconstructorため、なぜそれが必要ないのかがわかります。

class MyOtherComponent extends React.Component {
  render() {
    return <div>Hi {this.props.name}</div>;
  }
}

私が話をしたいくつかの開発者から私が見た混乱の1つの点は、何も持たずconstructor、したがってsuper()どこも呼び出さないコンポーネントがまだメソッドでthis.props利用できるというrender()ことです。このルールとこれthisはにconstructorのみ適用されるバインディングを作成する必要があることに注意してくださいconstructor


15
おかげであなたの答えのためにたくさん、それは私の元の質問(の違い答えていないsuper()としますsuper(props))。
Misha Moroshko

46

に渡すpropssuper、小道具がに割り当てられthisます。次のシナリオを見てください。

constructor(props) {
    super();
    console.log(this.props) //undefined
}

あなたがするときはどのように:

constructor(props) {
    super(props);
    console.log(this.props) //props will get logged.
}

リストのベストアンサー。
Basavaraj Hadimani

この答えは半分正解です。この例はコンストラクターメソッド専用です。たとえば、super(props)を記述しない場合でも、renderメソッドの下のthis.propsは割り当てられており、利用可能です。上記の唯一の理由は、コンストラクターでthis.propsを使用する場合です。
Ofear

12

あたりとしてソースコード

function ReactComponent(props, context) {
  this.props = props;
  this.context = context;
}

あなたpropsは小道具を持っているたびに合格しなければならず、それらをthis.props手動で入れないでください。


1
これについてはまだはっきりしていません。あなたが見れば、これらの 2つのコンポーネントは、1つの呼び出しを見ることができますsuper(props)し、他にはありません。しかし、彼らの消費者は両方とも小道具を設定します。違いはなんですか?
15年

これは、ことを意味しているthis.props = propssuper(props)同じものですか。
reectrix

1
本当じゃない。ReactElementthis.propsは、コンストラクターで行われた内容に関係なく、実際には「外部」から設定します。
Robin Pokorny、2016年

11

Dan Abramovがこのトピックに関する記事を書きました。

なぜ私たちはスーパー(小道具)を書くのですか?

そして、その要点は、このシナリオを回避するために合格する癖があると役立つことです。正直に言うと、起こりそうにないと思います。

// Inside React
class Component {
  constructor(props) {
    this.props = props;
    // ...
  }
}

// Inside your code
class Button extends React.Component {
  constructor(props) {
    super(); // 😬 We forgot to pass props
    console.log(props);      // ✅ {}
    console.log(this.props); // 😬 undefined 
  }
  // ...
}

8

super() 親コンストラクターを呼び出すために使用されます。

super(props)props親コンストラクタに渡されます。

あなたの例から、引数として渡されるコンストラクタをsuper(props)呼び出します。React.Componentprops

詳細superhttps : //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/super


18
はい、そうです。しかし、なぜですか?そして、Reactで必要な2つのフォームの1つはいつですか?
Bergi

7

constructor()Reactコンポーネント内に関数を実装する場合、これsuper()は必須です。MyComponentコンポーネントがReact.Component基本クラスから機能を拡張または借用していることに注意してください。

この基本クラスには、constructor()Reactコンポーネントをセットアップするためのコードが組み込まれた独自の関数があります。

クラスconstructor()内で関数を定義する場合MyComponent、基本的にconstructor()は、React.Componentクラス内の関数をオーバーライドまたは置換しますが、この内部のすべてのセットアップコードを確認する必要があります。constructor()関数引き続き呼び出される。

したがって、React.Componentconstructor()関数が確実に呼び出されるようにするために、を呼び出しますsuper(props)super(props)parents constructor()関数への参照です。それだけです。

super(props)定義するたびに追加する必要がありますconstructor()クラスベースのコンポーネント内で関数ます。

そうしないと、呼び出しが必要であることを示すエラーが表示されます super(props)

これを定義する全体の理由 constructor()関数は、状態オブジェクトを初期化することです。

状態オブジェクトを初期化するために、スーパーコールの下に次のように記述します。

class App extends React.Component {
  constructor(props) {
      super(props);

      this.state = {};
   }

  // React says we have to define render()
  render() {
    return <div>Hello world</div>;
  }
};

constructor()メソッドを定義し、JavaScriptオブジェクトを作成して状態オブジェクトを初期化し、それにプロパティまたはキーと値のペアを割り当て、その結果をに割り当てましたthis.state。もちろん、これはここでの例にすぎないので、キーと値のペアを状態オブジェクトに割り当てていません。空のオブジェクトです。


4

これが私が作ったフィドルです:jsfiddle.net。小道具はデフォルトではコンストラクターに割り当てられていないことを示しています。私が理解しているように、彼らは方法に取り憑かれていReact.createElementます。したがってsuper(props)、スーパークラスのコンストラクターが手動でにアクセスpropsする場合にのみ呼び出す必要がありますthis.props。あなたが単に延長した場合、React.Component呼び出しsuper(props)は小道具では何もしません。多分それはReactの次のバージョンで変更されるでしょう。


3

ここではコンストラクターでこれを取得しないため、未定義が返されますが、コンストラクター関数の外部でこれをフェッチできます

class MyComponent extends React.Component {
  constructor() {
    console.log(this); // Reference Error i.e return undefined
  }

  render() {
    return <div>Hello {this.props.name}</div>;
  }
}

super()を使用している場合は、コンストラクタ内の「this」変数もフェッチできます

class MyComponent extends React.Component {
  constructor() {
    super();
    console.log(this); // this logged to console
  }

  render() {
    return <div>Hello {this.props.name}</div>;
  }
}

したがって、super();を使用している場合は、これをフェッチすることはできますが、this.propsはコンストラクターで定義されません。しかし、コンストラクター以外では、this.propsは未定義を返しません。

super(props)を使用する場合は、コンストラクター内でもthis.props値を使用できます

ソフィーアルパートの回答

this.propsをコンストラクターで使用する場合は、スーパーに小道具を渡す必要があります。それ以外の場合、Reactはコンストラクターを呼び出した直後に外部から.propsをインスタンスに設定するため、問題になりません。


3

反応バージョン16.6.3では、super(props)を使用して状態要素を初期化します:this.props.name

constructor(props){
    super(props);        
}
state = {
  name:this.props.name 
    //otherwise not defined
};
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.