/**
* IntersectionObserver 组件
* 用于监听一组 DOM 元素的可见性状态,并获取第一个可见元素的索引。
* @example
* function App() {
* return (
* {
* console.log('第一个可见元素的索引:', index);
* }}
* rootMargin="0px 0px -10% 0px" // 自定义根边距
* >
*
* {items.map((item, index) => (
*
*
*
* ))}
*
*
* );
* }
*/
import React from 'react';
import type { ReactNode, CSSProperties } from 'react';
declare global {
interface Window {
IntersectionObserver: typeof IntersectionObserver;
}
}
/**
* 元素信息接口
*/
interface ElementInfo {
element: HTMLElement;
index: number;
isVisible: boolean;
}
/**
* IntersectionObserver 上下文值接口
*/
interface IntersectionObserverContextValue {
/** 是否已初始化 */
initialized: boolean;
/** 注册元素 */
registerElement: (element: HTMLElement, index: number) => void;
/** 注销元素 */
unregisterElement: (element: HTMLElement) => void;
/** 批量注册元素 */
registerElements: (elements: Array<{
element: HTMLElement;
index: number;
}>) => void;
/** 清除所有注册的元素 */
clearAll: () => void;
/** 第一个可见元素的索引,-1 表示没有可见元素 */
firstVisibleIndex: number;
}
/**
* IntersectionObserver Provider 属性接口
*/
interface IntersectionObserverProps {
children: ReactNode;
/** 根容器,默认为视口 */
root?: Element | null;
/** 根边距 */
rootMargin?: string;
/** 阈值 */
threshold?: number | number[];
/** 第一个可见元素索引变化时的回调 */
onFirstVisibleIndexChange?: (index: number) => void;
/** 是否禁用组件,禁用后不会创建 IntersectionObserver */
disabled?: boolean;
}
/**
* IntersectionItem 组件属性接口
*/
interface IntersectionItemProps {
/** 元素索引 */
index: number;
/** 子元素 */
children?: ReactNode;
/** 类名 */
className?: string;
/** 样式 */
style?: CSSProperties;
}
/**
* IntersectionObserver 上下文
*/
declare const IntersectionObserverContext: React.Context;
export declare const IntersectionObserverProvider: React.FC;
/**
* 使用 IntersectionObserver 的 Hook
* @returns {Object} 包含注册元素函数和第一个可见元素索引的对象
*/
export declare const useIntersectionObserver: () => IntersectionObserverContextValue;
/**
* IntersectionItem 组件
* 自动注册元素到 IntersectionObserver 中
*/
export declare const IntersectionItem: React.FC;
export type { IntersectionObserverProps, IntersectionItemProps, IntersectionObserverContextValue, ElementInfo, };
export { IntersectionObserverContext, };
export default IntersectionObserverProvider;