如果我不应该在 componentWillUpdate 中调用 setState,我该如何更新状态(使用 ReactJS)?

IT技术 javascript reactjs
2021-05-07 20:52:00

当 I setStatein 时componentWillUpdate,会componentWillUpdate在无限循环中运行,并且不会停止触发。

这从来没有给我render机会反映我的变化。如果我不应该使用,我该如何更改状态componentWillUpdate

编辑:我已经有了一些setState不应在 componentWillUpdate 中调用的理解我只是很困惑我应该做什么作为替代方案。

编辑 #2:我开始componentWillReceiveProps时,但当我的父组件更改状态时,我似乎无法触发此功能。我将父母的状态作为props提供给我的孩子。

2个回答

首先要做的是查看此方法的官方文档(链接)。您可以在实际调用函数时读取的位置。

然后阅读常见错误(注):

您不能在此方法中使用 this.setState()。如果您需要更新状态以响应 prop 更改,请改用 componentWillReceiveProps。

你改变状态,React 会自动调用componentWillUpdate.

我知道指南中警告不要这样做,但我不确定我是否可以看到setState从内部调用的问题componentWillUpdate确实,它可能会导致无限递归,除非您当然为该递归提供一个底部(一种打破它的方法)。例如,一种方法可能是检查第二个 ( nextState) 参数,如果满足某些条件(即递归结束时),则componentWillUpdate不再调用setState

作为一个最小的例子,想象一个完全没有属性的组件,只有两个状态。进一步想象第二个状态是从第一个状态异步获取的。例如,第一部分状态可以是提供给 Ajax 调用的某个参数,而第二部分状态是该调用的结果。所以基本上你调用this.setState来配置参数,然后在里面componentWillUpdate你可以做如下的事情(为了简单起见,我使用 awindow.setTimeout作为 Ajax 调用的占位符):

const ComponentWithAsyncState = React.createClass({
    getInitialState: function() {
        return {
            ajaxParams: '',
            ajaxResult: ''
        };
    },
    setAjaxParams: function(params) {
        this.setState({ajaxParams: params});
    },
    componentWillUpdate: function(_, nextState) {
        if (nextState.ajaxParams!=this.state.ajaxParams)
            window.setTimeout(function imagineThisIsAjax() {
                this.setState({ajaxResult: `result from ${nextState.ajaxParams}`});
            }.bind(this), 2000);
    },

当(例如通过此组件管理的某些控件)发生ajaxParams更改时,操作序列将类似于(其中~~>表示异步性):

setAjaxParams --> this.setState --> componentWillUpdate ~~> imagineThisIsAjax --> this.setState --> componentWillUpdate

即第二次调用componentWillUpdate不会导致进一步this.setState,因此递归将在那里结束。