useEffect 不能移除EventListener
useEffect can not removeEventListener
function HomeList(props) {
const [{data,isLastPage}, setData] = useState({
data: [],
isLastPage: false
});
const getData = () => {
flag = false;
request("/api/app/recommend", {
params: {
list_code: props.listcode,
page,
preview: 0
}
}).then(res => {
let tmp = (res.msg === "lastpage" || isLastPage) ? true : false;
if(tmp) {
window.removeEventListener("scroll", hd);
}
setData(data => ({data:data.data.concat(res.data),isLastPage:tmp}));
flag = true;
});
page++;
};
const onScroll = () => {
const target = window.document.documentElement;
const offsetH = target.offsetHeight;
const scrollH = target.scrollHeight;
const triggerH = scrollH * 0.5;
const scrollTop = window.pageYOffset;
//滚动过页面高度一半加一屏高度后加载数据
if (scrollH - offsetH - scrollTop < triggerH) {
if (flag) {
getData();
}
}
};
const hd = throttle(onScroll, 500);
useEffect(() => {
getData();
window.addEventListener("scroll", hd);
return () => {
window.removeEventListener("scroll", hd);
page = 1;
flag = true;
};
}, []);
useLayoutEffect(() => {
//here !!!!!!!!!!!!
if(data.length < 18 && data.length > 0 && !isLastPage) {
getData();
}
},[data])
我想在 api 消息为 'lastpage' 时删除滚动事件侦听器,
但是反应钩子在每个 useEffect
中创建一个新函数 hd。如果最后一页
在 useLayoutEffect
更改中,removeEventListener
不起作用。
我们将需要监听 isLastPage
上的变化,并且仅当 isLagePage
为 false
时才添加事件监听器
useEffect(() => {
if (!isLastPage) {
document.addEventListener('scroll', scroll);
}
return () => document.removeEventListener('scroll', scroll);
}, [isLastPage]);
function HomeList(props) {
const [{data,isLastPage}, setData] = useState({
data: [],
isLastPage: false
});
const getData = () => {
flag = false;
request("/api/app/recommend", {
params: {
list_code: props.listcode,
page,
preview: 0
}
}).then(res => {
let tmp = (res.msg === "lastpage" || isLastPage) ? true : false;
if(tmp) {
window.removeEventListener("scroll", hd);
}
setData(data => ({data:data.data.concat(res.data),isLastPage:tmp}));
flag = true;
});
page++;
};
const onScroll = () => {
const target = window.document.documentElement;
const offsetH = target.offsetHeight;
const scrollH = target.scrollHeight;
const triggerH = scrollH * 0.5;
const scrollTop = window.pageYOffset;
//滚动过页面高度一半加一屏高度后加载数据
if (scrollH - offsetH - scrollTop < triggerH) {
if (flag) {
getData();
}
}
};
const hd = throttle(onScroll, 500);
useEffect(() => {
getData();
window.addEventListener("scroll", hd);
return () => {
window.removeEventListener("scroll", hd);
page = 1;
flag = true;
};
}, []);
useLayoutEffect(() => {
//here !!!!!!!!!!!!
if(data.length < 18 && data.length > 0 && !isLastPage) {
getData();
}
},[data])
我想在 api 消息为 'lastpage' 时删除滚动事件侦听器,
但是反应钩子在每个 useEffect
中创建一个新函数 hd。如果最后一页
在 useLayoutEffect
更改中,removeEventListener
不起作用。
我们将需要监听 isLastPage
上的变化,并且仅当 isLagePage
为 false
useEffect(() => {
if (!isLastPage) {
document.addEventListener('scroll', scroll);
}
return () => document.removeEventListener('scroll', scroll);
}, [isLastPage]);