状态被清除,但输入字段文本不是在React中提交表单之后

时间:2018-01-25 03:22:26

标签: javascript reactjs state

我正在一个简单的待办事项App上练习,用户可以在字段中键入他们的待办事项,然后点击提交以将其添加到待办事项列表中。

一旦表格提交了' this.setState({newTodo:''})'我就设法清除了州。 (再次点击提交表示将添加一个空的待办事项);

但是,输入字段中的文本不会被清除。

const TodoItem = ({ text }) => <li>{text}</li>;

class App extends Component {
constructor(props) {
    super(props);

    this.state = {
        todos: ['walk dog', 'feed cat'],
        newTodo: ''
};

this.handleSubmit = this.handleSubmit.bind(this);
}

handleSubmit(e) {
    e.preventDefault();

    const todos = [...this.state.todos, this.state.newTodo];

    this.setState({ todos, newTodo: '' });
}

render() {
    const { newTodo } = this.state; 
    const todos = this.state.todos.map((todo, index) => <TodoItem key={index} text={todo} />);

    return (
        <div className="App">
            <form onSubmit={this.handleSubmit}>
                <h1>Simple Todo App</h1>

                <input
                    type="text"
                    name="newTodo"
                    value={this.newTodo}

                    onChange={e => this.setState({ [e.target.name]: e.target.value })}
                />

                <ol>
                  {todos}
                </ol>
                <button>SAVE</button>
            </form>
        </div>
    );
}
}

export default App;

感谢您提供任何帮助。

3 个答案:

答案 0 :(得分:2)

e.cancel未定义,使用this.newTodo代替this.state.newTodo

this.newTodo

OR:

<input
     type="text"
     name="newTodo"
     value={this.state.newTodo} 
      onChange={e => this.setState({ [e.target.name]: e.target.value })}
/>

答案 1 :(得分:0)

你看到添加空newTodo的原因是因为你的newTodo初始状态是空的,而在handleSubmit中你总是传递它而不管它是否为空。所以在handleSubmit中检查newTodo状态,然后将newTodo添加到todos数组。

 if(this.state.newTodo != “”){
      const todos = [...this.state.todos, this.state.newTodo];
 }

并将输入字段值属性值更改为newTodo

 <input value={newTodo} />

不要使用this.newTodo

答案 2 :(得分:0)

在以下部分中:

<input
 type="text"
 name="newTodo"
 value={this.newTodo}
 onChange={e => this.setState({ [e.target.name]: e.target.value })}
/>

value={this.newTodo}更改为value={this.state.newTodo}