javascript - 有没有更好的方法通过对 API 的异步调用来组织这个 React 页面?
问题描述
我有这个useEffect
应该只运行一次。因此,我已将其设置router.query.something
为依赖项。请求必须等待router.query.something
被水合,然后只有在值是真实的情况下才会发出请求。
这似乎是一个过于复杂的函数来向 API 发出一个简单的一次性请求,但我还没有找到一种更简洁的方法来做到这一点。
const MyPage = () => {
const [user, setUser] = useState(null)
const router = useRouter()
useEffect(async () => {
try {
if (router.query.something) {
const res = await api.get(`/resetTokens/${router.query.something}`)
setUser(res.data)
}
} catch (err) {
setUser(null)
}
}, [router.query.something])
return (<div>...</div>)
}
通常,我会使用getServerSideProps
,但在这种情况下,我不能,因为请求正在设置 cookie。如果我使用getServerSideProps
cookie 不会传递给客户端。
解决方案
const MyPage = () => {
const [user, setUser] = useState(null)
const router = useRouter()
useEffect(() => {
const abortController = new AbortController();
const fetchData = async () => {
try {
const res = fetch(`/resetTokens/${router.query.resetToken}`, { signal: abortController.signal });
setUser(res.data)
} catch (e) {
setUser(null)
}
};
if (router.query.something) {
fetchData();
}
return () => {
abortController.abort();
};
}, [router.query.something]);
return (<div>...</div>)
}
推荐阅读
- visual-studio-code - VS Code 在 SCAD 文件上使用 Javascript 格式化程序
- reactjs - 使用 styled-components (React.js) 导入字体不起作用
- vba - TransferSpreadsheet acImport 默认为文档文件夹 - 运行时错误 3011 (Access VBA)
- php - 如何从父表作为一行的 chldren 中进行选择
- php - 控制器文件中的 ErrorException 数组到字符串转换
- mysql - 防止在清理后将引号作为 HTML 实体保存在数据库中
- boto3 - 使用 OriginationNumber 发布 Boto3 SNS 短信的问题
- javascript - 如何使用 Javascript 在 10 秒后显示联系表格
- azure - 存储资源管理器上传中的分隔符更改
- list - 查询 Map 的元素
> 在 dart 中搜索委托