如何使用异步更新编写shouldComponentUpdate

我的React类EventTable具有几种模式,并且根据该模式,它从服务器获取不同的数据并将其显示在<Table>中。我首先让类显示静态数据,并且效果很好,包括通过prop从更高的组件切换mod。但是后来我从获取(ApiHelper中的updateData()函数)切换到动态数据,现在遇到了问题。

我找不到正确的shouldComponentUpdate函数。在当前状态下,该类在获取之前完成渲染,因此在初始模式下,该类不显示任何内容,而在模式更改时,该类将显示上一次获取的数据。

例如,我尝试将shouldComponentUpdate中的旧数据与新数据进行比较,或者仅在eventsLoaded为true时才进行更新,并在获取之前将其设置为false,但是这样就破坏了组件的更新方式无限,有时在更改模式时会闪烁,并导致服务器流量垃圾邮件。

class EventTable extends React.Component {
    constructor(props)
    {
        super(props);
        this.state = {
            eventsLoaded: false,data: undefined
        };
    }

    componentDidmount() {
        this.updateData();
    }

    componentDidUpdate() {
        this.updateData();
    }

    shouldComponentUpdate(nextProps,nextStates) {
        return this.props.mode !== nextProps.mode;
    }

    updateData() {
        if(this.props.mode === 0)
            ApiHelper.getallEvents().then((result) => this.setState({data: result,eventsLoaded: true}));
        else if(this.props.mode === 1)
            ApiHelper.getMemberEvents(this.props.userToken).then((result) => this.setState({data: result,eventsLoaded: true}));
        else
            ApiHelper.getPastEvents().then((result) => this.setState({data: result,eventsLoaded: true}));
    }

   render() {
        //rendering a <Table> using this.state.data
   }
}
luohuancssl2008 回答:如何使用异步更新编写shouldComponentUpdate

shouldComponentUpdate在这里没有帮到您;这只会使事情变得更困难(设置状态时防止组件重新渲染)。我暂时将其淘汰,仅在将响应性能视为问题(尤其是将原因视为原因)时才考虑实施它。

然后,您要将前一个道具与下一个道具检查(当前在shouldComponentDidUpdate中)添加到componentDidUpdate,并且仅在道具更改后才调用this.updateData。如果不将其包装在条件中,则它将在每次渲染后触发,这可能导致循环行为。

有了这些更改,初始渲染和对mode道具的更改都将触发对updateData的调用,这将发出请求并更新状态,这将触发渲染。渲染之后,componentDidUpdate将启动,但会看到道具没有更改,因此它不会尝试重新获取。

本文链接:https://www.f2er.com/3078644.html

大家都在问