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
,和React拋出那些定義在ComponentOne
。
由於super
是當前類的原型參考,並static
應該參考值直接吊離原型,我想這可能工作:
import _ from 'lodash';
export default class ComponentTwo extends ComponentOne {
static propTypes = _.merge(super.propTypes, {
baz: React.PropTypes.number
});
}
然而,這從生成錯誤,想必Babel:Parsing error: 'super' outside of function or class
。
這工作,但不是很便攜:
export default class ComponentTwo extends ComponentOne {
static propTypes = Object.assign({
baz: React.PropTypes.number
}, ComponentOne.propTypes);
}
是否有任何其他的方式來做到這一點更清潔/可再使用?
與靜態屬性繼承類時,請注意告誡的支持,但您可能會遇到更老的瀏覽器的問題 注意:'__proto__'在IE <= 10不支持,所以靜態屬性不會被繼承。「 來源:https://babeljs.io/docs/advanced/caveats/ – Raspo
您是否嘗試過在構造函數中進行'super.propTypes'合併? –
@Mat我還沒有,但考慮到'props'進入構造函數並且已經設置了默認值,我想這太遲了。 – ericsoco