React-countdown-now 不更新渲染

Posted

技术标签:

【中文标题】React-countdown-now 不更新渲染【英文标题】:React-countdown-now not updating on render 【发布时间】:2019-01-08 10:28:45 【问题描述】:

我正在使用 React 和 Flux 创建一个 Mission Clock 网络应用。

代码可以在这里找到:https://github.com/jcadam14/Flux-Mission-Clock

现在它非常基础,我是 React 和 Flux 的新手,而且我已经很长时间没有接触过任何 javascript(从事单体 Java 应用程序业务太久了)。这是为了获得概念证明,以便我可以基于 React/Flux 进行设计。

基本概念是“下一次联系”计时器倒计时,当它在完成前 1 分钟到达时,计数器的方框会变为红色。然后当 NextContact 计时器完成时,CurrentContact 计时器启动,并且新的 NextContact 计时器应该启动。

在 NextContact 组件完成并应该使用新的 NextContact 更新之前,一切正常。组件中的文本和样式更新,但倒计时没有开始倒计时。它保持新值但不启动计时器。

每次由于其他原因发生渲染时,NextContact 组件都会再次更新一个新的时间,但不会开始计数。

但是,如果我在任何文件中保存任何更改(我正在使用带有 module.hot 活动的 Visual Studio Code),那么计数器就会启动并且实际上会在它应该在的地方找到。所以看起来有些东西并没有像我预期的那样完全呈现变化。

我尝试使用 forceUpdate 但没有任何效果,我尝试了各种获取 Counter 组件的方法但没有任何效果。

任何帮助将不胜感激。我希望一旦我搞定并理解所有调度的工作原理,应用程序的其余部分应该就位(计时器是应用程序的核心组件,其他一切都相当简单)。

编辑:我也尝试使用 Countdown 编写一个简单的计时器应用程序,但这次使用 Redux,同样的事情发生了。所以我想问题可能是你如何强制组件重新初始化自己?

谢谢! 杰森

【问题讨论】:

【参考方案1】:

好吧,我最终只写了自己的计数器,这里是:

import React,Component from 'react';

const formatValues = (days,hours,minutes,seconds) =>

    const hourString = ('0' + hours).slice(-2);
    const minString = ('0'+ minutes).slice(-2);
    const secString = ('0' + seconds).slice(-2);
    return (days + ':' + hourString + ':' + minString + ':' + secString);


class MCCountdown extends Component

    constructor(props)
    
        super(props);
        this.state = 
            endDate:this.props.endDate,
            countdown:'0:00:00:00',
            secondRemaining:0,
            id:0
        
        this.initializeCountdown = this.initializeCountdown.bind(this);
        this.tick = this.tick.bind(this);
    

    componentDidUpdate(prevProps, prevState)
    
        if(this.props.endDate !== prevProps.endDate)
        
            clearInterval(prevState.id);
            this.setState(endDate:this.props.endDate);
            this.initializeCountdown();
        
    

    componentDidMount()
    
        this.initializeCountdown();
    

    tick() 
        const values = this.getTimeRemaining(this.state.endDate);
        this.setState(countdown:formatValues(values),secondRemaining:values.secondsLeft);
        if(values.secondsLeft <= 0)
        
            clearInterval(this.state.id);
            if(this.props.onComplete)
            
                this.props.onComplete();
            
            return;
        
        else
        
            if(this.props.onTick)
            
                this.props.onTick(this.state.secondRemaining);
            
        
      

      getTimeRemaining(endtime)
        const total = Date.parse(endtime) - Date.parse(new Date());
        const seconds = Math.floor( (total/1000) % 60 );
        const minutes = Math.floor( (total/1000/60) % 60 );
        const hours = Math.floor( (total/(1000*60*60)) % 24 );
        const days = Math.floor( total/(1000*60*60*24) );
        return 
          secondsLeft: total,
          days,
          hours,
          minutes,
          seconds
        ;
    

    initializeCountdown()
        const values = this.getTimeRemaining(this.state.endDate);
        const id = setInterval(() => this.tick(),1000);
        this.setState(id:id,countdown:formatValues(values),secondRemaining:values.secondsLeft);
      

    render()
    
        const countdown = this.state;
        return(<div>countdown</div>);
    


export default MCCountdown

这成功了。似乎我尝试过的计时器/计数器可能缺少该 componentDidUpdate() 方法,因为一旦我将其添加到我的 MCCountdown 中,当在组件上设置新日期时时钟会重新启动。

不确定这是否是最漂亮的,但它确实有效,我现在对此非常满意。

【讨论】:

在componentWillUnmount方法中取消异步任务。 componentWillUnmount() clearInterval(this.state.id);

以上是关于React-countdown-now 不更新渲染的主要内容,如果未能解决你的问题,请参考以下文章

React Redux Store 更新,但组件不重新渲染

设置状态后渲染组件不更新

在重新渲染时反应不更新属性

数组状态更新后反应不重新渲染

热模块更换 - 更新但不重新渲染

组件重新渲染时状态不更新?