请看这个密码箱。
我有一个父div,它需要处理可拖放的事件(例如当文件被拖到上面时)。当调用onDragEnter
时,我希望改变背景色。但是,我有一个子div,当它悬停在它上面时,它调用父div的onDragLeave
事件。我尝试过在这个子div中使用ref来确定事件目标是否包含在子div中,但这似乎不起作用。如何避免子div响应调用onDragLeave
事件?谢谢!
import React, { useState } from 'react';
const App = () => {
const [dragOver, setDragOver] = useState(false);
const preventDefaults = (event) => {
event.preventDefault();
event.stopPropagation();
};
const onDragEnter = (event) => {
preventDefaults(event);
console.log('ENTER');
if (!dragOver) {
setDragOver(true);
}
};
const onDragLeave = (event) => {
preventDefaults(event);
console.log('LEAVE');
setDragOver(false);
};
return (
<div
data-testid="document-upload"
onDragEnter={onDragEnter}
onDragLeave={onDragLeave}
style={{
background: dragOver ? 'green' : 'red',
height: '20rem',
width: '20rem',
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
}}
>
<div
style={{ border: '2px solid blue', height: '10rem', width: '10rem' }}
/>
</div>
);
};
export default App;
发布于 2021-10-25 09:08:14
最简单的方法是在子pointerEvents: "none"
的style
支柱中设置<div>
,从而忽略该div上所有与指针相关的事件。这会带来一些限制,比如您无法将单击事件绑定到子div。
如果这不符合应用程序的约束,可以修改onDragLeave
处理程序以检查事件的relatedTarget
(参见文档)。如果拖放离开父<div>
,但输入父relatedTarget
的子对象,则currentTarget
(即父<div>
)将包含(即子div) (见文档)。
下面是应该起作用的代码:
const onDragLeave = (event) => {
preventDefaults(event);
// This condition will be true when the drag leaves the parent for a child,
// but false when the drag leaves the parent for somewhere else.
if (event.currentTarget.contains(event.relatedTarget)) return;
console.log("LEAVE");
setDragOver(false);
};
见这个密码箱。
https://stackoverflow.com/questions/69711768
复制相似问题