certimate/ui/src/hooks/useTriggerElement.ts
2025-01-06 19:10:29 +08:00

34 lines
942 B
TypeScript

import { Fragment, cloneElement, createElement, isValidElement, useMemo } from "react";
export type UseTriggerElementOptions = {
onClick?: (e: React.MouseEvent) => void;
};
/**
* 获取一个触发器元素。
* 通常为配合 Drawer、Modal 等组件使用。
* @param {React.ReactNode} trigger
* @param {UseTriggerElementOptions} [options]
* @returns {React.ReactElement}
*/
const useTriggerElement = (trigger: React.ReactNode, options?: UseTriggerElementOptions) => {
const onClick = options?.onClick;
const triggerDom = useMemo(() => {
if (!trigger) {
return null;
}
const el = isValidElement(trigger) ? trigger : createElement(Fragment, null, trigger);
return cloneElement(el, {
...el.props,
onClick: (e: React.MouseEvent) => {
onClick?.(e);
el.props?.onClick?.(e);
},
});
}, [trigger, onClick]);
return triggerDom;
};
export default useTriggerElement;