Recommended way of making React component/div draggable

后端 未结 9 713
耶瑟儿~
耶瑟儿~ 2020-11-28 18:13

I want to make a draggable (that is, repositionable by mouse) React component, which seems to necessarily involve global state and scattered event handlers. I can do it the

9条回答
  •  孤街浪徒
    2020-11-28 18:36

    Here's a simple modern approach to this with useState, useEffect and useRef in ES6.

    import React, { useRef, useState, useEffect } from 'react'
    
    const quickAndDirtyStyle = {
      width: "200px",
      height: "200px",
      background: "#FF9900",
      color: "#FFFFFF",
      display: "flex",
      justifyContent: "center",
      alignItems: "center"
    }
    
    const DraggableComponent = () => {
      const [pressed, setPressed] = useState(false)
      const [position, setPosition] = useState({x: 0, y: 0})
      const ref = useRef()
    
      // Monitor changes to position state and update DOM
      useEffect(() => {
        if (ref.current) {
          ref.current.style.transform = `translate(${position.x}px, ${position.y}px)`
        }
      }, [position])
    
      // Update the current position if mouse is down
      const onMouseMove = (event) => {
        if (pressed) {
          setPosition({
            x: position.x + event.movementX,
            y: position.y + event.movementY
          })
        }
      }
    
      return (
        
    setPressed(true) } onMouseUp={ () => setPressed(false) }>

    { pressed ? "Dragging..." : "Press to drag" }

    ) } export default DraggableComponent

提交回复
热议问题