使用反应呈现道具实现倒计时的示例代码

  

反应的组件模式可以观看迈克尔·陈的演讲视频,平时大家常听到的反应模式也是特殊,特殊的使用场景很多,譬如react-redux的连接,这里不赘述的相关,感兴趣可以自行了解。

  

首先是这样一个场景,我的业务需要实现倒计时,倒计时你懂得,倒计时经常应用在预告一个活动的开始,像秒杀,像开售抢购等,或者活动的截止。

  

使用反应呈现道具实现倒计时的示例代码

  

我们来梳理一下这个倒计时的功能:

  
      <李>定时更新时间,以秒为度,李   <李>可以更新倒计时的截止时间,比如从10月1日更新为10月2日,李   <李>倒计时结束,执行对应结束逻辑;李   <李>倒计时结束,开启另一个活动倒计时,李   <李>同时有多个倒计时,李   
  

这个时候我便开始编码,考虑代码复用,我用类的模式实现一个倒计时:

        类计时器{   构造函数(时间、countCb timeoutCb) {   这一点。countCb=countCb;   这一点。timeoutCb=timeoutCb;   this.setDelayTime(时间);   }      intervalId=零;      clearInterval=()=比;{   如果(this.intervalId) {   clearInterval (this.intervalId);   }   }//更新倒计时的截止时间   setDelayTime=(时间)=比;{   this.clearInterval ();      如果(){   this.delayTime=时间;   this.intervalId=setInterval(()=比;{   this.doCount ();   },1000);   }   }      doCount=()=比;{   const timeDiffSecond=? {this.delayTime - Date.now ()}’。替换(/\ d{3}/美元,' 000 ')/1000;      如果(timeDiffSecond & lt;=0) {   this.clearInterval ();   如果(typeof。timeoutCb===昂?{   this.timeoutCb ();   }   返回;   }      常量数学天=5匕?timeDiffSecond/86400);   const小时=数学。地板((timeDiffSecond % 86400)/3600);   const分钟=数学。地板((timeDiffSecond % 3600)/60);   常量数学第二=5匕?60 (timeDiffSecond % 3600) %);//执行回调,由调用方决定显示格式   如果(typeof。countCb===昂?{   this.countCb ({   一天,   小时,   分钟,   第二,   });   }   }   }      出口默认计时器;      

通过类的方式可以实现我的上述功能,将格式显示交给调用方决定,计时器只实现倒计时功能,这并没有什么问题,我们看调用方如何使用:

     //这是一个反应组件部分代码   componentDidMount () {//开启倒计时   this.countDownLiveDelay ();   }      componentDidUpdate () {//开启倒计时   this.countDownLiveDelay ();   }      componentWillUnmount () {   如果(this.timer) {   this.timer.clearInterval ();   }   }      计时器=零;      countDownLiveDelay=()=比;{   const {   countDownTime,>   让时延;//倒计时组件   类TimeCountDown扩展组件{   状态={   天:0,   小时:0,   分钟:0,   第二:0,   }      componentDidMount () {   滞后时间=this.props.time;   this.startCountDown ();   }      componentDidUpdate () {   如果(this.props。时间!==时延){   滞后时间=this.props.time;      this.clearTimer ();   this.startCountDown ();   }   }      计时器=零;      clearTimer () {   如果(this.timer) {   clearInterval (this.timer);   这一点。计时器=零;   }   }//开启计时   startCountDown () {   如果延迟时间,,! this.timer) {   这一点。计时器=setInterval(()=比;{   this.doCount ();   },1000);   }   }      doCount () {   const {>   从“进口TimeCountDown TimeCountDown ';   函数formateTimeStr (num) {   返回num & lt;10 & # 63;“0 $ {num}”: num;   }//业务调用倒计时组件   类CallTimer扩展组件{   onTimeout=()=比;{   this.forceUpdate ();   }   呈现(){//传递渲染函数   回报(   & lt;跨风格={styles.statusText}祝辞   距直播还有   & lt; TimeCountDown   时间={时间}   onTimeout={()=比;{this.onTimeout ();}}   渲染={({小时,分钟,秒})=比;{   回报(   & lt; span>   {formateTimeStr(小时)}:{formateTimeStr(分钟)}:{formateTimeStr(秒)}   & lt;/span>   );   }}/比;   & lt;/span>   )   }   }      

对比这种方式,通过传递一个函数呈现方法给到TimeCountDown组件,TimeCountDown组件渲染时执行道具的渲染方法,并传递TimeCountDown的状态进行渲染,这就是渲染道具的模式了,这种方式灵活,优雅很多,很多场景都可以使用这种方式,而无需使用的。

使用反应呈现道具实现倒计时的示例代码