反应:仅将主体类添加到 useEffect 挂钩中的某些组件?

Posted

技术标签:

【中文标题】反应:仅将主体类添加到 useEffect 挂钩中的某些组件?【英文标题】:React: add body class only to certain components in useEffect hook? 【发布时间】:2019-11-17 11:58:39 【问题描述】:

我正在使用 React 16.8.6 和钩子。我是钩子新手。

我有一个组件加载到我需要添加一个 body 类的路由中。当用户离开此页面时,我需要删除该类。我正在使用

  useEffect(() => 
    document.body.className = 'signin';
  , []);

这会正确地将类添加到 body 标记中。除非我导航到另一个页面,否则课程仍然存在。如果我重新加载第二页,它就消失了。

当路由改变时组件卸载时如何移除类?

【问题讨论】:

【参考方案1】:

如果您的效果返回一个函数,它将充当清理。

useEffect(() => 
  document.body.classList.add('signin');

  return function cleanup() 
    document.body.classList.remove('signin');
  ;
, []);

您可以在文档中查看Effects with cleanup

【讨论】:

【参考方案2】:

useEffect 挂钩支持在组件卸载时运行的清理功能

useEffect(() => 
  document.body.className = 'signin';
  return () =>  document.body.className = ''; 
);

请参阅docs。

【讨论】:

这很好用。它留下了一个空的类属性(这不是问题,但我想知道如何删除)。可以这样做来添加和删除已经在 body 标签上的其他类吗? @Steve 我想你的意思是你想省略 only signin 保留任何现有的类吗? document.body.className = document.body.className.replace('signin', '') @Steve,您可能更喜欢使用classList,也可能不喜欢使用classList,无论哪种方式,您都会得到相同的结果,但API 可能更简洁。

以上是关于反应:仅将主体类添加到 useEffect 挂钩中的某些组件?的主要内容,如果未能解决你的问题,请参考以下文章

在 useEffect 挂钩中取消所有异步/等待任务以防止反应中的内存泄漏的正确方法是啥?

返回上一个屏幕时执行 useQuery() 挂钩反应原生堆栈导航器

无效的挂钩调用。钩子只能在反应函数组件内部使用...... useEffect,redux

对 useEffect 挂钩内的多个 setState() 调用做出反应批量更新

如何将缺少的依赖项添加到仅运行一次的 useEffect 挂钩?

如何在useEffect钩子反应中停止内存泄漏