如何修复Remix中'useActionData must be used within a data router'错误
问题:useActionData必须在数据路由中使用的错误
我的login.tsx代码如下:
export default function Login() { const isSubmitting = useIsSubmitting("loginForm"); const response: any = useActionData(); if (response && response.status != 200) { toast.error(response.error, { id: response.error, }); } return ( <div style={{ height: "100vh", display: "flex", alignItems: "center", justifyContent: "center", }} > <Card variant="outlined" sx={{ width: "100%", maxWidth: 300, p: 2 }}> <ValidatedForm validator={loginValidator} method="post" id="loginForm"> <Typography variant="h5" style={{ textAlign: "center", fontWeight: "bold" }} > LOGIN </Typography> <CustomTextField name="username" label="Username" /> <CustomPasswordField name="password" label="Password" /> <Button disabled={isSubmitting} style={{ margin: "10px 0" }} fullWidth variant="contained" type="submit" > {!isSubmitting ? "Login" : <CircularProgress />} </Button> </ValidatedForm> </Card> </div> ); }
访问localhost:3000/auth/login时触发以下错误:
Error: useActionData must be used within a data router. See https://reactrouter.com/routers/picking-a-router. at Object.invariant [as UNSAFE_invariant] (/home/dulanja/Adavii/11StreetSite/node_modules/@remix-run/router/history.ts:494:11) at useDataRouterState (/home/dulanja/Adavii/11StreetSite/node_modules/remix-validated-form/node_modules/@remix-run/react/node_modules/react-router/lib/hooks.tsx:838:3) at Object.useActionData (/home/dulanja/Adavii/11StreetSite/node_modules/remix-validated-form/node_modules/@remix-run/react/node_modules/react-router/lib/hooks.tsx:933:15) at useActionData (/home/dulanja/Adavii/11StreetSite/node_modules/remix-validated-form/node_modules/@remix-run/react/dist/components.js:702:25) at useErrorResponseForForm (/home/dulanja/Adavii/11StreetSite/node_modules/remix-validated-form/src/internal/hooks.ts:31:22) at ValidatedForm (/home/dulanja/Adavii/11StreetSite/node_modules/remix-validated-form/src/ValidatedForm.tsx:265:24) at renderWithHooks (/home/dulanja/Adavii/11StreetSite/node_modules/react-dom/cjs/react-dom-server.node.development.js:5724:16) at renderIndeterminateComponent (/home/dulanja/Adavii/11StreetSite/node_modules/react-dom/cjs/react-dom-server.node.development.js:5797:15) at renderElement (/home/dulanja/Adavii/11StreetSite/node_modules/react-dom/cjs/react-dom-server.node.development.js:6012:7) at renderNodeDestructiveImpl (/home/dulanja/Adavii/11StreetSite/node_modules/react-dom/cjs/react-dom-server.node.development.js:6170:11)
我之前在其他分支执行npm install react-router-dom@latest @types/react-router-dom@latest能解决问题,但合并到主分支后再执行同样的命令,错误还是存在。
解决方法
1. 确认使用数据路由配置
useActionData是React Router v6.4+数据路由专属的钩子,必须确保你的应用根路由用createBrowserRouter创建,而不是旧版的BrowserRouter。去根路由配置文件里检查路由定义方式。
2. 清理依赖缓存重新安装
主分支可能存在依赖冲突或缓存残留,按以下步骤操作:
rm -rf node_modules rm package-lock.json npm install npm install react-router-dom@latest @types/react-router-dom@latest
3. 更新remix-validated-form版本
错误栈显示remix-validated-form内部调用了useActionData,如果它的版本和当前react-router-dom不兼容也会触发错误,更新到最新版试试:
npm install remix-validated-form@latest
4. 检查组件路由上下文
确保Login组件是在数据路由的路由树范围内渲染的,不能在路由上下文之外直接渲染。比如确认/auth/login这条路由已经正确注册到数据路由中。
内容的提问来源于stack exchange,提问作者Dulanja Dilshan
相关产品推荐
相关产品推荐

