【发布时间】:2018-08-20 00:49:33
【问题描述】:
我正在通过制作一个简单的待办事项列表来学习 React。一直很喜欢。
当我删除一个待办事项时,它会删除上方点击删除的列表项。我的索引必须关闭,但我找不到原因。
没有奇怪的 css 不对齐每个项目的渲染删除按钮。索引似乎只是针对它上面的项目。
代码(缩短)
handleSubmit(event) {
let newTodos = this.state.todos;
let index = newTodos.length;
if (this.state.input !== "") {
newTodos.unshift({
text: this.state.input,
key: this.state.input
});
}
this.setState({todos: newTodos, input: ""});
event.preventDefault();
this.setLocalStorage();
}
deleteItem(index) {
let todoItems = this.state.todos;
todoItems.splice(index, 1);
this.setState({
todos: todoItems
});
this.setLocalStorage();
}
render() {
return (
<div className="todo-holder">
<form className="todoInput-holder" onSubmit={this.handleSubmit}>
<input type="text" placeholder="To do..." value={this.state.input} onChange={this.handleChange} />
</form>
<ul id="todo-list">
<FlipMove duration={250} easing="ease-out">
{
this.state.todos.map(todos => {
return <li key={todos.key} className="todo-li-item" >
<span className="todo-item">{todos.text}</span>
<span onClick={this.deleteItem} className="delet-todo">✕</span>
</li>;
})
}
</FlipMove>
</ul>
</div>
);
}
想法?
【问题讨论】:
-
另外需要指出的是,你不应该直接操纵状态。在您的
deleteItem方法中,将行从let todoItems = this.state.todos更改为let todoItems = Object.assign({}, this.state.todos);,这将创建状态的副本而不是引用。 -
我发现的错误是:1.
let newTodos = this.state.todos不会创建深拷贝。因此,当使用unshift时,您尝试更改不可变状态。 2. 您需要为映射功能提供唯一键。如果 key 与 input 相同,则可能不唯一,请尝试(new Date()).getTime()。 -
谢谢@FisNaN,我以为我是通过创建一个新变量来间接操纵我的状态——显然不是。使用日期作为键对我来说似乎有点奇怪,但我现在认为它是最好的解决方案。这是终极独特的哈哈
标签: javascript reactjs indexing