Ich lerne React und für das Training möchte ich eine grundlegende Todo App erstellen. Für den ersten Schritt möchte ich eine Komponente namens AddTodo erstellen, die ein Eingabefeld und eine Schaltfläche rendert und jedes Mal, wenn ich etwas in das Eingabefeld eingib und den Knopf drücke, möchte ich den Wert des Eingabefeldes an eine andere aufgerufene Komponente übergeben TodoList und an die Liste anhängen.Uncaught RangeError Maximale Callstackgröße in React App überschritten
Das Problem ist, wenn ich die App starte, die AddTodo Komponente rendert erfolgreich aber wenn ich etwas eingeben und die Taste drücken, reagiert die App für 2 Sekunden und danach bekomme ich das: Uncaught RangeError: Maximum call stack size exceeded
und nichts passiert.
Code Meine app Quelle: Main.jsx
import React, {Component} from 'react';
import TodoList from 'TodoList';
import AddTodo from 'AddTodo';
class Main extends Component {
constructor(props) {
super(props);
this.setNewTodo = this.setNewTodo.bind(this);
this.state = {
newTodo: ''
};
}
setNewTodo(todo) {
this.setState({
newTodo: todo
});
}
render() {
var {newTodo} = this.state;
return (
<div>
<TodoList addToList={newTodo} />
<AddTodo setTodo={this.setNewTodo}/>
</div>
);
}
}
export default Main;
AddTodo.jsx
import React, {Component} from 'react';
class AddTodo extends Component {
constructor(props) {
super(props);
this.handleNewTodo = this.handleNewTodo.bind(this);
}
handleNewTodo() {
var todo = this.refs.todo.value;
this.refs.todo.value = '';
if (todo) {
this.props.setTodo(todo);
}
}
render() {
return (
<div>
<input type="text" ref="todo" />
<button onClick={this.handleNewTodo}>Add to Todo List</button>
</div>
);
}
}
AddTodo.propTypes = {
setTodo: React.PropTypes.func.isRequired
};
export default AddTodo;
TodoList.jsx
import React, {Component} from 'react';
class TodoList extends Component {
constructor(props) {
super(props);
this.renderItems = this.renderItems.bind(this);
this.state = {
todos: []
};
}
componentDidUpdate() {
var newTodo = this.props.addToList;
var todos = this.state.todos;
todos = todos.concat(newTodo);
this.setState({
todos: todos
});
}
renderItems() {
var todos = this.state.todos;
todos.map((item) => {
<h4>{item}</h4>
});
}
render() {
return (
<div>
{this.renderItems()}
</div>
);
}
}
export default TodoList;