ComponentDidMount 中调用的 setState 没有更新状态? [复制]

Posted

技术标签:

【中文标题】ComponentDidMount 中调用的 setState 没有更新状态? [复制]【英文标题】:setState called in ComponentDidMount is not updating the state? [duplicate] 【发布时间】:2018-07-25 21:25:40 【问题描述】:

我是 react-native 的新手,我在这里尝试在加载组件时更新状态。但是状态没有更新。

constructor(props) 
super(props);

this.state = 
 selectedSection: 'None',
 sectionObject:  index: 0, key: '',
 sectionIndex: 0,
 sectionArray: [],
 ;


componentDidMount()

 this.setState(
 sectionObject:  index: this.state.sectionIndex, key: this.state.selectedSection,
 sectionArray: this.state.sectionArray.concat(this.state.sectionObject),
 )
 console.log('sectionObject:',this.state.sectionObject);
 console.log('section array:',this.state.sectionArray);

我在这里做错了什么?

【问题讨论】:

你怎么知道状态没有更新?你在做一些日志记录吗? @Prakashsharma,是的 setState 是异步的。 console.logsetState 之后将显示旧状态。使用setState 回调。 您能告诉我您在这些控制台语句中得到的值是什么吗? 你需要像这样检查日志:this.setState(,()=>console.log(this.state)) 【参考方案1】:

更新

componentDidMount 更新状态,但这是异步的,因此我认为您可以在渲染中看到更新的状态。

class Hello extends React.Component 
    constructor(props) 
        super(props);
        this.state = 
            selectedSection: 'None',
            sectionObject:  index: 0, key: '' ,
            sectionIndex: 0,
            sectionArray: [],
        ;
    

    componentDidMount() 
        this.setState(
            selectedSection: 'Wowowowowow',
        )
    

    render() 
        console.log(this.state.selectedSection)
        return <div>this.state.selectedSection</div>
    


ReactDOM.render(
    <Hello name='World' />,
    document.getElementById('container')
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="container"></div>

【讨论】:

componentDidMount() this.setState(prevState => ( sectionObject: ...prevState.sectionObject, index: this.state.sectionIndex,key:this.state.selectedSection ), () => console.log('sectionObject:',this.state.sectionObject); ) 嘿,我已经在这里提供了解决方案!使用 setState 的函数形式总是好的。就我而言,我使用 prevState 作为参数和 props 以供参考。请记住,setState 调用是异步的。在您的情况下,您在 setState 执行完成之前在控制台日志中打印状态。因此,如果您正在打印状态,则在设置状态后立即可能无法获得当前值。相反,您始终会获得先前的状态值。因此,setState 的函数形式除了我在控制台中打印状态值的另一个参数。【参考方案2】:

当您尝试在那里登录时,您可以看到旧值。尝试登录 setState 回调,如 this setState( key: value , () =&gt; console.log(this.state)); 。 看看这个:https://reactjs.org/docs/react-component.html#setstate , https://medium.learnreact.com/setstate-takes-a-callback-1f71ad5d2296

【讨论】:

以上是关于ComponentDidMount 中调用的 setState 没有更新状态? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

componentDidMount 多个 fetch 调用最佳实践?

间谍在componentDidMount中的方法调用

ComponentDidMount 中调用的 setState 没有更新状态? [复制]

goBack 导航调用后未调用 componentDidMount

为啥 componentDidMount 在 react.js 和 redux 中被多次调用?

Redux状态更新后没有调用ComponentDidMount?