如何在这里以正确的方法处理道具的状态?它不会更新

时间:2019-01-23 18:32:53

标签: reactjs

尽管html中的state.result是不同且正确的事实,但为什么控制台中的“初始结果”和“最终结果”相同?我说错了吗? 我想输入一个可以在输入时更新结果的文本输入。另外,当您删除带有退格键的字母时,它不会更新。

我在控制台中打印了这些值,但这是因为这些值是过去的值,而不是当前的值。

const diaryDefaultState = {
    loading: false,
    uploadModalVisible: false,
    monthModalVisible: false,
    editModalVisible: false,
    entryUploading: false,
    deleteEntryDisabled: false,
    entries: []
};

export default (state = diaryDefaultState, action) => {

switch (action.type) {

    case 'ENTRIES_LOADING':
        return {
            ...state,
            loading: true
        };
    [..others, don't think these are important for storage, just use during run?..]

2 个答案:

答案 0 :(得分:1)

因为setState处于异步状态。 最终结果控制台日志发生在实际设置状态之前。

(此外,当实际更改发生时,组件会重新渲染,这就是为什么您在html中看到正确值但控制台日志已经发生的原因。)

来自文档

  

setState()不会立即使this.state突变,而是创建一个挂起的状态转换。调用此方法后访问this.state可能会返回现有值。无法保证对setState调用的同步操作,并且可能会批量调用以提高性能。

更改后,您可以传递回调以检查值

this.setState({ key: value }, function () {
    console.log(this.state.key)
})

答案 1 :(得分:0)

使用setState()时,将调用异步函数,并且异步函数不会立即响应。这需要时间。如果需要在setstate()之后检查状态,则应使用

this.setState({result: this.state.result,()=>console.log(this.state.result))

此外,状态更新时,您的组件及其子组件也会重新呈现。因此,您可以在渲染函数中读取更新的状态。