mirror of
https://github.com/streamich/react-use.git
synced 2026-01-18 14:06:52 +00:00
32 lines
1.1 KiB
TypeScript
32 lines
1.1 KiB
TypeScript
import {useEffect} from 'react';
|
|
import {isClient} from './util';
|
|
|
|
export interface ListenerType1 {
|
|
addEventListener (name: string, handler: (event?: any) => void, ...args: any[]);
|
|
removeEventListener (name: string, handler: (event?: any) => void);
|
|
}
|
|
|
|
export interface ListenerType2 {
|
|
on (name: string, handler: (event?: any) => void, ...args: any[]);
|
|
off (name: string, handler: (event?: any) => void);
|
|
}
|
|
|
|
export type UseEventTarget = ListenerType1 | ListenerType2;
|
|
|
|
const defaultTarget = isClient ? window : null;
|
|
|
|
const useEvent = (name: string, handler?: null | undefined | ((event?: any) => void), target: null | UseEventTarget = defaultTarget, options?: any) => {
|
|
useEffect(() => {
|
|
if (!handler) return;
|
|
if (!target) return;
|
|
const fn: any = ((target as ListenerType1).addEventListener || (target as ListenerType2).on);
|
|
fn.call(target, name, handler, options);
|
|
return () => {
|
|
const fn: any = ((target as ListenerType1).removeEventListener || (target as ListenerType2).off);
|
|
fn.call(target, name, handler, options);
|
|
};
|
|
}, [name, handler, target, JSON.stringify(options)]);
|
|
};
|
|
|
|
export default useEvent;
|