我有一个handleScroll
在滚动事件上监听的函数。Thsi 函数必须更新isFetching
(以 false 开头并且必须更改布尔值)。
handleScroll
正如console.log
所示,该功能已正确收听。然而,isFetching
总是假的。好像setIsFetching
从来没读过。我认为,另一种选择就像 eventListener 冻结 handleScroll 函数的第一个版本。
我该怎么做才能更新该函数中的钩子? 这是代码和代码框的简化版本:
/* <div id='root'></div> */
import React, { useState, useEffect } from "react";
import ReactDOM from "react-dom";
const debounce = (func, wait, immediate) => {
let timeout;
return function() {
const context = this;
const args = arguments;
clearTimeout(timeout);
timeout = setTimeout(() => {
timeout = null;
if (!immediate) func.apply(context, args);
}, wait);
if (immediate && !timeout) func.apply(context, args);
};
};
const App = () => {
const [isFetching, setIsFetching] = useState(false);
const handleScroll = debounce(() => {
setIsFetching(!isFetching);
console.log({ isFetching });
}, 300);
useEffect(() => {
window.addEventListener("scroll", handleScroll);
return () => window.removeEventListener("scroll", handleScroll);
}, []);
return <div style={{ height: "1280px" }}>Hello world</div>;
};
const root = document.getElementById("root");
if (root) ReactDOM.render(<App />, root);
更新
我把一个空数组作为第二个参数,useEffect因为我希望第一个参数函数只在 componentDidMount() 上触发一次
慕沐林林
守着一只汪
拉莫斯之舞
相关分类