reactjs 如何管理React Router v6路由操作中的状态更改

m1m5dgzv  于 2023-08-04  发布在  React
关注(0)|答案(1)|浏览(100)

我正在使用React Router开发一个站点,并使用React Context跟踪用户身份验证的JWT。
我试图利用React Router的data routers来处理来自REST API的请求,即:在路由加载器和动作中发出HTTP请求。
当在React Context中更改状态,然后在route action中重定向时,我的渲染行为遇到了麻烦。
我希望能够通过在React Context中更改JWT状态值来响应被拒绝的HTTP请求,以注销用户,然后将其重定向到/login路由。

// routes/Root.tsx
export const rejectedRootAction = ({ setJwt }: TAuthContext) =>
  async function () {
    // HTTP request to API returning 401 status code
    setJwt(null);
    return redirect("/login");
  };

字符串
然而,当我这样做时,React Router似乎没有在尝试渲染/登录之前更新JWT的状态。
如果设置了jwt,/login会自己将用户重定向到根页面,所以用户最终会在那里。
我试过在组件内部直接使用上下文处理jwt的登录检查,也试过在加载器内部处理jwt的登录检查,但在这两种情况下jwt都没有及时更新。

CodeSandbox with a simple version of the code.

以前的经验告诉我,我可能误解了React Router的一些基本知识,但我没有在Stack Overflow,Github或文档上找到有用的信息。
渲染过程似乎在解析重定向链,而没有考虑我正在做的状态更改,但这对我来说没有意义。
我没有发现任何东西表明我不能在操作中对状态进行更改。
有谁能解释或指出一个资源,将澄清我的思维过程/方法的缺陷?

0s7z1bwu

0s7z1bwu1#

由Remix Discord上的brophdawg11提供答案。
“你不能在加载器/动作中使用react上下文/钩子,因为抓取在设计上与渲染生命周期解耦,所以我们可以避免渲染驱动的抓取瀑布。
“而不是在react上下文中清除JWT,你应该从它的真实来源(cookie,localsgtorage等)中清除它。- 从何处获取并将其传递到上下文提供程序”
因此,对于我的用例,我完全放弃了使用React Context,而是直接从localstorage中检索令牌,直到我迁移到使用cookie。

相关问题