首页 > 解决方案 > React - 渲染发生在状态改变之前

问题描述

对这个很困惑。从代码中,如果您移动绿色方块,您将看到打印的值。我希望所有代码在状态更改和重新渲染之前运行,但是从这个代码示例中我可以看到,一旦调用更改状态的函数,重新渲染就会发生。

import React, { useState, useEffect, useRef } from "react";
import styled, { ThemeProvider, css } from "styled-components";

export default function App() {
  const pos = useRef({ x: 0, y: 0 });
  const offset = useRef({ x: 0, y: 0 });

  const myDiv = useRef(null);
  const [rerender, setRerender] = useState(0);
  console.log("render");

  useEffect(() => {
    window.addEventListener("mousemove", doSomething);
    window.addEventListener("mousedown", doSomethingAgain);

    return () => {
      window.removeEventListener("mousemove", doSomething);
      window.removeEventListener("mousedown", doSomethingAgain);
    };
  }, [rerender]);
  console.log("global", rerender);

  function doSomething(e) {
    if (e.buttons == 1) {
      const newPos = {
        x: e.pageX,
        y: e.pageY
      };

      pos.current = newPos;
      console.log("first", rerender);
      setRerender(rerender + 1);
      console.log("second", rerender);
    }
  }

  function doSomethingAgain(e) {
    const offsetX = e.pageX - myDiv.current.offsetLeft;
    const offsetY = e.pageY - myDiv.current.offsetTop;
    offset.current = { x: offsetX, y: offsetY };
  }

  return (
    <div className="App">
      <DIV ref={myDiv} off={offset.current} pos={pos.current}></DIV>
    </div>
  );
}

const DIV = styled.div`
  display: inline-block;
  width: 100px;
  height: 100px;
  background-color: green;
  position: absolute;
  top: ${({ pos, off }) => pos.y - off.y}px;
  left: ${({ pos, off }) => pos.x - off.x}px;
`;

标签: javascriptreactjs

解决方案


推荐阅读