【发布时间】:2018-06-25 18:21:30
【问题描述】:
我有一个包含 16 个对象的数组,我在构造函数中声明为一个状态:
this.state = {
todos:[...Array(16)].map((_, idx) => {
return {active: false, idx}
}),
}
他们的状态将通过ComponentDidMount 中的 ajax 调用得到更新。
componentDidMount()
{
var newTodos = this.state.todos;
axios.get('my/url.html')
.then(function(res)
{
newTodos.map((t)=>{
if (something something)
{
t.active = true;
}
else
{
t.active = false;
}
}
this.setState({
todos:newTodos,
})
}
}
最后,我渲染它:
render(){
let todos = this.state.todos.map(t =>{
if(t.active === true){
console.log('true'}
else{
console.log('false')
}
})
return (
<div></div>
)
}
它们在控制台中都显示为 active = false,它们从不进入 if 条件。什么时候 我打印出它似乎没有在渲染方法中更新的整个状态。在控制台中显示“下面的值刚刚更新”。
我认为更改ComponentWillMount 中的状态会再次调用渲染函数?
我如何让 React 接受 state 的新值?
【问题讨论】:
-
您能对齐并修复您的
componentWillMount代码吗?乍一看,似乎this.setState调用是在 axios 调用之后调用的,但是您共享的代码既不是对齐属性,也不是所有块都关闭,所以很难说setState是否正在完成从您的then块内部或直接从componentWillMount内部。如果它来自then你要调用它,你要么必须使用箭头函数或保存this上下文,如果它来自componentWillMount那么你应该awaitaxios 调用并使componentWillMountasync -
对不起。我编辑了它
-
然后
map返回一个新数组,它不会原地变异。最后,您的newTodos仍然是您的旧this.state.todos。如果你没有在then回调中使用箭头函数,你仍然需要存储this上下文(哦,它仍然没有正确关闭,then函数错过了),但是对齐做了技巧) -
从未听说过
[...Array(16)].map,很酷的把戏。对于那些不知道的人,Array(16).map实际上并没有迭代任何项目,因为它们是空槽 stackoverflow.com/questions/27433075/…
标签: javascript ajax reactjs state