2015-06-04 3 views
3

Я думаю, что некоторые props (например, тема) настолько универсальны среди компонентов, что имеет смысл извлечь их обработку (в суперкласс). Затем следует, что их значение по умолчанию также принадлежит.Inheriting defaultProps from superclass in React

Однако, каков был бы идиотический способ достичь этого в Реагировании?

class Base extends React.Component { 
    bgColor() { 
    switch (this.props.theme) { 
     case 'Summer': return 'yellow'; break; 
     case 'Autumn': return 'grey'; break; 
     case 'Winter': return 'white'; break; 
    } 
    } 
} 
Base.defaultProps = { 
    theme: 'autumn' 
}; 

class Sky extends Base { 
    render() { 
    return <div style={{backgroundColor: this.bgColor()}}>{this.props.clouds}</div>; 
    } 
} 
Sky.defaultProps = { 
    clouds: [] 
}; 

... defaultProps является класса собственности (в отличие от например), и нет наследования.

+0

Если вы ищете решение чисто Реагировать на основе, Вы рассмотрели настройки присланного реквизита в состоянии компоненты, и с помощью 'getInitialState' указать значения по умолчанию, если не был получены никакого реквизита? –

+0

Хм, да, но я думал, что это действительно не принадлежит 'state', поскольку это не то, что меняется –

+1

В этом случае вы можете просто указать значение по умолчанию в' bgColor() '. Если 'this.props.theme == null', верните' 'grey'', в противном случае используйте оператор switch, который у вас уже есть. Я понимаю, что это не так элегантно, как использование суперкласса с поддержкой по умолчанию, но я считаю, что это все равно будет работать. –

ответ

5

При назначении Sky.defaultProps вы скрываете базовые. Если вы хотите их комбинировать, вам нужно будет явно сделать это, например.

Sky.defaultProps = Object.assign({}, Base.defaultProps, { 
    clouds: [] 
}); 
+0

Спасибо, это похоже на правильный способ сделать это, однако, согласно таблицам совместимости с ES6 от kangax, 'Object.assign' еще не поддерживается в' JSX'. –

+1

Поскольку вы использовали классы, я дал стандартный ответ ES6, предполагая, что вы используете Babel. Вы всегда можете использовать '_.extend' или полиполнять его самостоятельно. – loganfsmyth

+0

Я искал «es6-shim», но затем наткнулся на «React .__ spread». Это плохая идея использовать его? –

Смежные вопросы