【问题标题】:Does React batch props updates in some cases?在某些情况下 React 批处理道具会更新吗?
【发布时间】:2019-03-27 15:11:59
【问题描述】:

我很好奇 React 是否会在极少数情况下批量更新 props?文档中没有提到这一点,但我无法对以下情况提出任何其他解释。

我有一个等价于以下代码:

// Connected component
class MyComponent extends React.Component {
    state = {
        shouldDisplayError: false,
    };

    componentDidUpdate(prevProps) {
        console.log("componentDidUpdate: " + this.props.dataState);
        if (
            prevProps.dataState === "FETCHING" &&
            this.props.dataState === "FETCH_FAILED"
        ) {
            this.setState(() => ({ shouldDisplayError: true }));
        }
    }

    render() {
        return this.state.shouldDisplayError && <p>Awesome error message!</p>;
    }
}

const mapStateToProps = (state) => {
    const dataState = getMyDataStateFromState(state);
    // dataState can be "NOT_INITIALIZED" (default), "FETCHING", "FETCH_SUCCEEDED" or "FETCH_FAILED"
    console.log("mapStateToProps: " + dataState);
    return {
        dataState,
    };
};

export default connect(mapStateToProps)(MyComponent);

// A thunk triggered by a click in another component:
export async const myThunk = () => (dispatch) => {
    dispatch({ type: "FETCHING_DATA" });
    let result;
    try {
        result = await API.getData(); // an error thrown immediately inside of here
    } catch (error) {
        dispatch({ type: "FETCHING_DATA_FAILED" });
        return;
    }
    dispatch({type: "FETCHING_DATA_SUCCEEDED", data: result.data});
}

// Let's say this is the API:
export const API = {
    getData: () => {
        console.log("> api call here <");
        throw "Some error";  // in a real API module, there's a check that would throw in some cases - this is the equivalent for the unhappy path observed
        // here would be the fetch call
    },
}

我希望在控制台中看到触发 API 调用立即失败),如下: p>

mapStateToProps: FETCHING
componentDidUpdate: FETCHING
> api call here <
mapStateToProps: FETCH_FAILED
componentDidUpdate: FETCH_FAILED

但是,我可以看到以下内容:

mapStateToProps: FETCHING
> api call here <
mapStateToProps: FETCH_FAILED
componentDidUpdate: FETCH_FAILED

所以MyComponent 组件从未收到"FETCHING" dataState,尽管它已在mapStateToProps 函数中看到。因此从未显示错误消息。为什么?是因为 React 对组件的 props 进行了如此快速的更新(例如在某些情况下对 this.setState() 的调用)???

基本上,问题是:如果我分派两个动作,彼此非常快,触发组件的道具更新,React 是否批处理它们,有效地忽略第一个?

【问题讨论】:

  • 你是如何触发你的 API 的?我的意思是您在哪里分派任何获取数据的操作?
  • myThunk thunk 是从另一个组件内的 onClick 处理程序分派的。
  • 我在代码中添加了 cmets 使其更清晰。

标签: reactjs redux react-redux redux-thunk


【解决方案1】:

第一次渲染组件时,不会调用 componentDidUpdate。相反,componentDidMount 被调用。在 componentDidMount 中也登录到控制台以查看消息。

【讨论】:

  • 不,实际上在 componentDidMount 中,我会看到“NOT_INITIALIZED”作为数据状态。 dataState 生命周期是 NOT_INITIALIZED -> FETCHING -> FETCH_SUCCEEDED/FETCH_FAILED。可能问题还不够清楚。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-15
  • 2023-04-01
  • 1970-01-01
  • 2020-05-04
  • 1970-01-01
相关资源
最近更新 更多