【发布时间】:2022-01-05 02:47:23
【问题描述】:
基本上,我需要根据一个异步设置的状态来渲染一个组件,默认状态是“false”,所以组件会挂载并抛出对应于 false 选项的返回,但它不会等待更新状态的前提。
export const LayoutValidator=({children})=>{
const [auth,setAuth] = useState(undefined)
const {token} = JSON.parse(localStorage.getItem("loggedUser")||'{}');
fetch(`${urlValue}/api/validate-token`,{
method:"POST",
headers:{
authorization: token,
}
})
.then(ans=>ans.json())
.then(ans=>setAuth(ans.auth))
.catch(err=>console.log(err))
return auth ? children : <Navigate to="/" />
}
如何设置此组件在返回其答案之前等待前提?
【问题讨论】:
-
您需要第三种状态,“正在加载”。在您确认他们的令牌无效之前不要重定向用户。
-
是的,先生!它是由这个组件实现的,这个应用程序的身份验证逻辑有一些我在这个问题中省略的复杂性。
-
哦,还要确保将
fetch()放入useEffect钩子中,这样它就不会在每次渲染时一次又一次地运行。 -
你说的“太晚了”是什么意思?无论如何,在第一次渲染之后状态会更新(
setAuth(ans.auth)),因为 http 请求是异步的并且需要一些时间。这就是为什么你需要进入“加载”状态。 -
例如,通过区分
undefined、true和false之间的auth,或任何其他三元逻辑。在加载状态下不渲染 (null) 或加载指示器。 (实际上你可能想要第四个错误状态,在组件中呈现消息而不是登录到控制台并保持显示在加载中)
标签: javascript reactjs asynchronous react-functional-component