【发布时间】:2020-10-27 08:18:37
【问题描述】:
我有一个组件,它显示一些待办事项列表,例如
const todosData = [
{
id: 1,
text: "Take out the trash",
completed: true
},
{
id: 2,
text: "Grocery shopping",
completed: false
},
];
我有一个按钮可以触发一个简单的更改:它将字符“1”添加到第一个元素的文本属性中。我的处理程序看起来像这样
handleChange() {
this.setState(prevState => {
const updatedTodos = prevState.todos.map(todo => {
if (todo.id === 1) {
todo.text += 1
console.log(todo.text)
// here i get Take out the trash1, Take...trash111, Take...trash11111 and etc
}
return todo
})
return {
todos: updatedTodos
}
})
}
简单的渲染
render() {
return (
<ul className="todo-list">
{this.state.todos.map(item => <li>{item.text}</li>)}
<button onClick={this.handleChange}>change me</button>
</ul>
)
}
所以我希望在单击后在控制台中看到“取出垃圾 1”以及页面上的相同文本。而不是这个,我按预期在控制台中看到“取出垃圾 1”,但在页面上我看到“取出垃圾 11”,然后看到“取出垃圾 1111”,因为这段代码可以双倍工作,但是为什么在控制台中我看到第一个工作的唯一结果:“取出垃圾1”,“取出垃圾111”?
是的,我知道这样更改项目是不正确的,我应该这样做
todo = {...todo, text: todo.text += 1}
如果我这样写 - 一切正常,而且这段代码还有其他缺陷,实际上这段代码不是我的,但我只是想知道这个魔法是如何发生的:
- 为什么它会工作两次
- 为什么我在控制台中只看到第一个输出
沙盒示例 https://codesandbox.io/s/objective-margulis-0phvx?file=/src/App.js
【问题讨论】:
-
我认为这是因为
todo.text += 1在将 int 添加到字符串时,它会追加而不是增加字符串中的数字。如果您想增加,则必须单独增加数量并附加(这就是您想要做的) -
这实际上正在发生,因为您正在使用函数设置状态。使用
this.setState({ todos: [] })并使用this.state.todos而不是prevState.todos。我有点困惑为什么会这样。 -
对不起,伙计们,我无话可说 - 你的回答并没有让情况更清楚 =)
标签: javascript reactjs setstate