无法获取更新后的状态值 useState 和 UseEffect

Posted

技术标签:

【中文标题】无法获取更新后的状态值 useState 和 UseEffect【英文标题】:Cannot get the updated the state value useState and UseEffect 【发布时间】:2020-05-07 17:46:28 【问题描述】:

我想获取状态的最新值并使用内联样式,但它首先返回 0 值,然后渲染更新状态。但是,我无法将值分配给样式。

const ImageCard = ( image:  alt_description, urls  ) => 
  const [spans, setSpans] = useState(0);
  const imageRef = useRef(null);

  useEffect(() => imageRef.current.addEventListener('load', () => 
    const height = imageRef.current.clientHeight;
    const spans = Math.ceil(height / 10);
    setSpans( spans );
  ));

  return (
    <div style= gridRowEnd: `span $spans` >
      <img ref=imageRef alt=alt_description src=urls.regular />
    </div>
  );

控制台输出:

10 0
spans: 15
spans: 33
...

【问题讨论】:

这个组件的父级是否有display: grid @ShubhamKhatri 是的,它有 【参考方案1】:

您不需要useEffect。可以使用img标签的onLoad事件如下:

const ImageCard = ( image:  alt_description, urls  ) => 
  const [spans, setSpans] = useState(0);

  const imageLoaded = e => 
    const height = e.currentTarget.clientHeight;
    const spans = Math.ceil(height / 10);
    setSpans( spans );
  ;
  //Dont forget to remove this line
  console.log(spans);
  return (
    <div style= gridRowEnd: `span $spans` >
      <img onLoad=imageLoaded alt=alt_description src=urls.regular />
    </div>
  );
;

Working code sandbox example

【讨论】:

以上是关于无法获取更新后的状态值 useState 和 UseEffect的主要内容,如果未能解决你的问题,请参考以下文章

如何立即更新 react useState?

UseState 总是显示以前的值[重复]

React.js useState hook 导致过多的重新渲染并且无法更新我的状态

反应钩子:useState/context;无法读取未定义的属性“头像”/如何更新嵌套对象

useState 在第二次点击时更新状态

它们是使用包含更新的道具和先前状态的 useState 钩子来更新状态的功能形式吗?