gpt4 book ai didi

reactjs - 如何使用 react 和 typescript 将事件监听器添加到通过 ref 访问的 div 元素?

转载 作者:行者123 更新时间:2023-12-05 06:16:31 26 4
gpt4 key购买 nike

我想使用 ref 将事件监听器添加到 div 元素。

我将 ref div_ref 添加到 Wrapper div 并在 enableDragEventListeners 方法中访问该 div_ref 以将事件监听器添加到 componentmount 上。

下面是我的代码,

const SomeComponent: React.FC<any> = props => {
const div_ref = React.useRef(null);
React.useEffect(() => {
const enableDragEventListeners = () => {
const div = dropRef.current;
if (div) {
div.addEventListener('dragenter', handleDragIn); // get error here
div.addEventListener('dragleave', handleDragOut); //error here
div.addEventListener('dragover', handleDrag);//error here
div.addEventListener('drop', handleDrop);//error here
}
};
enableDragEventListeners();
}, []);

return (
<Wrapper ref={div_ref}>
{dragging && <Overlay>{props.children}</Overlay>}
</Wrapper>
);
}

但我收到错误属性 addEventListener 在类型“从不”上不存在。有人能帮我解决这个问题吗?谢谢。

编辑:完整的代码看起来像这样...我正在实现一个拖放组件,因此将它包裹在一个想要使用它的组件周围,这样就可以将文件拖放到其中。

const DragAndDrop: React.FC<any> = props => {
const dropRef = useRef(null);
const [dragging, setDragging] = useState(false);
const [dragCounter, setDragCounter] = useState(0);
React.useEffect(() => {
// componentDidMount()
const handleDrag = (e: any) => {
if (!props.loading) {
e.preventDefault();
e.stopPropagation();
}
};

const handleDragIn = (e: any) => {
if (!props.loading) {
e.preventDefault();
e.stopPropagation();
setDragCounter((prev: number) => prev + 1);
if (e.dataTransfer.files) {
setDragging(true);
}
}
};

const handleDragOut = (e: any) => {
if (!props.loading) {
e.preventDefault();
e.stopPropagation();
setDragCounter((prev: number) => prev - 1);
if (dragCounter === 0) {
setDragging(false);
}
}
};

const handleDrop = (e: any) => {
if (!props.loading) {
e.preventDefault();
e.stopPropagation();
setDragging(false);
if (e.dataTransfer.files && e.dataTransfer.files.length > 0){
props.handle_drop(e);
e.dataTransfer.clearData();
setDragCounter(0);
}
}
};
const enableDragEventListeners = () => {
const div = dropRef && dropRef.current;
if (div) {
div.addEventListener('dragenter', handleDragIn);
div.addEventListener('dragleave', handleDragOut);
div.addEventListener('dragover', handleDrag);
div.addEventListener('drop', handleDrop);
}
};
const disableDragEventListeners = () => {
const div = dropRef && dropRef.current;
div.removeEventListener('dragenter', handleDragIn);
div.removeEventListener('dragleave', handleDragOut);
div.removeEventListener('dragover', handleDrag);
div.removeEventListener('drop', handleDrop);
};
setDragCounter(0);
enableDragEventListeners();
return () => {
// componentWillUnmount()
disableDragEventListeners();
};
}, [dragCounter, props]);

return (
<wrapper ref={dropRef}>
{dragging && <Overlay>{props.children}</Overlay>}
</Wrapper>
);
};

const DropZone = styled.div``;

export default DragAndDrop;

最佳答案

问题:

const div_ref = React.useRef(null); // < --- due to null it type of div_ref becomes null 

解决方案:

const div_ref = React.useRef<any>(null); // <--- Provide type any
// OR
const div_ref = React.useRef<TYPE_OF_WRAPPER>(null); // <--- Provide the type of ref element

示例演示:(对于 div 元素,您可以删除类型并检查,它会抛出相同的错误)

Edit SO - React Typescript


NOTE : And I think dropRef.current; should be div_ref.current;

关于reactjs - 如何使用 react 和 typescript 将事件监听器添加到通过 ref 访问的 div 元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62086193/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com