2015-10-23 16 views
8

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およびdefaultPropsComponentTwoであり、これらは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これを行うには、他の方法はありますか?

+0

は点に注意してください: 「あなたは、静的プロパティは__proto__' 'を経由して、そこから継承されたクラスから継承している場合、これは広くあり多くの古いブラウザでは問題が発生する可能性があります。 注: '__proto__'はIE <= 10ではサポートされていないので、静的プロパティは継承されません。 ソース:https://babeljs.io/docs/advanced/caveats/ – Raspo

+0

コンストラクタで 'super.propTypes'マージを試みましたか? –

+0

@Mat私はそうではありませんが、既定値が既に設定されているので、 'props'がコンストラクタに入っているとすれば、それは遅すぎると思います。 – ericsoco

答えて

0

奇妙なことに、superを使用すると、静的メソッドに使用できます。私はそれも静的なプロパティのために動作するはずだと思います。私には、それから、それが直接のスーパークラス名を使用するために、より自然な感じ:superを使用するように、

export default class ComponentTwo extends ComponentOne { 
    static propTypes = _.merge({}, ComponentOne.propTypes, { 
    baz: React.PropTypes.number 
    }); 
} 

しかし、私は考えることができる1つの回避策は、残念ながら持っていると思われる、プロパティを初期化するための静的メソッドを使用しています手動で呼び出される静的プロパティを持つクラスを継承する場合

class ComponentTwo extends ComponentOne { 
    static _init() { 
    this.propTypes = _.merge({}, super.propTypes, { 
     baz: React.PropTypes.number 
    }); 
    } 
} 
ComponentTwo._init(); 
+0

これは私の記事の終わりに提案のリファクタリングではありませんか? 'Object.assign'の代わりに' lodash'を使用していますか?私の問題は、「スーパー」クラスを参照するのではなく、明示的に「ComponentOne」を参照していることです。あなたが 'extends'ステートメントでそれを参照しなければならないので大したことではありませんが、理想的ではありません。 – ericsoco

+0

はい、その通りですが、正しい方法で_merge_を使用しています。 –

+0

もう一つの選択肢が追加されました。私はそれが悪いと思っています。 –