Ich bin gerade dabei, unsere React-Komponenten auf ein Upgrade auf React 16 vorzubereiten, wobei der Kern dieses Prozesses ein Update von Komponenten ist, die mit das Schlüsselwort class
verwenden.Wie kann ich die Ereignisbehandlungsroutinen einer React-Komponentenklasse korrekt binden, wenn ich von createClass in das Klassenschlüsselwort umwandle?
Ich habe Probleme, wenn es um Event-Handler geht, die Klassenmethoden aufrufen, da ich immer den Can only update a mounted or mounting component
Fehler sehe.
Ein triviales Beispiel ...
Original-Komponente React.createClass
:
const Foo = React.createClass({
getInitialState() {
return { bar: false };
},
onClick() {
this.setState({ bar: !this.state.bar });
},
render() {
return (
<div>
<p>{this.state.bar ? 'YAY' : 'BOO'}</p>
<button onClick={this.onClick}>CLICK IT</button>
</div>
);
},
});
Das wie erwartet funktioniert. Also dies tut, wenn ich bereit bin, zu ignorieren, dass ein neues Funktionsobjekt wird bei jedem Aufruf zu render
erstellt werden:
class Foo extends React.Component {
constructor(props) {
super(props);
this.state = { bar: false };
}
render() {
return (
<div>
<p>{this.state.bar ? 'YAY' : 'BOO'}</p>
<button onClick={() => { this.setState({ bar: !this.state.bar }); }}>CLICK IT</button>
</div>
);
}
}
aber ich kann nicht den „bind im Konstruktor“ Ansatz zu arbeiten:
class Foo extends React.Component {
constructor(props) {
super(props);
this.state = { bar: false };
this.onClick = this.onClick.bind(this);
}
onClick() {
this.setState({ bar: !this.state.bar });
}
render() {
return (
<div>
<p>{this.state.bar ? 'YAY' : 'BOO'}</p>
<button onClick={this.onClick}>CLICK IT</button>
</div>
);
}
}
ich kann auch nicht die Eigenschaft initializer Syntax Ansatz an der Arbeit:
class Foo extends React.Component {
constructor(props) {
super(props);
this.state = { bar: false };
}
onClick =() => {
this.setState({ bar: !this.state.bar });
}
render() {
return (
<div>
<p>{this.state.bar ? 'YAY' : 'BOO'}</p>
<button onClick={this.onClick}>CLICK IT</button>
</div>
);
}
}
In diesen beiden Fällen, wenn ich auf die Schaltfläche klicken die zuvor genannte Fehlermeldung zeigt i up In der Browser-Konsole.
Ich hoffe, jemand hat dieses Problem bereits selbst begegnet und hat Ratschläge, wie man damit umgeht. Ich stelle mir vor, dass es nur etwas Triviales ist, dass ich komplett übersehe. :)
Vielen Dank im Voraus!
Können Sie versuchen 'onClick() { this.setState ((prevState) => ({bar: prevState.bar})); } ' –
Das ist ein separates Problem; Beide Bindungsmethoden funktionieren ordnungsgemäß. –
Damit die Klasseneigenschaften funktionieren, müssen Sie sie transformieren. Sie sind momentan nicht in einem Babel Preset enthalten, da sie noch ein Vorschlag sind. Sie müssen [stage-2] (https://babeljs.io/docs/plugins/preset-stage-2/) aktivieren. –