我已经创建了一个高阶组件,如下所示:
import React from 'react';
interface IVisibility {
Component: JSX.Element;
visibilityThreshold?: number;
onVisibleCallback?: () => void;
}
const VisibilityHandler = ({
Component,
visibilityThreshold,
onVisibleCallback
}: IVisibility) => {
const ref = React.useRef(null);
React.useEffect(() => {
const componentObserver = new IntersectionObserver(
(entries) => {
const [entry] = entries;
if (entry.isIntersecting) {
onVisibleCallback ? onVisibleCallback() : null;
}
},
{
rootMargin: '0px',
threshold: visibilityThreshold ?? 0
}
);
const current = ref.current;
if (current) componentObserver.observe(current);
return () => {
componentObserver.disconnect();
};
}, [visibilityThreshold, onVisibleCallback]);
return <section ref={ref}>{Component}</section>;
};
export default VisibilityHandler;
并像这样使用它:
<VisibilityHandler Component={<div>Hello World</div>} />
然而,这将每个组件 Package 到一个节中,这是我不想要的。我尝试使用React.Fragment
,但它不允许您传递ref来跟踪组件。有没有更好的方法来重新创建此HOC,以便在不将其 Package 到额外的div或section中的情况下合并可见性跟踪?
2条答案
按热度按时间u59ebvdq1#
您可以使用
作为孩子的功能
你必须更改你的HOC代码
React.cloneElement
文件
你的案子
rsaldnfx2#
我发现了一个非常简洁的方法,就像这样: