繁体   English   中英

如何在 UseEffect 中使用 Clean up function 和 Async function?

[英]How to use Clean up function with Async function in UseEffect?

我经历了一次清理 function 的简单使用。在更改输入文本值时,我们会收到有关文本框中值的警报。

我有这样的代码

import React, { useState, useEffect } from "react";

function App() {
  const [value, setValue] = useState("");

  //Waits for a period of time then resolves
  function timeout(ms) {
    return new Promise((resolve) => setTimeout(resolve, ms));
  }

  const myAlert =async () =>{
    await timeout(1000);
    alert(`A name was changed: ${value}`);
  }

  useEffect(() => {
    let isCancelled = false;

    const handleChange = async () => {
      if (!isCancelled) {
      await myAlert();
      }
    };

    handleChange();

    return () => {
      isCancelled = true;
    };
  }, [value]);

  return (
    <div className="App">
      <div>
        <form>
          <label>
            Name:
            <input
              type="text"
              value={value}
              onChange={(event) => setValue(event.target.value)}
            />
          </label>
          <input type="submit" value="Submit" />
        </form>
      </div>
    </div>
  );
}

export default App;


这里我们在 useEffect 中调用myAlert 那么,我们如何在这种情况下使用清理 function,我们在使用效果中不更改 state,但在更改 state 的使用效果中调用异步 function。

codesandbox 链接在这里: https://codesandbox.io/s/strange-greider-7k1svi?file=/src/App.js

我不确定您为什么要尝试使用清理 function。在正常情况下,您必须在某些情况下设置 state。 效果是通过它们的依赖关系来控制的,而不是通过使用它们的组件的生命周期来控制的。

任何时候效果的依赖关系发生变化,useEffect 都会清除以前的效果并运行新的效果。

import React, { useState, useEffect } from "react";

function App() {
  const [value, setValue] = useState("");
  const [isCancelled, setsCancelled] = useState(false);

  //Waits for a period of time then resolves
  function timeout(ms) {
    return new Promise((resolve) => setTimeout(resolve, ms));
  }

  const myAlert = async () => {
    await timeout(1000);
    alert(`A name was changed: ${value}`);
  };

  useEffect(() => {
    const handleChange = async () => {
      if (isCancelled) {
        setsCancelled(true)
        await myAlert();
      }
    };

    handleChange();

  }, [value]);

  return (
    <div className="App">
      <div>
        <form>
          <label>
            Name:
            <input
              type="text"
              value={value}
              onChange={(event) => setValue(event.target.value)}
            />
          </label>
          <input type="submit" value="Submit" />
        </form>
      </div>
    </div>
  );
}

export default App;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM