繁体   English   中英

componentDidMount在React Native中持续渲染

[英]componentDidMount is rendering continuously in React Native

我的目标是在其中添加带有进度条的启动屏幕,因此我将react-native-progress用作进度条的库。 并通过执行logincheck将屏幕添加为初始路线。

我正在使用redux,所以我创建了一个操作以在进度栏中执行进度过程,该操作的代码如下:

 export const progressBarLevel = () => {
return (dispatch) => {
    this.progress = 0;
    dispatch({ type: PROGRESS, payload: 0 });
    setTimeout(() => {
        this.indeterminate = false;
        setInterval(() => {
            this.progress += Math.random()/5;
            if(this.progress > 1){
                this.progress = 1;
            }
            return dispatch({ type: PROGRESS, payload: this.progress });
        },250)
    },500)
}
}   

然后,将其连接到减速器以保存进度。 然后将进度条状态导入到初始屏幕并通过道具进行连接。

现在发生了什么事,我已经从componentDidMount()调用了进度操作和登录检查操作,因为两者都正常工作。 但是由于某种原因,进度动作将无限运行,因为我已在控制台上记录了该动作“ return dispatch({type:PROGRESS,payload:this.progress});”,该动作已被无限调度。 我找不到错误的根源。

我的componenetDidMount():

 componentWillMount() {
    this.props.loginCheck(() => {
        this.setState({ isUserAvailble: true})
    })
   this.props.progressBarLevel();
}

我的进度栏代码:

<View style={{ alignItems: 'center' }}>
                    <ProgressBar progress={this.props.progressed} width={200} borderColor="#fff" color="#fff"/>
                </View>

我无法理解问题,如何停止连续渲染。 我什至使用componentWillMount尝试过,我也得到了连续的动作调度。

请指导。

更新

将变量分配给setInterval,然后使用clearInterval进行调用解决了该问题

更新的代码

this.progress = 0;
    dispatch({ type: PROGRESS, payload: 0 });
    setTimeout(() => {
        this.indeterminate = false;
       const interval = setInterval(() => {
            this.progress += Math.random()/5;
            if(this.progress > 1){
                this.progress = 1;
                clearInterval(interval);
            }
            return dispatch({ type: PROGRESS, payload: this.progress });
        },250)
    },500)

查看您的代码,我认为问题是动作分派中的setInterval方法。

它不会被清除并更新您的状态树。

编辑1:您可以尝试在下面的代码中进行明确的间隔。

this.interval = setInterval(() => {
            this.progress += Math.random()/5;
            if(this.progress > 1){
                this.progress = 1;
            }
            if(this.progress === 1 && this.interval){
          clearInterval(this.interval);
}
            return dispatch({ type: PROGRESS, payload: this.progress });
        },250)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM