当前位置: 首页 > 知识库问答 >
问题:

使用上下文还是多次调用useEffect?

何飞翰
2023-03-14

我有一个自定义的useEffect钩子来获取每分钟的当前时间。

const useDateStatus = () => {
  const [date, setDate] = useState(new Date());

  useEffect(() => {
    const interval = setInterval(() => {
      setDate(() => new Date());
    }, 60000); 
    return () => clearInterval(interval);
  }, []);

  return date;
};

我需要一个共同的组件,当日期落在给定的时间范围内,该组件呈现null,否则它将显示date

const DateAlert = ({timeRanges, children}) => {
  const date = useDateStatus();

  if (!inRanges(date, timeRanges)) {
    return null;
  }

  return (
    <Alert>
      <p>{date}</p>
      {children}
    </Alert>
  );
};

我还需要另一个不需要date对象的通用组件。

const Display = ({timeRanges, children}) => {
  const date = useDateStatus();

  if (!inRanges(date, timeRanges)) {
    return null;
  }

  return children;
};

我是否应该创建一个上下文来包含date,以便传递date道具,然后使DateAlert使用上下文?

const context = React.createContext(new Date());
const DateContext = ({children}) => {
  const date = useDateStatus(new Date);
  return (
    <context.Provider value={date}>
      {children}
    </context.Provider>
  );
}

我需要获得date状态,从如何传递道具到{this.props.children},我认为使用上下文将date作为道具传递给孩子是很好的。

使用上下文获取日期与直接调用日期状态()获取日期有什么区别?

或者有没有更好的方法来减少DateAlertDisplay之间的冗余?

共有1个答案

南宫才艺
2023-03-14

我建议制作一个组件,然后像这样使用该组件:

const RenderIfInRange = ({timeRanges, children}) => {
  const date = useDateStatus();

  if (!inRanges(date, timeRanges)) {
    return null;
  }

  return children;
};

这将成为您的显示组件。然后:

const DateAlert = ({children}) => (
    <RenderIfInRange>
      <Alert>
        <p>{date}</p>
        {children}
      </Alert>
    </RenderIfInRange>
  );

我建议研究特鲁菲特的巴赫。在我看来,它允许您使用HOC模式作为钩子,并使代码看起来整洁得多。

 类似资料:
  • 当尝试将Mockito与spring一起使用时,通过bean声明创建Mock对象... ...我在调用mockito时发现了一些奇怪的行为。当多次没有重置Mock对象时,例如: 在测试过程中(在同一个模拟上)多次调用此代码(“mockito.when”)时,测试就会失败并出现错误(BadSqlGrammerException即使该异常实际上是预期的--如果不抛出异常,我会得到一个失败,并且手动抛出

  • 问题内容: 我正在使用Ionic,并且想要根据数据动态更改每个项目的背景色。我以为我可以通过函数调用的方式返回正确的类 目前是控制器 在检查控制台时,列表中的每个函数均被调用7次。这是为什么,我应该避免在其中使用函数调用吗? 问题答案: AngularJS可以进行脏检查:它需要在 每个循环中 调用该函数,以确保它不返回新值,并且不需要更新DOM。 这是框架典型过程的一部分,调用像您这样简单的函数不

  • 我的主要活动是装载不同的碎片。此外,可以从MainActivity打开设置-activity。 如果用户只是在片段之间切换,那就万事大吉了。 当打开设置-activity并返回MainActivity时,onResume和onPause会被调用两次。如果用户打开设置-activity并再次返回MainActivity,onResume和onPause将被调用三次。每次用户打开“设置-activit

  • 我试图为BillingClient v.2.2.0和Kotlin协同程序编写一个包装: 正如您所见,当我试图查询购买或购买时,我确保客户已经准备好。但在生产中存在许多错误: 我试图了解问题的原因,得到了if将被多次调用。可能存在异常。我一直想知道这是怎么可能的,因为我每次调用都会创建新的侦听器?我无法在emulator或测试设备上重现此问题。有人能解释一下这里发生了什么,以及如何解决吗?

  • 我是SpringWebFlux的新手。 我有一个不支持批处理调用的上游服务,因此我必须为数组中的每个对象多次调用它。我还需要请求参数的实例,因为服务在响应中不返回这些属性。 例如,这是我将发送给客户的回复 我只有身份证清单

  • 我正在使用Quartz和Spring来安排工作。我有一份按计划每小时运行的工作。问题是,当计划的作业耗时超过一小时时,该作业的“下一次启动时间”仍然是旧时间,不会启动(因为启动时间已经过去)。 我的问题是,如果工作时间超过预定时间,我们如何更改“下一次点火时间”?