【问题标题】:React - Cannot get the actual value of picture height/widthReact - 无法获取图片高度/宽度的实际值
【发布时间】:2020-11-28 03:33:22
【问题描述】:

我正在按照 Udemy 课程制作 Face Recognition React Web 应用程序,但是课程材料已经过时,所以我决定将控制权交到我手中并使用钩子和上下文 API 重新构建它。

问题 - 我无法获取上传(获取)图像的实际高度和宽度。尝试了许多不同的方法,但无法使其工作。 有时,当图片上传时,我没有得到任何返回它的宽度和高度,有时值没有在“useState”中更新。我需要这些值是正确的,以便将来进行计算以从图像中检测人脸。

这里发生的事情的简要概述。 “useEffect”用于立即设置“img”状态及其当前的高度和宽度属性 => 在 JSX 部分中,“”源是从我的上下文 API 中获取的,而该 API 是从“ImageLinkForm”组件中获取的。

const ImageField = () => {

const faceContext = useContext(FaceContext);

const ref = useRef();
const [img, setImg] = useState({
    height: '',
    width: ''
  });

  useEffect(() => {
    setImg({ ...img, height: ref.current.clientHeight, width: ref.current.clientWidth })
    console.log(`This is height ${img.height}`);
    console.log(`This is width ${img.width}`);
  }, [faceContext]);

  return (
    <div className="p-3">
      <div className="fieldImg">
        <img src={faceContext.fieldUrl} class="img-fluid rounded-lg" id="inputImage" ref={ref} alt="Responsive image" />
        <div><h4 className="text-primary">HEADER {img.height}</h4></div>
      </div>
    </div>
  )
}

纸上的这个问题看起来很简单,但我已经坚持了好几个星期了。 如果有人愿意从这里看看这里的 github repo - https://github.com/Fruscoqq/FaceRecognition

任何帮助将不胜感激。

【问题讨论】:

    标签: javascript reactjs async-await react-hooks use-state


    【解决方案1】:

    您可以删除整个hook,如下所示,前提是您遇到过它无法正常工作。

    useEffect(() => {
      setImg({ ...img, height: ref.current.clientHeight, width: ref.current.clientWidth })
      console.log(`This is height ${img.height}`);
      console.log(`This is width ${img.width}`);
    }, [faceContext]);
    

    不要像ref={ref}那样传递ref变量,而是传递ref回调函数。

    ref={onRefChange}
    

    在 func 内部,您可以在 DOM 元素更改时更新 img 状态。

    const onRefChange = useCallback(node => {
      // ref value changed to node
      if (node !== null && node.clientHeight !== null && node.clientWidth !== null) {
        setImg({ ...img, height: node.clientHeight, width: node.clientWidth })
      }
    }, [img]);
    

    我们之所以使用calback refs,是因为 React 建议使用它来检测 ref 值的变化。

    【讨论】:

    • 嗨,我尝试了您建议的所有方法,但遗憾的是它没有奏效。至少根据我的理解最初创建的“ref”是为我的“”DOM 元素创建的,所以我不必使用“document.querySelector.etc”。 “faceContext”是我从中获取提交的图像 URL 的状态。当我尝试遵循您的建议时,我没有得到任何回报,是我做错了什么,没有抓住重点吗?
    • 你能在setImg()之前注销ref.current的值吗?你得到了什么?
    • 当然可以!因此,在“setImg()”之前执行 console.log 之后,我将上下文状态注销并返回它的值,但是一旦“setImg()”启动,整个 ref 就变成了对 DOM 元素的引用。我尝试创建其中两个 ref,一个用于 img 元素,一个用于上下文,但没有运气。这部分代码const ref = useRef(useContext(FaceContext)); 没有被更新,一旦用户上传了一些东西,它就会保持这样(同时上下文状态正在更新)。这开始变得复杂了,我想要的只是获取图像的宽度/高度。
    • 我已经更新了我的答案。再读一遍,检查它是否有效。
    • 现在有点用了。我可以取回这些值,但有时它们不正确。例如,有时我会连续进行几次“上传”,并且可以恢复“高度为 0”,有时在第一次上传时一切正常。现在我唯一关心的是如何解决这个问题? console.log() This is updated height 0 This is updated width 478 顺便说一句 - 我非常感谢你在这里所做的一切!
    猜你喜欢
    • 1970-01-01
    • 2013-09-24
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-19
    相关资源
    最近更新 更多