当前位置: 首页 > 知识库问答 >
问题:

使用useEffect侦听状态更改

谢英耀
2023-03-14

我有以下Useffect钩子:

useEffect(() => {
    let canvas = document.getElementById('canvas');
    if (canvas && image.img) {
      let context = canvas.getContext('2d');
      context.clearRect(0, 0, canvas.width, canvas.height);
      //Redraw image
      context.drawImage(image.img, 0, 0, image.width, image.height);
      let scalePoint1 = retrievePointByName(drawnPoints, 'S1');
      let scalePoint2 = retrievePointByName(drawnPoints, 'S2');
      if (scalePoint1 && scalePoint2) {
        let scaleLine = new Line(scalePoint1, scalePoint2, null, 'ScalePoint');
        setScaleProperties({
          scaleDistance: scaleLine.length(), //What is the distance between the scale points (in pixels)
          scaleValueMm: scaleProperties.scaleValueMm, //How many mm-s does the specified distance corresponds to
          scaleFactor:
            scaleProperties.scaleDistance / scaleProperties.scaleValueMm, //scaleDistance/scaleValueMm. Gives the factor, how many pixels are equal to 1 mm.
        });
        scaleLine.draw();
      }
      drawnPoints.forEach((point) => {
        point.draw();
      });
      setDrawnLines([]);
      setWrongPointPlacement({
        lines: [],
      });
    }
  }, [drawnPoints]);

然而,我得到以下警告:

React Hook useEffect缺少依赖项:“image.height”、“image.img”、“image.width”、“scaleProperties.scaleInstance”和“scaleProperties.scaleValueMm”。请包含它们或删除依赖项数组

Image和scaleProperties也是组件的状态变量(使用useState定义)

我觉得我有可能滥用Useffect。我的想法是将其用作“drawnPoints”状态更改的侦听器,以便在更新或更改点时,我重新绘制画布。(并更新一些其他依赖状态)我正在做一些可视化任务。

如果我确实误用了这个概念,那么在react中实现这一点的“公认”或“最佳实践”方式是什么?

提前谢谢你!

共有1个答案

汝繁
2023-03-14

useffect用法规则规定,无论何时使用在useffect挂钩之外定义的变量,都必须将其添加到依赖项数组,因为useffect依赖于它并监听它的更改,无论它们的值何时更改,都必须将其添加到依赖项数组中重新运行

在您的案例中,让我们考虑这行代码:

  //Redraw image
  context.drawImage(image.img, 0, 0, image.width, image.height);

您收到此警告的原因是,在您正在重新绘制圆的那一行,您告诉useffect无论何时图像都要重新绘制图像。高度,图像。图像。宽度更改。正如我所说,这是因为image。高度,图像。图像。宽度useffecthook之外定义。

 类似资料:
  • 所以,我要做的是在一个按钮上添加一个事件监听器,当按下该按钮时,它将接受一个状态的值,并将其记录在控制台中。但即使在多次调用setState之后,记录的值也不会更新。 然后是触发它的按钮 当我单击滑块时,该值会发生变化,但当我按下带有id=“process”的按钮并与之相关联的事件侦听器时,即使在更新状态后,它也只打印20。

  • 通过侦听器我们能监听到任何数值属性的数值更新。可能听起来很抽象,所以让我们先来看看使用GreenSock一个例子: <script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/1.20.3/TweenMax.min.js"></script> <div id="animated-number-demo"> <input v-model.

  • 我不熟悉React钩子和React 16.13.1。 我将实现能够处理登录的Auth组件。 但是它似乎没有正确更新状态,即使使用响应对象调用。 这个代码有什么问题?

  • 本文向大家介绍Android 侦听SharedPreferences更改,包括了Android 侦听SharedPreferences更改的使用技巧和注意事项,需要的朋友参考一下 示例 请注意: 仅当添加或更改值时,侦听器才会触发,设置相同的值将不会调用它; 侦听器需要保存在成员变量中,而不是匿名类,因为registerOnSharedPreferenceChangeListener它使用弱引用进

  • 您可能知道,在正常模式下,当状态更新时,我们使用更新依赖项来获得通知,如下所示: 但在我的例子中,我的状态中有一个数组,我正在尝试在useEffect的循环中更新它,如下所示: 在本例中,每次forEach循环运行时,我都会得到初始val(我知道,因为val不是useffect的依赖项),但如果我将其作为依赖项,它将更新两次。解决这个问题的办法是什么? 编辑:基本上,我的意思是,当我在useffe

  • 我正在尝试实现一个OpenDaylight捆绑包,它在流发生变化时接收通知。因此,我实现了DataTreeChangeListener 我错过了什么?完整的代码可在Github上获得 提前感谢!最大值