当前位置: 首页 > 知识库问答 >
问题:

如何知道是否已将所有setState更新应用于React组件中的状态?

司徒光霁
2023-03-14

我正在阅读关于React setState的文档,其中说:

setState()不会立即改变this.state,但会创建挂起的状态转换。调用此方法后访问this.state可能会返回现有值。

现在我有了一个类似这样的组件:

class NoteScreenComponent extends React.Component {

    constructor() {
        super();
        this.state = { note: Note.newNote() }
    }

    componentWillMount() {
        this.setState({ note: this.props.note });
    }

    noteComponent_change = (propName, propValue) => {
        this.setState((prevState, props) => {
            let note = Object.assign({}, prevState.note);
            note[propName] = propValue;
            return { note: note }
        });
    }

    title_changeText = (text) => {
        this.noteComponent_change('title', text);
    }

    body_changeText = (text) => {
        this.noteComponent_change('body', text);
    }

    saveNoteButton_press = () => {
        // Save note to SQL database
        Note.save(this.state.note)
    }

    render() {
        return (
            <View>
                <TextInput value={this.state.note.title} onChangeText={this.title_changeText} />
                <TextInput value={this.state.note.body}  onChangeText={this.body_changeText} />
                <Button title="Save note" onPress={this.saveNoteButton_press} />
            </View>
        );
    }

}

我想知道的是,既然setState不会立即更新状态,我怎么知道我保存在saveNoteButton\u按下的便笺是否是状态的当前版本?是否有一些回调或我可以轮询的东西,以了解状态是否已完全更新?

共有1个答案

那昊
2023-03-14

他们警告的是试图在同一个事件循环中做某事。

method = () => {
  this.setState({ note: 'A' })
  saveNote(this.state.note) // <-- this.state.note will not have been updated yet.
}

或使用以前的状态设置状态:

method = () => {
  let note = this.state.note // possible that `this.state.note` is scheduled to change
  this.setState({ note: note + 'B' })
}

由于用户将在设置状态计划后按下按钮,因此状态将已更新。

…但从理论上讲,让我们想象一下,不知何故,输入事件和按钮发生在同一时刻。。正确的解决方案是什么?如果是单个函数调用,您可能不会使用新状态,因为您已经有了新注释和以前的状态。

method = (text) => {
  let noteToSave = this.state.note + text // old state + new value

  saveNote(noteToSave) // maybe this will fail
    .then(response => this.setState({ note: noteToSave }))
    .catch(err => this.setState({ error: 'something went wrong' }))

  // optimistically update the ui
  this.setState({ note: noteToSave }) 
}

但最有可能的解决方案可能是将所需内容作为参数传递到使用它的位置,而不是尝试访问可能处于竞争状态的状态,因为任何状态转换之后都会发生render

method = (note) => {
  noteToSave(note)
}

render() {
  return (
    <Button onPress={() => this.method(this.state.note)} /> <-- must be up to date here
  )
}
 类似资料:
  • 我试图将“加载”的状态从true更改为false,但当我调用一个函数并在该函数中设置“this.setState({loading:false})”时,加载状态仍然保持true。 在下面的代码中,当按钮按钮函数被调用时,它将“加载”状态设置为真,但当用户成功登录“加载”状态时,应该变为假,这样我的渲染按钮函数将重新渲染,旋转器可以隐藏自己并显示按钮。 为什么LoginSAccess函数中的“加载”

  • 我正在创建一个应用程序,用户可以在其中设计自己的表单。例如。指定字段的名称以及应包括的其他列的详细信息。 该组件在这里可以作为JSFiddle使用。 我最初的状态是这样的: 如何创建以使其更新?

  • 所以我有这个: 只是一个数组的数字例如然而没有给出正确的总数,但?我甚至放了一个超时延迟,看看这是否解决了问题。任何明显的还是我应该发布更多的代码?

  • 我有一个React应用程序,其中来自父组件的道具被传递到子组件,然后道具设置子组件的状态。 如何让它更新子组件上的状态? 我的精简代码:

  • 我想知道记录是否更新了熊猫数据框中的日期。数据框由几列组成,其中对于A的每个值,我们有几个B的值,包括开始日期和结束日期。由于时间戳,我们可以知道是否有新的记录或以前的记录已被修改。 我想知道的是如何能够检查如果一个新记录有一个日期范围接近其他记录在其组中例如B1组如果他们有一个类似的日期范围删除前一个只留下新记录已更新,但如果它没有公共范围来解释为新记录。 例如 输入数据帧: 预期输出: 谢谢你

  • 我正在创建一个应用程序,用户可以在其中设计自己的表单。例如。指定字段的名称和应包含的其他列的详细信息。 该组件在此处作为JSFiddle提供。 我的初始状态如下: 我想在用户更改任何值时更新状态,但我很难定位正确的对象: 我应该如何制作这个。setState以使其更新?