javascript - 如何使用嵌套事件在 React 上制作可拖动的 Div?
问题描述
我想从头开始制作一个可拖动的模态。在 youtube 上找到了本教程,但它仍然使用静态 HTML 和 vanilla javascript。尝试useRef & useEffect
在 React 上使用,但我发现在单击元素时使用onDrag
里面的事件onMouseDown
只会触发onMouseDown
。
vanilla javascript中的代码
header.addEventListener("mousedown", () => {
header.classList.add("active");
header.addEventListener("mousemove", onDrag);
});
反应中的代码
import React, { useRef, useEffect } from 'react'
import ReactDOM from 'react-dom'
import { ModalStyled } from './ModalComponentStyled'
import { ReactComponent as DragIconSVG } from '../../images/drag-icon.svg'
const modalRoot = document.getElementById('modal')
const ModalComponent = ({ close, children, zIndexProps }) => {
let modalWrapper = undefined
const modalRef = useRef()
const moveRef = useRef()
useEffect(() => {
modalWrapper = window.getComputedStyle(modalRef.current)
}, [modalRef])
const dragModalHandler = (e) => {
// const left = parseInt(modalWrapper.left)
// const top = parseInt(modalWrapper.top)
// modalRef.current.style.left = `${left + movementX}px`
// modalRef.current.style.top = `${top + movementY}px`
console.log(e)
}
const mouseDownModalHandler = (e) => {
dragModalHandler(e)
}
return ReactDOM.createPortal(
<ModalStyled zIndexProps={zIndexProps}>
<div className="overlay" onClick={close}></div>
<div ref={modalRef} className="modal-container">
<div className="modal-children">
{children}
<div
className="drag"
ref={moveRef}
onMouseDown={mouseDownModalHandler}
onDrag={dragModalHandler}
>
<DragIconSVG />
</div>
</div>
</div>
</ModalStyled>,
modalRoot
)
我已经将静态 vanilla 代码转换为沙箱,所以你们可以清楚地看到我的上下文。 https://codesandbox.io/s/draggablediv-pm33s
解决方案
仅使用 useState 获得此解决方案 https://codesandbox.io/s/draggablemodalreact-7gp38
推荐阅读
- c# - C# 中“Interlocked.SpeculationBarrier”的用例是什么?
- android - 为什么 Android R SDK 在 Marshmallow 中不起作用?
- c# - 无法调试 .NET Core:无法加载文件或程序集“System.Runtime,版本=4.2.1.0 / 4.2.0.0
- devops - 为什么每次启动 xray 时 xray-indexer 都会关闭?
- java - 使用 Java 和 Android 从 NFC 读取特定值
- azure - 如何使用 Azure ServiceBus 标准计划获得更好的性能
- angular - 如何添加到所有响应“Access-Control-Allow-Origin”标头?
- excel - 如何通过 Selenium VBA 向某些 HTML 元素发送文本?
- c++ - std::condition_variable::wait() 如何评估给定的谓词?
- html - CSS 适合视口内的 div,同时保持纵横比