回答:
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
。つまりrender
、shouldComponentUpdate
またはイベントハンドラ常にそれへのアクセス権を持っています。
これは、同様の質問に対する 1つのソフィーアルパートの回答で明示的に述べられています。
ドキュメント— 状態とライフサイクル、クラスへのローカル状態の追加、ポイント2 —推奨:
クラスコンポーネントは、常にで基本コンストラクターを呼び出す必要があります
props
。
ただし、理由はありません。サブクラス化のためか、将来の互換性のためかと推測できます。
(リンクをありがとう@MattBrowne)
this.props
にundefined
渡されない限りsuper()
です。どちらにしても、後のレンダリングや関数this.props
内での可用性には影響しませんrender()
。
super
に渡すので、コンストラクターでそれらを参照できます。
props
てsuper()
ください。あなたが指摘しているように、他の方法でいずれかの方法でアクセスできるため、理由はわかりません...おそらく、Reactの将来のバージョンがコンストラクターで何かをしたい場合に備えて、将来の互換性のためにこれを推奨しているのでしょうか?this.props
props
props
にsuper
あなたが指摘したように、とき、props
パラメータは、私たちは、コンストラクタ内で使用する権利が提供され、そしてthis.props
他のどこでも動作しますか?使用this.props
するだけのメリットはありprops
ますか?props
コンストラクターで分解するのは悪い習慣ですか?私はまだあなたがこれまでに合格する必要があるだろう場合を見に失敗していると思うprops
しsuper
、私はそれがヘクタール、ちょうど私の無知だ賭けることを喜びました。
super(props)
使用するメソッドを呼び出すことができます。この質問への回答によれば、私はこれを行うコンストラクタを書いたところです。this.props
this.doStuffUsingThisDotProps()
super(props)
この例では、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
。
super()
としますsuper(props)
)。
に渡すprops
とsuper
、小道具がに割り当てられthis
ます。次のシナリオを見てください。
constructor(props) {
super();
console.log(this.props) //undefined
}
あなたがするときはどのように:
constructor(props) {
super(props);
console.log(this.props) //props will get logged.
}
あたりとしてソースコード
function ReactComponent(props, context) {
this.props = props;
this.context = context;
}
あなたprops
は小道具を持っているたびに合格しなければならず、それらをthis.props
手動で入れないでください。
this.props = props
とsuper(props)
同じものですか。
this.props
は、コンストラクターで行われた内容に関係なく、実際には「外部」から設定します。
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
}
// ...
}
super()
親コンストラクターを呼び出すために使用されます。
super(props)
props
親コンストラクタに渡されます。
あなたの例から、引数として渡されるコンストラクタをsuper(props)
呼び出します。React.Component
props
詳細super
:https :
//developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/super
constructor()
Reactコンポーネント内に関数を実装する場合、これsuper()
は必須です。MyComponent
コンポーネントがReact.Component
基本クラスから機能を拡張または借用していることに注意してください。
この基本クラスには、constructor()
Reactコンポーネントをセットアップするためのコードが組み込まれた独自の関数があります。
クラスconstructor()
内で関数を定義する場合MyComponent
、基本的にconstructor()
は、React.Component
クラス内の関数をオーバーライドまたは置換しますが、この内部のすべてのセットアップコードを確認する必要があります。constructor()
関数引き続き呼び出される。
したがって、React.Component
のconstructor()
関数が確実に呼び出されるようにするために、を呼び出します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
。もちろん、これはここでの例にすぎないので、キーと値のペアを状態オブジェクトに割り当てていません。空のオブジェクトです。
これが私が作ったフィドルです:jsfiddle.net。小道具はデフォルトではコンストラクターに割り当てられていないことを示しています。私が理解しているように、彼らは方法に取り憑かれていReact.createElement
ます。したがってsuper(props)
、スーパークラスのコンストラクターが手動でにアクセスprops
する場合にのみ呼び出す必要がありますthis.props
。あなたが単に延長した場合、React.Component
呼び出しsuper(props)
は小道具では何もしません。多分それはReactの次のバージョンで変更されるでしょう。
ここではコンストラクターでこれを取得しないため、未定義が返されますが、コンストラクター関数の外部でこれをフェッチできます
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をインスタンスに設定するため、問題になりません。