在 React.Js 中进行更新后的无限 componentDidUpdate() 渲染

Posted

技术标签:

【中文标题】在 React.Js 中进行更新后的无限 componentDidUpdate() 渲染【英文标题】:infinite componentDidUpdate() rendering after doing an update in React.Js 【发布时间】:2019-11-28 06:19:25 【问题描述】:

我有一个表,我必须在其中更新每一行中的特定字段。当我进行更新时,我正在调用 (GET) 以在 comonentDidUpdate() 中自动更新表的函数被无限执行,如下所示:

这是视图,当我单击其中一个按钮更新循环时,循环开始时没有结束:

这是我目前构建的代码:

const confirm = Modal.confirm;

class AccesConf extends Component 

    constructor() 
        super();
        this.state = 
            accesConf: '',
            test: false
        ;
    

    static getDerivedStateFromProps(nextProps, prevState) 
        if (nextProps.accesConf !== prevState.accesConf && nextProps.accesConf) 
            return  accesConf: nextProps.accesConf ;
        
        else 
            return null;
        
    



    componentDidUpdate(prevProps, prevState) 
        // only update chart if the data has changed
        if (prevProps.accesConf !== this.props.accesConf) 
            this.props.getAccesConfAction()
        
    

    componentDidMount() 
        this.props.getAccesConfAction();
    


    showDeleteConfirmation(value, idConf, record, thisHandler) 
        confirm(
            title: 'Voulez vous supprimer cet contact ?',
            content: '',
            okText: 'Oui, je confirme',
            okType: 'danger',
            cancelText: 'Non',
            onOk() 
                deleteAccesConfRequest(idConf);
                const  accesConf  = thisHandler.state;
                let accesConfs = null;
                accesConfs = accesConf.findIndex((accesConfs) => accesConfs.idConf === idConf);
                accesConf.splice(accesConfs, 1);
                thisHandler.setState( accesConf: accesConf );
                NotificationManager.success("Le contact est supprimé avec succès !", "");
            ,
            onCancel() 
            ,
        );
    

    showUpdateInfoConfirmation(value, idConf, record, thisHandler) 
        confirm(
            title: 'Voulez vous modifier la visibilité d infos employeur ?',
            content: '',
            okText: 'Oui, je confirme',
            okType: 'danger',
            cancelText: 'Non',
            onOk() 
                alert(idConf)
                console.log('idConfcolorAvant', idConf)
                updateAccesConfRequest(idConf);
                console.log('idConfcolorApres', idConf)
                const  accesConf  = thisHandler.state;
                //accesConf.splice(record, 1);
                thisHandler.setState( accesConf: accesConf, test: true );
                NotificationManager.success("L'infos employeur est modifié avec succès !", "");
            ,
            onCancel() 
            ,
        );
    


    render() 
        const data = this.state.accesConf
        const columns = [
            
                title: 'Contacts',
                dataIndex: 'image',
                render: (text, record) => 
                    return <div className="gx-flex-row gx-align-items-center">
                        <img className="gx-rounded-circle gx-size-30 gx-mr-2" src=text  />
                        <p className="gx-mb-0">record.name</p>
                    </div>
                ,
            ,
            
                title: 'Société',
                dataIndex: 'societe',
                render: (text, record) => 
                    return <span className="gx-text-grey">record.societe</span>
                ,
            ,
            
                title: 'Dates',
                dataIndex: 'dates',
                render: (text, record) => 
                    return <span className="gx-text-grey">record.dates</span>
                ,

            ,
            
                title: 'Infos enployeur',
                dataIndex: 'infos',
                render: (text, record) => 
                    if (text === "Privé") 
                        return <Button className="cm-comedien-button-prive"
                            id=record.idConf
                            onClick=e => this.showUpdateInfoConfirmation(e.target.value, record.idConf, record, this)>text
                        </Button>
                     else 
                        return <Button type="primary" style= width: "70%" 
                            id=record.idConf
                            onClick=e => this.showUpdateInfoConfirmation(e.target.value, record.idConf, record, this)>text</Button>
                    
                ,
            ,
            
                dataIndex: 'delete',
                render: (text, record) => 
                    return <span className="gx-pointer">
                        <i className="icon icon-trash gx-pointer gx-text-danger gx-fs-xxl"
                            id=record.idConf
                            onClick=e => this.showDeleteConfirmation(e.target.value, record.idConf, record, this) />
                    </span>
                ,
            ,

        ];


        return (

            < Widget >
                / console.log("TesttttttttttttttNnnnnnnnnnnnnn", data) /
                <div className="gx-table-responsive">
                    <Table className="gx-table-no-bordered" columns=columns dataSource=data pagination=false
                        size="small" />
                </div>
                <NotificationContainer />
            </Widget >
        );
    



const mapStateToProps = ( comedien ) => 
    const  loaderUpdate, alertMessageUpdate, showMessageUpdate, alertMessageStatus, accesConf  = comedien;
    return 
        loaderUpdate,
        alertMessageUpdate,
        showMessageUpdate,
        alertMessageStatus,
        accesConf
    
;

export default connect(mapStateToProps, 
    hideMessageUpdate,
    showUpdateLoader,
    getAccesConfAction
)(AccesConf);

您对此有任何解决方案吗?任何帮助,将不胜感激。

【问题讨论】:

console.log prevProps.accesConf 和 this.props.accesConf 看看它们是否真的不相等。 getAccesConfAction 更改了accesConf 的引用吗? 【参考方案1】:

我看到您正在通过道具调用 getAccesConfAction()。这个函数是什么样子的,你是否在父函数的那个​​函数中做任何 setState 正在重新渲染孩子?这是您遇到无限渲染的可能原因之一。

【讨论】:

以上是关于在 React.Js 中进行更新后的无限 componentDidUpdate() 渲染的主要内容,如果未能解决你的问题,请参考以下文章

超过最大更新深度 - React Js

添加新项目时如何使用无限滚动更新项目列表

使用 React JS 无限滚动

我从 React 得到一个错误:超过最大更新深度

如何在功能性 React JS 组件中获取数据?

React.js拖放 - Drop上的无限循环