reactjs - 如何在 react.js 的回调中调用 UseState 钩子的状态更新器函数
问题描述
我有这段代码,在我完成 http 请求后,我正在调用状态更新器函数,即,setUserName
我从异步函数获得响应。但是我看到它UsernameGenerator()
就像在无限循环中一样被反复调用。我认为这里发生了某种重复渲染,因为我在代码中使用了 UserName 作为输入的值。
我想要的是将 res 设置initial value
为状态变量的值,并且在设置一次值之后UsernameGenerator()
永远不应再次调用。
这是我的代码片段
import { useState } from "react";
import axios from "axios";
const SignUp = () => {
const [UserName, setUserName] = useState("");
const usernameGenerator = async () => {
let username = await axios.get("https://localhost:5000/GenerateUserName");
return username.data.username;
};
usernameGenerator().then((res) => {
setUserName(res);
return res;
}).catch ((err)=>{
if(err) throw err;
});
return (
<Input
color="secondary"
id="UserName"
type="text"
aria-describedby="User-Name"
value={UserName}
onChange={(e) => setUserName(e.target.value)}
className={classes.input}
/>
);
}
export default SignUp;
如何避免这种类似条件的无限循环
res
,并将状态变量作为我的初始值。
解决方案
您需要在 useEffect 挂钩中进行调用,例如-
import { useEffect } from "react";
useEffect(() => {
usernameGenerator().then((res) => {
setUserName(res);
}).catch ((err)=>{
// handle error here, instead of throwing
});
}, []); // here you need to pass empty array as second parameter of useEffect to call it once
说明:您想要的是在组件挂载上调用 API,因此通过使用 useEffect 和依赖数组为空,您可以实现此目的。
目前,您在每次渲染时调用它,然后在回调中更新导致无限循环的状态
推荐阅读
- python - 把圆形变成方形。已解决:松鼠包
- php - PHP 致命错误:未捕获的 TypeError:传递给 Test::__construct() 的参数 1 必须是可调用的、给定的字符串、已调用
- composer-php - 主题文件夹未公开 - Expose 要求公开安装期间未创建的文件夹
- node.js - 属性“productsSub”没有初始值设定项,并且未在构造函数中明确分配。ts(2564)
- android - Java.Net.ProtocolException:当我尝试将 laravel api 与 xamarin 一起使用时,流意外结束
- selenium - 我的 selenium 脚本在 eclipse 中运行良好,但在 jenkins 中运行良好
- java - java命令在CMD中没有返回任何内容
- css - 如何使用 grid/flex 在 CSS 中创建具有不同大小行的 UI?
- python-3.x - ImportError:无法从“virtualenv”导入名称“main”
- java - Java JDBC 驱动程序在初始执行后停止工作