【问题标题】:Solved: React Hook useEffect - problems re-rendering / resetting已解决:React Hook useEffect - 重新渲染/重置问题
【发布时间】:2020-10-02 19:38:05
【问题描述】:

我正在尝试创建一个重置按钮,它会更改 useEffect 中依赖项的值。 我认为这会重新渲染组件,从而将所有值设置为代码中所示的默认值。

 const TransformedDoor = ({ doorHook }) => {
  const { selectedDoor } = doorHook;
  const [ doorWidth, setDoorWidth ] = useState(0);
  const [ doorHeight, setDoorHeight] = useState(0);
  const [ reset, doReset ] = useState(0);

  const DEFAULT_MATRIX = [1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0];
  const [ transformationMatrix, setTransformationMatrix] = useState(DEFAULT_MATRIX);
  const [ doorOffset, setDoorOffset ] = useState({x: 300,y: 200});
  const [ mouseState, setMouseState ] = useState({targetCircle: -1});
  const [ corners, setCorners ] = useState(
    {
     0: {x: 0, y: 0},
     1: {x: doorWidth, y: 0},
     2: {x: doorWidth, y: doorHeight},
     3: {x: 0, y: doorHeight},
    }
  );

  useEffect(() => {
    const { width, height } = selectedDoor;
    const scaler = 200 / Math.max(width, height);
    const w = width * scaler;
    const h = height * scaler;
    if (w !== doorWidth || h !== doorHeight) {
      setDoorWidth(w);
      setDoorHeight(h);
      setCorners({
        0: {x: 0, y: 0},
        1: {x: w, y: 0},
        2: {x: w, y: h},
        3: {x: 0, y: h},
      });
      setTransformationMatrix(DEFAULT_MATRIX);
    }
    console.log(reset + "reset")
  }, [selectedDoor, reset]);

这是我正在更新的钩子:

const [ reset, doReset ] = useState(0);

这是在useEffect的依赖中改变值的按钮。它改变了[reset]的值

<button
   onClick={() => {
     doReset(prev => prev + Math.random());
    }}> Reset </button>

编辑: 解决了!

我编辑了 if 语句以监听新的重置值,这触发了所需的操作。

 useEffect(() => {
    const { width, height } = selectedDoor;
    const scaler = 200 / Math.max(width, height);
    const w = width * scaler;
    const h = height * scaler;
    if (w !== doorWidth || h !== doorHeight || reset !== 0) {
      setDoorWidth(w);
      setDoorHeight(h);
      setCorners({
        0: {x: 0, y: 0},
        1: {x: w, y: 0},
        2: {x: w, y: h},
        3: {x: 0, y: h},
      });
      setTransformationMatrix(DEFAULT_MATRIX);
      setReset(0);
    }
    console.log(reset + "reset")
  }, [selectedDoor, reset]);

【问题讨论】:

  • 它是否真的在useEffect 中的 if 语句中记录内容?您可以只使用一个 handleClick 函数来负责重置状态并将其传递给重置按钮中的 onClick 属性。
  • 不,不在 if 语句中。 handleClick 听起来很聪明!

标签: reactjs dependencies react-hooks use-effect


【解决方案1】:

尝试按照文档建议将 doReset 重命名为 setReset here

【讨论】:

  • 谢谢,结果还是一样。它按预期记录 console.log - 这意味着它呈现除了 setStates 之外的所有内容
猜你喜欢
  • 2020-12-23
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 2020-06-12
  • 2020-01-20
  • 2022-06-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多