ES7には、static
プロパティとメソッド定義の概念が導入されています。 ES7対応transpilerとともに、これらcan be used in Reactはそうのように、props
ためにバリデータおよびデフォルトを指定するには:React.jsのES7クラスの静的プロパティのオーバーライド/拡張
export default class ComponentOne extends React.Component {
static propTypes = {
foo: React.PropTypes.string
}
static defaultProps = {
foo: 'bar'
}
// ...
}
これは超便利ですが、サブクラスが遊びに来たときにトリッキー取得します。たとえば、以下のモジュールがComponentOne
上記と同じコードベースに追加されたと言う:
export default class ComponentTwo extends ComponentOne {
static propTypes = {
baz: React.PropTypes.number
}
static defaultProps = {
baz: 42
}
// ...
}
私はComponentTwo
はスーパークラス、ComponentOne
のプロパティバリデータおよびデフォルトを「継承」したいと思います。代わりに、propTypes
およびdefaultProps
はComponentTwo
であり、これらはComponentOne
にあり、リアクトはComponentOne
に定義されています。 super
以来
は現在のクラスのプロトタイプへの参照である、とstatic
は、値は、プロトタイプから直接ハング参照することになって、私はこれはうまくいくかもしれないと思った:
import _ from 'lodash';
export default class ComponentTwo extends ComponentOne {
static propTypes = _.merge(super.propTypes, {
baz: React.PropTypes.number
});
}
しかし、これはエラーを生成し、おそらくからバベル:Parsing error: 'super' outside of function or class
。
これは動作しますが、非常に移植性がありません。
export default class ComponentTwo extends ComponentOne {
static propTypes = Object.assign({
baz: React.PropTypes.number
}, ComponentOne.propTypes);
}
はもっときれい/ reusablyこれを行うには、他の方法はありますか?
は点に注意してください: 「あなたは、静的プロパティは__proto__' 'を経由して、そこから継承されたクラスから継承している場合、これは広くあり多くの古いブラウザでは問題が発生する可能性があります。 注: '__proto__'はIE <= 10ではサポートされていないので、静的プロパティは継承されません。 ソース:https://babeljs.io/docs/advanced/caveats/ – Raspo
コンストラクタで 'super.propTypes'マージを試みましたか? –
@Mat私はそうではありませんが、既定値が既に設定されているので、 'props'がコンストラクタに入っているとすれば、それは遅すぎると思います。 – ericsoco