在每个渲染器上重新添加React钩子事件侦听器(详尽的deps错误)

时间:2019-06-07 09:45:34

标签: javascript reactjs react-hooks

我正在传递一个作为道具的函数,并在useEffect中调用该函数以触发重新渲染,然后重新渲染在每个渲染器上添加新的事件侦听器。

如果我从依赖项列表中删除incrementCount并将其保留为空数组[],则会收到react-hooks/exhaustive-deps掉毛错误,但是在初始渲染后它不会触发

function useApp({ incrementCount, count }) {
  console.log(count);

  // this gets triggered on every render
  useEffect(() => {
    console.log('add event listener');
    window.addEventListener('click', incrementCount);
    return () => {
      window.removeEventListener('click', incrementCount);
    };
  }, [incrementCount]);
}

function App() {
  const [count, setCount] = useState(0);

  function incrementCount() {
    console.log('increment');
    setCount(prevCount => prevCount + 1);
  }

  useApp({ incrementCount, count });

  return <div>click</div>;
}

1 个答案:

答案 0 :(得分:2)

我认为您可以使用React钩子中的useCallback API https://reactjs.org/docs/hooks-reference.html#usecallback

function App() {
  const [count, setCount] = useState(0);

  const incrementCount = useCallback(() => {
    console.log('increment');
    setCount(prevCount => prevCount + 1);
  }, [])

  useApp({ incrementCount, count });

  return <div>click</div>;
}