【发布时间】:2020-03-21 19:23:44
【问题描述】:
正如标题中所说。我想创建一个 React 组件,它可以让我通过拖动来调整其宽度 - 就像 Windows 操作系统中的窗口一样。实际上处理这个问题的最佳方法是什么?
编辑
我包括了我目前对此事的处理方法:
首先,我在容器的右上角放置了一个“拖动器”元素。当我在该元素上按下鼠标时,我想创建一个 mousemove 事件侦听器,它将修改相对于光标的 X 坐标相对于容器边缘的初始 X 位置的 containerWidth。我已经让那个事件监听器在按住鼠标按钮后触发并记录我的坐标,但不幸的是,由于某种原因,在鼠标未按下(mouseUp 事件)后事件没有被删除,这不是我想要的。任何建议表示赞赏,还有关于我将来可能期望与该主题相关的一些问题的建议。谢谢。
type Props = MasterProps & LinkStateToProps & LinkDispatchToProps;
const Test3 = (Props: Props) => {
const [containerWidth, setContainerWidth] = React.useState(640)
const [isBeingStretched, setIsBeingStretched] = React.useState(false);
const masterRef = React.useRef(null);
const logMousePosition = React.useCallback((event:MouseEvent)=>{
console.log(event.clientX);
},[])
const handleMouseDown=()=>{
document.addEventListener('mousemove', logMousePosition);
masterRef.current.addEventListener('mouseup', ()=>{
document.removeEventListener('mouseup', logMousePosition)
})
}
const handleMouseUp = () => {
document.removeEventListener('mousemove', logMousePosition);
}
return (
<div className="master-wrapper" ref={masterRef}>
<div className="stretchable-div" style={{ width: `${containerWidth}px` }}>
<div className="dragger-wrapper">
<h2>This is supposed to change width</h2>
<div className="dragger"
id="dragger"
onMouseDown={handleMouseDown}
onMouseUp={handleMouseUp}/>
</div>
</div>
</div>
);
}
export default connect(mapStateToProps, mapDispatchToProps)(Test3);
【问题讨论】:
-
到目前为止你尝试了什么?
-
一般的做法可能是这样的:在
mouseDown上获取用户的x 和y 屏幕坐标 > 获取mouseMove每一帧上的坐标之间的差值 > 将这些值转换为一些新的@相关元素的 987654324@ 或transform样式。 -
@JMadelaine 我进行了编辑并包含了我当前的方法
-
@LawrenceWitt 这正是我之前的计划。我进行了编辑并包含了一些代码,我非常感谢一些建议
标签: reactjs