Reactjs 为什么this.setState不更新状态对象?
我正在React组件中运行一个简单的方法。在计算完这些值之后,我希望将它们设置为state对象并重新启动组件 以下是相关代码:Reactjs 为什么this.setState不更新状态对象?,reactjs,graphql,state,Reactjs,Graphql,State,我正在React组件中运行一个简单的方法。在计算完这些值之后,我希望将它们设置为state对象并重新启动组件 以下是相关代码: `class ManageAuthors extends Component { state = {authors: [], allAuthors: []}; authorLists = allPotentialAuthors => { const allAuthors = allPotentialAuthors.map(mem => ({
`class ManageAuthors extends Component {
state = {authors: [], allAuthors: []};
authorLists = allPotentialAuthors => {
const allAuthors = allPotentialAuthors.map(mem => ({...mem, isCurrent: true});
const authors = this.props.authors.filter({_some other filter code_});
this.setState({authors, allAuthors});
};
render() {
const {authors, allAuthors} = this.state;
console.log('state:', authors, allAuthors);
return (
<Query query={query}>
{({loading, data}) => {
if (!loading && data) {
this.authorLists(data.authors)
}
return (_stuff to return_);
}}
</Query>
);
};
};`
`class ManageAuthors扩展组件{
state={作者:[],所有作者:[]};
authorLists=allPotentialAuthors=>{
const allAuthors=allPotentialAuthors.map(mem=>({…mem,isCurrent:true});
const authors=this.props.authors.filter({u其他一些筛选代码});
this.setState({authors,allAuthors});
};
render(){
const{authors,allAuthors}=this.state;
log('state:',作者,所有作者);
返回(
{({加载,数据})=>{
如果(!正在加载&数据){
this.authorLists(data.authors)
}
返回(返回的内容);
}}
);
};
};`
查询正确激发并返回数据,然后数据被发送到authorLists
方法。每个常量变量都计算正确的值。但是当调用this.setState
方法时,实际上没有任何更新。就像this.setState
方法甚至没有激发一样。是否有什么东西是否阻止this.setState
方法处理/更新本地状态对象?更正以下行:
this.setState({authors, allAuthors});
到
setState
并不总是立即更新状态。如果您需要立即访问该变量,可以传递函数setState并在那里使用该变量
例如:
this.setState({authors, allAuthors}, () => {
//do something with authors or allAuthors or both
console.log(authors); console.log(allAuthors); //log it to see if you get desired result
}
);
React文档解释了这个陷阱:
setState()并不总是立即更新组件。它可能
批处理更新或将更新推迟到以后。这会使读取This.state变得更为困难
在调用setState()之后,这可能是一个陷阱
componentDidUpdate或设置状态回调(设置状态(更新程序、,
回调),其中任何一个都保证在更新后触发
已应用
可以阅读更多关于此的信息。或者在React的文档站点上搜索“setState”。渲染中的
控制台.log
是否显示状态值?是的,控制台.log
显示原始状态:状态={authors:[],allAuthors:[]}
并且从不更新到状态={authors:[…],allAuthors:[…]
。我不这么认为。这是This.setState({authors:authors,allAuthors:allAuthors})的缩写。
。我不想设置authors=allAuthors
,因为它们是两个不同的数组。
this.setState({authors, allAuthors}, () => {
//do something with authors or allAuthors or both
console.log(authors); console.log(allAuthors); //log it to see if you get desired result
}
);