Reactjs 为什么this.setState不更新状态对象?

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 => ({

我正在React组件中运行一个简单的方法。在计算完这些值之后,我希望将它们设置为state对象并重新启动组件

以下是相关代码:

`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
  }
);