Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs 有没有办法将需求放在钩子依赖项上?_Reactjs_React Hooks - Fatal编程技术网

Reactjs 有没有办法将需求放在钩子依赖项上?

Reactjs 有没有办法将需求放在钩子依赖项上?,reactjs,react-hooks,Reactjs,React Hooks,目前,在调用loadSearchData之前,我正在检查输入useEffect钩子依赖项是否至少有一定的长度,loadSearchData是一个命中API的异步方法 useEffect=>{ 如果input.length>=最小字符输入{ 加载搜索数据; } },[输入]; 是否有一种方法可以将输入检查移动到输入依赖项参数以获得useEffect?可能我需要编写一个自定义钩子 是否有一种方法可以将输入检查移动到输入依赖项参数以获得useEffect?可能我需要编写一个自定义钩子 我会这样做:

目前,在调用loadSearchData之前,我正在检查输入useEffect钩子依赖项是否至少有一定的长度,loadSearchData是一个命中API的异步方法

useEffect=>{ 如果input.length>=最小字符输入{ 加载搜索数据; } },[输入]; 是否有一种方法可以将输入检查移动到输入依赖项参数以获得useEffect?可能我需要编写一个自定义钩子

是否有一种方法可以将输入检查移动到输入依赖项参数以获得useEffect?可能我需要编写一个自定义钩子

我会这样做:


function useEffect2(effect, deps, isValid = true) {
  const cleanup = React.useRef(null);

  useEffect(() => {
    if (isValid) {
      if (typeof cleanup.current === "function") {
      // schedule cancellation of previous request right after effect has been called
      // using the Promise construct here so I don't have to deal with a throwing cancellation function
        Promise.resolve().then(cleanup.current);
      }

      // in case effect() throws, 
      // don't want to call the old cancellation function twice
      cleanup.current = null;
      // get new cancel-function
      cleanup.current = effect();
    }
  }, deps);

  useEffect(() => () => {
    // deal with cancellation on unmount
    typeof cleanup.current === "function" && cleanup.current();
  }, []);
}

useEffect2(loadSearchData, [input], input.length >= MIN_CHAR_INPUT);
我只是想澄清一下取消的原因。这将允许我们访问堆栈中当前的useffect调用,并允许我们在没有任何内存泄漏的情况下正确处理调用

我们已经了解到,useEffect允许我们在组件渲染后表达不同种类的副作用。某些效果可能需要清理,以便返回函数

“清理”可能是个更好的名字。如果以前的ajax请求仍然挂起/阻止它们更新状态,我最常用它来取消它们。我已经在代码中重命名了变量

我们在这里试图模拟的是一个有条件运行效果的useEffect。因此,当条件为false时,我们不希望效果清除以前的调用;好像DEP没有改变。因此,我们需要自己处理清理函数,以及何时/是否应该调用它。那是

当且仅当我们调用effect函数时 关于组件卸载
这就是裁判的目的。由于每次调用都会覆盖引用,因此不会泄漏任何内存

当前的实现似乎是合理的,除非loadSearchData可能需要可能受closureMore影响的参数。但是,loadSearchData是从组件状态获取其所有参数的函数的包装器。这将允许我们访问堆栈中当前的useffect调用,并允许我们在没有任何内存泄漏的情况下正确处理调用?@roasty这与访问无关。它跟踪由effect返回的最新的cancel/cleanup函数,并在下次调用effect时调用它。我只是尽可能地保持行为的一致性以达到预期效果。