可以在useEffect中有条件地进行不同的清理吗?

所以,我有一个useEffect这样的:

useEffect(()=>{
    if(foo) {
        // do something
        return () => { // cleanup function }
    }
}, [foo])

在此,cleanup即使if执行了block ,也不会调用函数但是如果我将效果修改为:

useEffect(()=>{
    if(foo) {
        // do something
    }
    return () => { // cleanup function }
}, [foo])

有用。因此,仅return在最后一个语句useEffect或我缺少某些内容时才进行清理吗?

或Drori

每次useEffect调用更新程序功能时,都会重新创建清除功能当依赖项发生更改时(或如果没有依赖项,则在每个渲染上),或者在卸载组件之前,将调用当前的清理函数。调用清理后,将调用更新程序,并可以返回新的清理函数。

每当调用updater函数时,您都可以返回其他函数,或者根本不返回。

例如,多次单击“公司”按钮,您会在控制台中看到清除功能仅对偶数存在counter,因为它是有条件返回的。

const { useState, useEffect } = React;

const Demo = () => {
  const [counter, setCount] = useState(0);
  
  useEffect(() => {
    console.log(`Effect ${counter}`);
    
    if(counter % 2 === 0) {
      return () => console.log(`Cleanup ${counter}`);
    }
  }, [counter]);
  
  return (
    <div>
      <p>Counter: {counter}</p>
      
      <button onClick={() => setCount(counter + 1)}>Inc</button>
    </div>
  );
};

ReactDOM.render(
  <Demo />,
  root
);
.as-console-wrapper { top: 0; left: 50% !important; max-height: unset !important; }
<script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>

<div id="root"></div>

有时,将清除功能嵌套在条件中可能会造成混淆。另一个选择是始终返回清除函数,并将逻辑放入其中:

useEffect(()=>{
    if(foo) {
        // do something
    }
    
    return () => { 
      if(foo) {
        // cleanup something
      }
    }
}, [foo])

您可以在此示例中看到结果是相同的:

const { useState, useEffect } = React;

const Demo = () => {
  const [counter, setCount] = useState(0);
  
  useEffect(() => {
    console.log(`Effect ${counter}`);

    return () => {
      if(counter % 2 === 0) {
        console.log(`Cleanup ${counter}`);
      }    
    };
  }, [counter]);
  
  return (
    <div>
      <p>Counter: {counter}</p>
      
      <button onClick={() => setCount(counter + 1)}>Inc</button>
    </div>
  );
};

ReactDOM.render(
  <Demo />,
  root
);
.as-console-wrapper { top: 0; left: 50% !important; max-height: unset !important; }
<script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>

<div id="root"></div>

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在熊猫中有条件地从不同的列中进行选择

来自分类Dev

我可以在angularJS中有条件地禁用过滤器吗?

来自分类Dev

Delphi:可以有条件地进行单元初始化吗?

来自分类Dev

可以有条件地使用“ with”语句吗?

来自分类Dev

argparse可以有条件地解析参数吗?

来自分类Dev

如何在useEffect中更新状态的条件组件中有条件地渲染?

来自分类Dev

如何在React Native中有条件地从三个不同的选项进行渲染?

来自分类Dev

我可以在AWS Appsync解析器中有条件地调用lambda函数吗?

来自分类Dev

我可以在应用程序的make文件中有条件地构建PC文件(Oracle Pro * c)吗?

来自分类Dev

如何使用 Capistrano 有条件地清理版本?

来自分类Dev

在MongoDB中有条件地应用和条件

来自分类Dev

如何在C ++ Builder中有条件地为不同平台编译代码?

来自分类Dev

是否可以在AngularJS中有条件地打开和关闭过滤器?

来自分类Dev

是否可以使单个参数在步进函数中有条件地接收其值?

来自分类Dev

是否可以在AngularJS中有条件地打开和关闭过滤器?

来自分类Dev

是否可以在Modelica中有条件地设置方程式属性?

来自分类Dev

如何在有条件的js中有条件地应用标题

来自分类Dev

在JMeter中有条件地停止用户线程

来自分类Dev

在AngularJS应用中有条件地注入模块

来自分类Dev

在AndroidManifest中有条件地声明服务

来自分类Dev

在dplyr中有条件地突变数据

来自分类Dev

在SQL Server中有条件地应用联接

来自分类Dev

在AngularJS中有条件地调用函数

来自分类Dev

在StructureMap中有条件地配置实例

来自分类Dev

在PHP中有条件地使用特征

来自分类Dev

在do块中有条件地执行“操作”

来自分类Dev

在SQlite中有条件地创建表

来自分类Dev

在MyBatis中有条件地执行<selectKey>

来自分类Dev

在AngularJS中有条件地绑定数据

Related 相关文章

  1. 1

    如何在熊猫中有条件地从不同的列中进行选择

  2. 2

    我可以在angularJS中有条件地禁用过滤器吗?

  3. 3

    Delphi:可以有条件地进行单元初始化吗?

  4. 4

    可以有条件地使用“ with”语句吗?

  5. 5

    argparse可以有条件地解析参数吗?

  6. 6

    如何在useEffect中更新状态的条件组件中有条件地渲染?

  7. 7

    如何在React Native中有条件地从三个不同的选项进行渲染?

  8. 8

    我可以在AWS Appsync解析器中有条件地调用lambda函数吗?

  9. 9

    我可以在应用程序的make文件中有条件地构建PC文件(Oracle Pro * c)吗?

  10. 10

    如何使用 Capistrano 有条件地清理版本?

  11. 11

    在MongoDB中有条件地应用和条件

  12. 12

    如何在C ++ Builder中有条件地为不同平台编译代码?

  13. 13

    是否可以在AngularJS中有条件地打开和关闭过滤器?

  14. 14

    是否可以使单个参数在步进函数中有条件地接收其值?

  15. 15

    是否可以在AngularJS中有条件地打开和关闭过滤器?

  16. 16

    是否可以在Modelica中有条件地设置方程式属性?

  17. 17

    如何在有条件的js中有条件地应用标题

  18. 18

    在JMeter中有条件地停止用户线程

  19. 19

    在AngularJS应用中有条件地注入模块

  20. 20

    在AndroidManifest中有条件地声明服务

  21. 21

    在dplyr中有条件地突变数据

  22. 22

    在SQL Server中有条件地应用联接

  23. 23

    在AngularJS中有条件地调用函数

  24. 24

    在StructureMap中有条件地配置实例

  25. 25

    在PHP中有条件地使用特征

  26. 26

    在do块中有条件地执行“操作”

  27. 27

    在SQlite中有条件地创建表

  28. 28

    在MyBatis中有条件地执行<selectKey>

  29. 29

    在AngularJS中有条件地绑定数据

热门标签

归档