hooks
hooks copied to clipboard
[BUG] useInfiniteScroll的target为document,计算target的高度是有问题的
在~/packages/hooks/src/useInfiniteScroll/index.ts
的scrollMethod
方法中引用了getClientHeight
方法,该方法代码如下:
const getClientHeight = (el: Document | Element) => {
return (
(el as Element).clientHeight ||
Math.max(document.documentElement.clientHeight, document.body.clientHeight)
);
};
在如上代码中,在业务里body的高度自适应的场景中,返回的其实是Math.max
中的document.body.clientHeight
,实际在整个逻辑中,期待返回的应该是document.documentElement.clientHeight
。
临时的愚蠢解决方法:
const target = useMemo(() => {
// fix useInfiniteScroll bug https://github.com/alibaba/hooks/issues/1563
const doc = document;
Reflect.defineProperty(doc, 'scrollTop', {
get() {
return document.documentElement.scrollTop;
},
});
Reflect.defineProperty(doc, 'scrollHeight', {
get() {
return document.documentElement.scrollHeight;
},
});
Reflect.defineProperty(doc, 'clientHeight', {
get() {
return document.documentElement.clientHeight;
},
});
return doc;
}, []);
useInfiniteScroll 的 target
应该是固定高度的。
在你的代码中,document
和 document.body
的高度都不是固定的,都是会被无限撑起来。
useInfiniteScroll 的
target
应该是固定高度的。在你的代码中,
document
和document.body
的高度都不是固定的,都是会被无限撑起来。
对,你的说明只对了一半的。因为document的可视区域应该取document.documentElement.clientHeight,而不是Math.max(document.documentElement.clientHeight, document.body.clientHeight)
+1,这个问题为何那么久了还不解决
+1,这个问题为何那么久了还不解决
fixed, see: https://github.com/alibaba/hooks/pull/2119