如何在渲染前使用 setState 更新状态

新手上路,请多包涵

我会先声明我是 React.js 的初学者

我创建了一个我正在处理的项目示例,我在其中调用 componentDidMount() 中的 API 并获取一组对象,将其设置为状态。这是它的样子:

 class App extends React.Component {
constructor(props) {
    super(props)
    this.state = {
        thing: []
    }
}
componentDidMount() {
    // Fake API
    const apiCall = () => ({
      data: "test"
    })

    // Fake call
    const data = apiCall()

    this.setState({
        thing: [
            ...this.state.thing,
            data
        ]
    })
}
render() {
    return (
        <div>
            <h1>{ this.state.thing[0].data }</h1>
        </div>
    )
}

}

我知道 setState 在根据文档使用时不能保证更新。我还找到了“forceUpdate()”,文档建议尽可能少地使用它。尽管如此,我尝试使用它,但无济于事。

我能够在 componentDidMount() 运行期间和渲染的 h1 元素中 console.log 新状态,但我无法在渲染中实际显示它,因为它首先渲染一个空状态数组。

我的问题是:有没有办法在我的程序运行渲染之前强制更新我的状态,以便我可以看到它,如果没有,我如何才能看到我的新状态反映在 JSX 中?

原文由 Jacob Lockett 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 275
2 个回答

componentDidMount 在初始渲染后调用,因此,在初始渲染时 this.state.thing[0] 未定义,因此会导致错误,您需要在使用前执行条件检查 this.state.thing[0].status

 componentDidMount() {
    this.setState({
        thing: [
            {
                status: "running",
                test: "testing"
            }
        ]
    });
}

render() {
    return (
        <div>
            {this.state.thing.length > 0? <h1 className="mt-5 mb-5">{ this.state.thing[0].status }</h1>: null
}
            <button className="mt-5" onClick={ this.handleUpdate } value="not running">
                Click to change
            </button>
        </div>
    );
}

原文由 Shubham Khatri 发布,翻译遵循 CC BY-SA 3.0 许可协议

要回答你的问题,是的,有一种方法可以在初始渲染之前设置状态,那就是 componentWillMount 。它是 React 中第一个被调用的生命周期方法。生命周期方法 componentDidMount 在初始渲染后调用。

但是,查看您的代码,我不确定使用 componentWillMount 的用例是什么。而不是在 componentDidMountcomponentWillMount 中设置状态,只需在构造函数中设置默认状态。然后你在初始渲染上有了你想要的状态,并可以相应地根据事件更新它,即你的按钮。

 constructor(props) {
    super(props);
    this.state = {
        thing: [
            {
                status: "running",
                test: "testing"
            }
        ]
    };
}

原文由 suntzu 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题