Nota: Questo post è stato pubblicato al momento in cui React NON supporta ES6 (v12).Ereditarietà React ed ES6
Ho un classe ES6:
class BaseClass {
getInitialState(){
return {message: 'Hello!'};
}
render() {
return (
<div>
<div>{this.state.message}</div>
</div>
)
}
}
Che posso esportare in ES6 usando questa espressione (fonte: react ES6 browserify)
export default React.createClass(BaseClass.prototype)
Questo funziona bene. Ora vorrei usare ES6 ereditarietà per estendere il mio BaseClass
classe:
class ExtendedClass extends BaseClass{
getInitialState(){
return {message: "Hello! I'm an extension"};
}
}
Ma quando chiamo React.createClass
sulla classe ExtendedClass
, ho ottenuto la seguente eccezione:
Invariant Violation: ReactCompositeComponentInterface: You are attempting to define `constructor` on your component more than once. This conflict may be due to a mixin.
So Reagire 0,13 si suppone essere più amichevoli di ES6 ma esiste un modo per gestirli?
EDIT:
sto usando Traceur per compilare le mie classi ES6. L'uscita per ExtendedClass
assomiglia:
function ExtendedClass() {
"use strict";
if (BaseClass !== null) {
BaseClass.apply(this, arguments);
}
}
for (BaseClass____Key in BaseClass) {
if (BaseClass.hasOwnProperty(BaseClass____Key)) {
ExtendedClass[BaseClass____Key] = BaseClass[BaseClass____Key];
}
}
____SuperProtoOfBaseClass = BaseClass === null ? null : BaseClass.prototype;
ExtendedClass.prototype = Object.create(____SuperProtoOfBaseClass);
ExtendedClass.prototype.constructor = ExtendedClass;
ExtendedClass.__superConstructor__ = BaseClass;
ExtendedClass.prototype.getInitialState = function() {
"use strict";
return {message: "Hello! I'm an extension"};
};
React.createClass(ExtendedClass.prototype);
getInitialState non deve essere usato con il codice di ES6. Invece, imposta il tuo stato iniziale nel costruttore, 'costruttore (oggetti di scena) {super (oggetti di scena); this.state = {message: 'Hello!'}} ' – widged
Questo post è stato pubblicato al momento in cui React NON supporta ES6 (v12). Non è più rilevante. Ovviamente con React v13 tutto funziona correttamente e non è necessario utilizzare la soluzione menzionata. – JBE