createClass
構文はReactコンポーネントを作成する元の方法でしたが、それはclass
構文とステートレス機能コンポーネントのために段階的に廃止されているようです。
コンポーネントをcreateClass
からclass
にアップグレードする場合、いくつかの重要な相違点があります。あなたが特定のコンポーネントの初期状態とデフォルトのプロパティを返すメソッドを宣言することができcreateClass
で
初期状態&デフォルトの小道具
。
React.createClass({
getInitialState() {
return { foo: 'bar' };
},
getDefaultProps() {
return { baz: 'qux' };
},
componentDidMount() {
console.log(
this.state, // => { foo: 'bar' }
this.props // => { baz: 'qux' }
);
}
});
両方がクラス構文のために変更されました。代わりに、コンストラクタ内で初期状態を割り当てます。
class extends React.Component {
constructor() {
super();
this.state = { foo: 'bar' };
}
}
そして、デフォルトのプロンプトを静的プロパティとして宣言します。
class Qux extends React.Component {}
Qux.defaultProps = { baz: 'qux' };
ミックスイン
createClass
構文を使用すると、既存のライフサイクルメソッドを強化し、他のコードを提供することを可能にミックスインと呼ばれる概念をサポートしています。それが搭載されるたび
const logOnMount = {
componentWillMount() {
console.log('Mounted!', new Date());
}
};
React.createClass({
mixins: [logOnMount]
});
logOnMount
ミックスインを使用して、任意のコンポーネントは、コンソールにタイムスタンプを記録します。
class
という構文のミックスインはサポートされていませんが、同じことを達成するためにhigher-order componentsを使用できます。
function logOnMount(Component) {
return function(props) {
console.log('Mounted!', new Date());
return (
<Component {...props} />
);
}
}
あなたが安全にthis
の間違ったコンテキストで終わる心配する必要はコールバックとしてコンポーネントメソッドを渡すことができなかったように、自動バインド
はcreateClass
構文は、いくつかの便利な自動バインディングを提供します。
React.createClass({
bar() {
return true;
},
foo() {
this.bar();
},
render() {
return <button onClick={this.foo}>Click</button>;
}
});
onClick
ハンドラは、試してみて、トリガされたイベントとして設定this
でthis.foo
を呼び出すが、this.foo
が正しいコンテキストを持つことがautoboundしたため、エラーがないでしょう。
ここでは同じ例ですが、クラスを使用しています。
class extends React.Component {
bar() {
return true;
}
foo() {
this.bar(); // Error - undefined is not a function
}
render() {
return <button onClick={this.foo}>Click</button>;
}
}
foo
方法はbar
性質を持っていない場合にthis
セットで終わります。
これを回避するには、コンストラクタ内のメソッドを明示的にバインドするか、矢印関数内からメソッドを呼び出す必要があります。
constructor() {
this.foo = this.foo.bind(this);
}
// or
render() {
return <button onClick={e => this.foo()}>Click</button>;
}
"代わりに" ---これらは互換性がありません。 – zerkms