javascript - 反应.js | 这两个功能有什么不同?
问题描述
我有一个复选框<input type='checkbox' onClick={ this.props.isTicked.bind(this,id)} />
,我还必须执行任务:
state = {
todos: [
{
id:1,
title: 'Earn 10 lvl Faceit',
completed: false
},
{
id:2,
title: 'Achieve 10 badges',
completed: false
}
]
}
所以复选框的 id 等于其任务的 id。然后我想让'isTicked'函数使完成成为一个相反的值。我对每项任务也有风格(真假不同)
<div style ={this.TaskStyle()}>
<p>
<input type='checkbox' onClick={ this.props.isTicked.bind(this,id)} />
{title}
</p>
</div>
任务风格:
TaskStyle = () => {
if (this.props.task_value.completed) {
return {
backgroundColor: 'darkgreen',
fontFamily: 'Arial',
padding:'10px'
}
}
else {
return {
backgroundColor: 'gray',
fontFamily: 'Arial',
padding:'10px'
}
}
}
回到正题,这是 'isTicked' 的工作版本:
this.setState({todos: this.state.todos.map(todo => {
if (todo.id === id) {
todo.completed = !todo.completed
}
return todo
})})
这是我的,我不知道为什么它不起作用....
isTicked = (id) => {
this.state.todos.forEach(todo => {
if (todo.id === id) {
todo.completed = !todo.completed
}
return todo
});
}
有人能帮我吗?)
解决方案
好吧,首先在你的isTicked
函数中,你没有像以前的方法那样设置状态。
其次,map
返回一个您设置为 newState 而forEach
没有设置的新数组。事实上,这是两者之间的唯一区别。
现在,当您进行迭代forEach
并直接更改状态时,React 无法知道状态已更改并且必须触发render
函数。因此,您看不到另一种情况的变化。另一方面,在前一种情况下,当您修改状态时setState
,React 会依次重新渲染组件并看到效果。
就这么简单 :)
不要直接修改状态例如,这不会重新渲染组件:
// Wrong
this.state.comment = 'Hello';
// Instead, use setState():
// Correct
this.setState({comment: 'Hello'});
您可能想阅读以下内容:do-not-modify-state-directly
推荐阅读
- reactjs - 开玩笑:为什么它会因 SyntaxError: Unexpected token 而失败。对于 CSS 类?
- curl - “-o”后面的减号是什么意思?(在 curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash)
- qt - QtCreator 自定义模块问题
- java - JavaPairRDD 可以在 Spark Java 中使用 Array 而不是 Tuple2 吗?
- html - 连续弯曲,但让元素填充父级的高度
- javascript - 如何使用jquery修改iframe标签中的url协议
- php - 图片上传上的未识别索引(PHP,Mysql)
- python - 在matplotlib中对齐不同图的轴
- java - Opencv 在运行时给出拒绝访问错误
- ms-access - MS Access VBA 改进脚本