首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在callabck内部未更新react状态

在callabck内部未更新react状态
EN

Stack Overflow用户
提问于 2020-08-04 19:12:13
回答 1查看 43关注 0票数 1

我不明白为什么下面的代码,回调onSocketMessage没有使用新的获取状态。在useEffect内部,状态被正确更新,但函数不会再次求值……我还尝试将useCallback与acquisition作为依赖项一起使用,但没有任何变化。

代码语言:javascript
复制
const Ac = () => {
  const [acquisition, setAcquisition] = useState({ data: {} })
  const [loading, setLoading] = useState(true)
  const socket = useRef(null);


  const onSocketMessage = (message) => {
    console.log(acquisition) // this is always initial state
    let { data } = acquisition
    data.input[message.index] = message.input
 
    setAcquisition(prevState => ({ ...prevState, data }));
  }

   


  useEffect(() => {
    fetchCurrentAcquisition(acquisition => {
      setAcquisition(acquisition)
      setLoading(false)
      socket.current = newSocket('/acquisition', () => console.log('connected'), onSocketMessage);
    })


    return () => socket.current.disconnect()
  }, [])


  console.log(acquisition)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-04 19:32:36

您正在登录stale closure,您应该尝试执行以下操作:

代码语言:javascript
复制
const onSocketMessage = useCallback((message) => {
  setAcquisition((acquisition) => {
    //use acquisition in the callback
    console.log(acquisition);
    //you were mutating state here before
    return {
      ...acquisition,
      data: {
        ...acquisition.data,
        input: {
          //not sure if this is an array or not
          //assimung it is an object
          ...acquisition.data.input,
          [message.index]: message.input,
        },
      },
    };
  });
}, []); //only created on mount

useEffect(() => {
  fetchCurrentAcquisition((acquisition) => {
    setAcquisition(acquisition);
    setLoading(false);
    socket.current = newSocket(
      '/acquisition',
      () => console.log('connected'),
      onSocketMessage
    );
  });

  return () => socket.current.disconnect();
  //onSocketMessage is a dependency of the effect
}, [onSocketMessage]);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63245674

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档