使用重组时在哪里设置`setInterval`?

Posted

技术标签:

【中文标题】使用重组时在哪里设置`setInterval`?【英文标题】:where to set `setInterval` when working with recompose? 【发布时间】:2019-05-01 15:30:15 【问题描述】:

我正在尝试构建一个简单的计时器,该计时器将在点击时启动和停止。 我所有的项目都是基于功能组件的(使用重组),所以我不确定在哪里设置setInterval

这是我试图玩的东西,直到我完全迷失了在哪里存储 setInterval 所以我可以在 onStop fn 上清除它(这将在一个按钮上触发) - 就像功能一样组件没有this,我可以放置计时器并将其从中删除......功能组件的做法是什么?

https://codepen.io/anon/pen/jQQZrm?editors=0010

有什么建议吗? - 使用本机反应 谢谢。

【问题讨论】:

【参考方案1】:

您需要 3 个不同的状态处理程序:stopTimerstartTimerupdateValue(我使用的命名与您的代码略有不同)。

startTimer 中,您需要创建计时器,该计时器通过计时器运行updateValue。换句话说,您需要从另一个状态处理程序间接调用一个状态处理程序。

有no way doing that。但。您可以将这些处理程序分成两组:“value + updateValue”和“stopTimer + startTimer + intervalId”。然后您将能够从第一组中获取状态处理程序,第二组为props

const EnchanceApp = compose(
  withStateHandlers(
    timer: 0,
  , 
    updateValue: (timer) => 
        () => (timer: timer + 1)
  ),
  withStateHandlers(
    timerId: 0,
  , 
    startTimer: (timerId, updateValue) => 
        () => 
            clearInterval(timerId);
            return 
                timerId: setInterval(updateValue, 1000)
            ;
        ,
    stopTimer: (timerId) => 
        () => clearInterval(timerId)
  )
)(App);

【讨论】:

【参考方案2】:

完美运行,我的代码示例:

const BgList = ( bgs ) => (
  <PoseGroup>
    bgs.map(item => <StyledBg key=item style=backgroundImage: 'url(/img/'+item+'.jpg)' />)
  </PoseGroup>
);

const enhance = compose(
  withStateHanlders(
    () => (
      index: 0,
      isVisible: false,
      bgs: _.shuffle([0,1,2,3]),
      timerId: 0,
    ),
    
      startTimer: () => (timerId, updateValue) => 
        clearInterval(timerId);
        return 
            timerId: setInterval(updateValue, 5000)
        ;
      ,
      stopTimer: (timerId) => () => clearInterval(timerId),
      updateValue: (bgs) => 
        () => 
          return (bgs: _.shuffle(bgs))
        ,
    ,
  ),
  lifecycle(
    componentDidMount() 
      const timerId, updateValue = this.props;
      this.props.startTimer(timerId, updateValue)
    
  ),

)

const BlockAnimated = enhance((
  bgs
) => 
  return (
    <BgList bgs=bgs />

【讨论】:

以上是关于使用重组时在哪里设置`setInterval`?的主要内容,如果未能解决你的问题,请参考以下文章

调试“WCF 服务库”时在哪里可以设置 try-catch 块(即入口点/Main() 方法在哪里)

在导航控制器中实现滑出菜单时在哪里以及如何设置协议委托?

Eclipse 中的 Willdfly 8.1 运行时在哪里? [复制]

在哪里调用 setInterval 反应

在 EMR 集群中运行 Spark 应用程序时在哪里指定 Spark 配置

调用 API 时在哪里使用并发