react 拖拽和换色

大兔子大兔子 提交于 2020-08-05 16:54:56

可以使用按钮控制移动, 也可以拖拽移动

可以使用按钮改变颜色

import React, {
  createRef,
  useState,
  useEffect,
} from "react";
import "./App.css";

function App() {
  const box = createRef<HTMLDivElement>();
  // x 横向, y 纵向
  const [position, setPosition] = useState({
    x: 0,
    y: 0,
  });

  useEffect(
    () => {
      console.log("update", box.current!.getBoundingClientRect());
    },
    [] // 空数组表示该函数只执行一次
  );

  const move = (dx = 0, dy = 0) => {
    console.log("move", dx, dy, box.current?.getBoundingClientRect());

    moveTo(position.x + dx, position.y + dy);
  };

  const moveTo = (x = 0, y = 0) => {
    console.log("moveTo", x, y);
    setPosition({
      x,
      y,
    });
  };

  const onMouseDown = (e: React.MouseEvent<HTMLDivElement>) => {
    console.log(e.pageX, e.pageY);
    setStartPositon({
      x: e.pageX,
      y: e.pageY,
    });
    setIsMove(true);
  };
  const onMouseMove = (e: React.MouseEvent<HTMLDivElement>) => {
    if (!isMove) return;
    console.log("onMouseMove", e.pageX, e.pageY);
    let dx = e.pageX - startPositon.x;
    let dy = e.pageY - startPositon.y;
    console.log("dx dy", dx, dy, position);
    setStartPositon({
      x: e.pageX,
      y: e.pageY,
    });
    moveTo(position.x + dx, position.y + dy);
  };
  const onMouseUp = (e: React.MouseEvent<HTMLDivElement>) => {
    console.log(e.pageX, e.pageY);
    setIsMove(false);
  };

  const [startPositon, setStartPositon] = useState({
    x: 0,
    y: 0,
  });
  const [className, setClassName] = useState("deepskyblue");
  const [isMove, setIsMove] = useState(false);

  return (
    <div className="App" onMouseMove={onMouseMove} onMouseUp={onMouseUp}>
      <div className="box-wrap">
        <div
          className={`box ${className}`}
          onMouseDown={onMouseDown}
          ref={box}
          style={{ left: position.x, top: position.y }}
        ></div>
      </div>

      <div className="btn-list">
        <button className="btn" onClick={() => move(0, -1)}>
          up
        </button>
        <button className="btn" onClick={() => move(0, 1)}>
          down
        </button>
        <button className="btn" onClick={() => move(-1, 0)}>
          left
        </button>
        <button className="btn" onClick={() => move(1, 0)}>
          right
        </button>
        <button className="btn" onClick={() => setClassName("red")}>
          red
        </button>
        <button className="btn" onClick={() => setClassName("green")}>
          green
        </button>
        <button className="btn" onClick={() => setClassName("deepskyblue")}>
          deepskyblue
        </button>
      </div>
    </div>
  );
}

export default App;

 

css

.App {
  width: 100vw;
  height: 100vh;
  display: flex;
  justify-content: center;
  align-items: center;
}
.box-wrap {
  display: flex;
  position: relative;
}
.box {
  background: deepskyblue;
  width: 100px;
  height: 100px;
  position: relative;
}

.btn-list {
  position: absolute;
  top: 0;
}
.btn {
  position: relative;
}

.red {
  background: red;
}

.green {
  background: green;
}

.deepskyblue {
  background: deepskyblue;
}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!