Maximum call stack überschritten Fehler in ReactJS. Kann mir jemand erklären, was Los ist??? (Snippet auf JSFiddle)
Ich bin neu ReactJS und versuchte, meine Hände auf ein einfaches Projekt. Im Grunde, das snippet erstellen Sie eine Liste von Freunden aus einem array und gibt die Gesamtzahl der Freunde.
Aus irgendeinem Grund, ich bemerkte, dass die incrementFriendsCount Funktion löst ein "Maximum call stack überschritten Fehler", wenn ich einen neuen Freund
Das code-snippet unten ist auch verfügbar auf JSFiddle.
JS:
var HelloUser = React.createClass({
getInitialState: function() {
return {
name: "Toyosi",
friends: ["Susanna", "Jibola", "Worreva"],
friendsCount: 0
}
},
addFriends: function(friend) {
this.setState({
friends: this.state.friends.concat([friend])
});
},
componentWillMount: function() {
this.setState({
friendsCount: this.state.friends.length
});
},
incrementFriendsCount: function() {
this.setState({
friendsCount: this.state.friends.length
});
},
render: function() {
return ( < div >
Villain: {
this.state.name
}, No of friends: {
this.state.friendsCount
} < br / >
< AddingTheFriend addNew = {
this.addFriends
}
incCount = {
this.incrementFriendsCount
}
/>
<ListFriends enemies={this.state.friends} / >
< /div>
);
}
});
var ListFriends = React.createClass({
propTypes: {
enemies: React.PropTypes.array.isRequired
},
render: function() {
var allFriends = this.props.enemies.map(function(friend){
return <li>{friend}</li > ;
});
return ( < div > Her evil friends:
< ul > {
allFriends
} < /ul>
</div >
)
}
});
var AddingTheFriend = React.createClass({
getInitialState: function() {
return {
newFriend: ''
}
},
propTypes: {
addNew: React.PropTypes.func.isRequired
},
updateNewFriend: function(change) {
this.setState({
newFriend: change.target.value
});
},
addTheFriend: function() {
this.props.addNew(this.state.newFriend);
this.setState({
newFriend: ''
})
},
componentWillReceiveProps: function() {
this.props.incCount();
},
render: function() {
return ( < div >
< input type = "text"
value = {
this.state.newFriend
}
onChange = {
this.updateNewFriend
}
/>
<button type="button" onClick={this.addTheFriend}>Add Friend</button >
< /div>
)
}
});
React.render(<HelloUser / > , document.getElementById('app'));
HTML:
<script src="http://fb.me/react-js-fiddle-integration.js"></script>
<div id="app"></div>
Ich werde es begrüßen, wenn jemand könnte werfen mehr Licht auf, warum dieser Fehler geworfen wird.
- Es funktioniert gut für mich. Die einzige Warnung, die ich bin zu sehen ist in Bezug auf
className
(siehe: facebook.github.io/reagieren/docs/...)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wird, die Sie anrufen
this.props.incCount
imcomponentWillReceiveProps
setzt den Status des übergeordneten Komponente und der Effekt wird sein, dassAddingTheFriend
ist erneut gerendert, undthis.props.incCount
erneut aufgerufen wird. Daher der stack-überlauf.Anderen Rat wäre, dass im Allgemeinen Sie wollen, seien Sie vorsichtig und verwenden Sie
setState
so wenig wie möglich in so wenigen Komponenten wie möglich. Erhöhen Sie einfach die Freunde zu zählen zur gleichen Zeit, die Sie concat neuen Freund zu übergeordneten Komponente Zustand.Hier ist die codepen --viel besser als JSFiddle meiner Meinung nach.
setState
s ich rufen, bevor die render-Funktion.Als zukünftige Referenz für Leute mit dem gleichen Fehler-Ausgang bei Verwendung reagieren:
Dieser Fehler wird auch auftreten, Sie führen Sie Ihre app mit beiden
Also: Wenn Sie führen Sie Ihre server mit --hot und haben auch die hotModuleReplacementPlugin aktiviert in Ihrem webpack config dann kommt man in die situation, dass Ihre Komponenten werden rekursiv aktualisieren und generieren so genau die Fehlermeldung, die der OP erwähnt.
Einfache Lösung: Weglassen eines der beiden Dinge, z.B. das weglassen der "- hot", da Sie bereits das plugin für die.
In meinem Fall war es eine Endlosschleife, oder wenn Sie möchten, eine offensichtliche logische Fehler.