我构建了一个自定义钩子,我想从中构建测试,但我不知道从哪里开始我希望你能帮我解释几件事:
1.我如何在测试中捕获 mousedown 2.我如何使用 useRef 并将其分配给当前值 如果您能帮助我并向我展示代码将非常有帮助,因为我有时会坐在上面
下面是自定义钩子和我实现自定义钩子的代码提前感谢
import { useEffect } from 'react';
function useOnClickOutside(ref, callback) {
useEffect(
() => {
const listener = (event) => {
// Do nothing if clicking ref's element or descendent elements
if (!ref.current || ref.current.contains(event.target)) {
return;
}
callback(event);
};
document.addEventListener('mousedown', listener);
document.addEventListener('touchstart', listener);
return () => {
document.removeEventListener('mousedown', listener);
document.removeEventListener('touchstart', listener);
};
},
[ref, callback],
);
}
export default useOnClickOutside;
这是使用它的组件:
import React, { useRef, useEffect } from 'react';
import ReactDOM from 'react-dom';
import styles from './OverlayDialog.module.css';
import useOnClickOutside from '../../CustomeHooks/useOnClickOutside/useOnClickOutside';
const OverlayDialog = (props) => {
const wrapperRef = useRef(null);
useEffect(() => {
window.addEventListener("mousedown", handleClickOutside);
return () => {
window.removeEventListener("mousedown", handleClickOutside);
};
});
const handleClickOutside = event => {
const { current: wrap } = wrapperRef;
if (wrap && !wrap.contains(event.target)) {
props.onClose(false);
}
};
useOnClickOutside( wrapperRef,()=>props.onClose(false))
return ReactDOM.createPortal(
<div className={styles.Dialog}>
<div className={styles.InnerDialog} tabIndex={1}>
<div className={styles.DialogCard} tabIndex={-1}>
<div className={props.className ? props.className : styles.DialogContent} ref={wrapperRef}>
{props.children}
</div>
</div>
</div>
</div>,
document.getElementById('OverlayDialog')
)
}
export default OverlayDialog;