react-router 的 data API 问题求教

2023-01-13 18:24:36 +08:00
 Akitora

最近想摸一个简单的管理后台页面,前端登录这块一开始是参考的 react-router 官方的一个示例

想要实现一个如果请求 statusCode 是 4xx 的话就重新跳转到登录页的功能,考虑使用 react-router 的errorElement捕获 error 实现,为此需要使用 v6.4 加入的 createBrowserRouter 来创建路由,把官方示例中 App.tsx 路由申明部分改成了这样:

const router = createBrowserRouter(
    createRoutesFromElements(
      <Route element={<Layout />}>
        <Route path="/" element={<PublicPage />} />
        <Route path="/login" element={<LoginPage />} />
        <Route
          path="/protected"
          element={
            <RequireAuth>
              <ProtectedPage />
            </RequireAuth>
          }
        />
      </Route>
    )
  );
  
 return (
   <AuthProvider>
     <RouterProvider router={router} />
   <AuthProvider/>
 );

并去掉了 main.tsx 中的 <BrowserRouter><BrowserRouter/>

随后运行示例就发现了一个诡异的问题:

登录第一次成功后它不能跳转到 /protected 下,原因是被 RequireAuth 组件给拦住了,跳转回了 /login ,需要点两次登录才能顺利跳转,可是明明在 signin 的回调中 setUser(newUser) 了,这个现象在原本用了 <BrowserRouter> 的示例中没有出现,一使用 createBrowserRouter 就会这样。

翻了两天文档还是毫无头绪,望前端大佬不吝赐教。

1728 次点击
所在节点    React
7 条回复
morri
2023-01-13 18:31:44 +08:00
直接快进到 https://nextjs.org/

使用 https://swr.vercel.app/zh-CN hook 。我最近也在研究,nextjs 的好处还在于可以服务端渲染你想要渲染的页面。
christin
2023-01-13 18:40:08 +08:00
<Route path="/login" element={<LoginPage />} />
<Route
path="/protected"
element={
<RequireAuth>
<ProtectedPage />
</RequireAuth>
}
/>
把 login 放到 protected 下面试一下
Jarvis666
2023-01-14 18:57:43 +08:00
能给一个复现的代码仓库吗?我最近也在看 auth 这个例子😀
randomstream
2023-01-14 20:27:13 +08:00
不知道啥情况,但是将状态使用变量定义在组件外面就不会出现问题,不知道是不是 useState 更新是异步和 react-router 之间的问题还是啥的。。
Akitora
2023-01-15 02:08:24 +08:00
@Jarvis666 复现 https://stackblitz.com/edit/github-cnzc4l-gjsber?file=src/main.tsx

@randomstream 确实是这样的感觉!像是状态更新慢了一拍一样。找到的唯一一个能用的示例它保存状态使用的是 localStorage…

@christin 这样 login 都访问不了了吧…
Jarvis666
2023-01-15 13:22:07 +08:00
可以在 setUser(newUser) 打印一下 newUser ,第一次打印出来的 user 为 null ,第二次打印出来的 user 是第一次输入的 username ,可以通过输入两次输入不同的值来验证。
感觉 setState() 是异步的,大佬知道的艾特我一下😂
liuzhaowei55
91 天前
@Jarvis666 应该就是大佬说的 setState 异步更新的问题

https://stackblitz.com/edit/github-cnzc4l-wldcop?file=src%2FApp.tsx

用 useEffect 等 user 改变后再 callback 就成了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/908761

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX