微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

反应上下文状态未更新

如何解决反应上下文状态未更新

我有一个基本的反应上下文,类似于以下内容

function IdProvider({ children }: any) {
  const [id,setId] = useState("DEFAULT_ID")
  
  return (
    <IdContext.Provider value={{ id,setId }}>
      {children}
    </IdContext.Provider>
  )
}

我正在使用此提供程序包装我的所有路由,并且有一个组件,如下所示,我想用它来更新 Id:

function UpdateForm() {
  const { id,setId } = useId() // wrapper for the IdContext
 
  const movetodisplay = (newId: string) => {
    setId(newId)
    window.location.href = "/display/" + id
  }

  return (
    <>
      <span onClick={() => movetodisplay("NEW_ID")}>
       Update and redirect
      </span>
    </>
  )
}

重定向时,使用此组件:

function displayId(): JSX.Element {
  const { id } = useId()

  useEffect(() => {
    document.title = id
  },[id])

  return (
    <>
      {id}
    </>
  )
}

问题是,最初的 setId(newId) 不会更新状态,所以当 window.location.href = "/display/" + id调用时,它会重定向/display/DEFAULT_ID,而 displayId 组件仍然使用呈现时的 DEFAULT_ID 值。根据我的理解,useState 是异步的,所以我不完全确定我应该如何解决这个问题。我尝试在调用 setId添加 5 秒超时,但 id 的值仍然是认值。

编辑 - 已解决

弄清楚了这个问题,它是相当不相关的。我使用了一个常量(例如 DEFAULT_ID)来初始化各个地方的状态,却没有意识到 React 在更新/重新渲染时会检查引用相等性

解决方法

useContext 提供了通过组件的反应链传递属性的能力。因此,将您的提供商更改为此并确保它正在导出

<IdContext.Provider value={id}> 

然后在您的孩子中,您可以通过导入上下文来更新它:

import IdContext from './IdProvider'

和使用上下文:

const [context,setContext] = useContext(IdContext)

然后用新值设置它:

const moveToDisplay = (newId: string) => {
   setContext(newId)
   window.location.href = "/display/" + newId
}

之后,您通过 DisplayId 以相同的方式导入它并使用该值

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。