在 React 的 useEffect() 中获取数据 returns "undefined"
Fetching data in React's useEffect() returns "undefined"
我正在尝试从数据库中获取数据。这是一个获取请求。只要我在异步函数中使用获取的数据,一切正常。但除此之外,它只是 returns "undefined"。
我究竟做错了什么?
感谢您的帮助:)
const [accountInfos, setAccountInfos] = useState();
const [error, setError] = useState();
const [loading, setLoading] = useState(true);
useEffect(() => {
(async function runEffect() {
const fetchedAccountInfos = await fetchAccountInfos();
if (fetchedAccountInfos && fetchedAccountInfos.length > 0) {
console.log(fetchedAccountInfos) //This console.log works
setAccountInfos(fetchedAccountInfos);
setLoading(false);
console.log(accountInfos) //This console.log returns
"undefined"
} else {
setError("Accountdaten können nicht geladen werden!");
setLoading(false);
};
})();
}, []);
console.log(accountInfos); //This console.log returns "undefined"
你没有做错什么,useEffect 之外的 console.log 只执行一次,在初始组件函数调用时,所以那时 accountInfos 变量仍然未定义。
但是useEffect里面的console.log是在取数据之后执行的,所以是那个时候定义的
试试看效果?
const [accountInfos, setAccountInfos] = useState();
const [error, setError] = useState();
const [loading, setLoading] = useState(true);
useEffect(() => {
(async function runEffect() {
const fetchedAccountInfos = await fetchAccountInfos();
if (fetchedAccountInfos && fetchedAccountInfos.length > 0) {
setAccountInfos(fetchedAccountInfos);
setLoading(false);
console.log(accountInfos) //This console.log works
} else {
setError("Accountdaten können nicht geladen werden!");
setLoading(false);
};
})();
}, []);
console.log(accountInfos); //This console.log returns "undefined"
useEffect(() => {
console.log(accountInfos); //check the result here
}, [accountInfos])
它不是特定于 React 的:它是一个异步函数,所以承诺将在控制台日志出现后解析,这就是你得到 undefined
的原因。这只是正常的 JS 行为——值 是 在 console.log 执行时未定义。
在定义 JSX 的 return 值中,如果 accountinfos
为 null,则渲染 null(或一些空状态组件),否则渲染基于 return 的实际组件来自 API 的值。收到响应后,状态将更新并且组件将重新呈现
为了获取更新后的值然后根据该值执行一些操作,您需要使用 useEffect
钩子
例如
const [toggle, setToggle] = useState(false);
useEffect(() => {
// do something based on new value of toggle
}, [toggle]);
const trigger = () => {
setToggle(true);
// OR
//setToggle(t => !t);
}
由于大多数答案已经说明了问题的原因,即 JS 的异步特性。
解决此问题的方法是简单地使用条件语句或三元运算符。
const [accountInfos, setAccountInfos] = useState();
const [error, setError] = useState();
const [loading, setLoading] = useState(true);
useEffect(() => {
(async function runEffect() {
const fetchedAccountInfos = await fetchAccountInfos();
if (fetchedAccountInfos && fetchedAccountInfos.length > 0) {
console.log(fetchedAccountInfos) //This console.log works
setAccountInfos(fetchedAccountInfos);
setLoading(false);
if(accountInfos){
//console the output only if available
console.log(accountInfos);
}
} else {
setError("Accountdaten können nicht geladen werden!");
setLoading(false);
};
})();
}, []);
console.log(accountInfos); //This console.log returns "undefined"
如果渲染组件并在 useEffect 挂钩中获取一些数据,同样的方法很有用。
{
dataIsReturned ? <RenderYourData/> : <h1> Loading </h1>
}
我正在尝试从数据库中获取数据。这是一个获取请求。只要我在异步函数中使用获取的数据,一切正常。但除此之外,它只是 returns "undefined"。 我究竟做错了什么? 感谢您的帮助:)
const [accountInfos, setAccountInfos] = useState();
const [error, setError] = useState();
const [loading, setLoading] = useState(true);
useEffect(() => {
(async function runEffect() {
const fetchedAccountInfos = await fetchAccountInfos();
if (fetchedAccountInfos && fetchedAccountInfos.length > 0) {
console.log(fetchedAccountInfos) //This console.log works
setAccountInfos(fetchedAccountInfos);
setLoading(false);
console.log(accountInfos) //This console.log returns
"undefined"
} else {
setError("Accountdaten können nicht geladen werden!");
setLoading(false);
};
})();
}, []);
console.log(accountInfos); //This console.log returns "undefined"
你没有做错什么,useEffect 之外的 console.log 只执行一次,在初始组件函数调用时,所以那时 accountInfos 变量仍然未定义。
但是useEffect里面的console.log是在取数据之后执行的,所以是那个时候定义的
试试看效果?
const [accountInfos, setAccountInfos] = useState();
const [error, setError] = useState();
const [loading, setLoading] = useState(true);
useEffect(() => {
(async function runEffect() {
const fetchedAccountInfos = await fetchAccountInfos();
if (fetchedAccountInfos && fetchedAccountInfos.length > 0) {
setAccountInfos(fetchedAccountInfos);
setLoading(false);
console.log(accountInfos) //This console.log works
} else {
setError("Accountdaten können nicht geladen werden!");
setLoading(false);
};
})();
}, []);
console.log(accountInfos); //This console.log returns "undefined"
useEffect(() => {
console.log(accountInfos); //check the result here
}, [accountInfos])
它不是特定于 React 的:它是一个异步函数,所以承诺将在控制台日志出现后解析,这就是你得到 undefined
的原因。这只是正常的 JS 行为——值 是 在 console.log 执行时未定义。
在定义 JSX 的 return 值中,如果 accountinfos
为 null,则渲染 null(或一些空状态组件),否则渲染基于 return 的实际组件来自 API 的值。收到响应后,状态将更新并且组件将重新呈现
为了获取更新后的值然后根据该值执行一些操作,您需要使用 useEffect
钩子
例如
const [toggle, setToggle] = useState(false);
useEffect(() => {
// do something based on new value of toggle
}, [toggle]);
const trigger = () => {
setToggle(true);
// OR
//setToggle(t => !t);
}
由于大多数答案已经说明了问题的原因,即 JS 的异步特性。 解决此问题的方法是简单地使用条件语句或三元运算符。
const [accountInfos, setAccountInfos] = useState();
const [error, setError] = useState();
const [loading, setLoading] = useState(true);
useEffect(() => {
(async function runEffect() {
const fetchedAccountInfos = await fetchAccountInfos();
if (fetchedAccountInfos && fetchedAccountInfos.length > 0) {
console.log(fetchedAccountInfos) //This console.log works
setAccountInfos(fetchedAccountInfos);
setLoading(false);
if(accountInfos){
//console the output only if available
console.log(accountInfos);
}
} else {
setError("Accountdaten können nicht geladen werden!");
setLoading(false);
};
})();
}, []);
console.log(accountInfos); //This console.log returns "undefined"
如果渲染组件并在 useEffect 挂钩中获取一些数据,同样的方法很有用。
{
dataIsReturned ? <RenderYourData/> : <h1> Loading </h1>
}