gpt4 book ai didi

javascript - React useEffect无限循环

转载 作者:行者123 更新时间:2023-11-28 14:11:56 25 4
gpt4 key购买 nike

我正在尝试使用 React 并希望检索 S3 存储桶上的 json 文件。我正在使用下一个代码

import React, { useState, useEffect } from "react";
import { Storage } from "aws-amplify";

export default function Gallery(props){
const [picList, setPicList] = useState([]);

useEffect(() => {
async function onLoad() {
try{
const picUrl = await Storage.get('list.json');
const picr = await fetch(picUrl);
const picjs = await picr.json();
setPicList(picjs);
console.log(picList);
}
catch(e){
alert(e);
}
};
onLoad();
}, [picList]);



function renderLander() {
return (
<div className="lander">
<h1>Lander</h1>
</div>
);
}

return(
<div className="Gallery">
{renderLander()}
</div>
);
}

一开始我收到错误,当使用setPicList时,picList不接受json文件的值。我正在使用 console.log() 进行调试,因此我确信 Storage.get 正在获取正确的 url,fetch() > 正在获取文件 json,但 picList 打印默认值 []

现在,使用上面的代码,我得到了一个无限循环,但这一次 picList 的值获得了正确的值(但它会为我认为的每个渲染持续获取 S3)。

我正在关注this guide

编辑:为了完整性,如果我删除依赖项,即如果我让 [] 而不是 [picList],则 picList 不会更新>.

最佳答案

正如 Brian 之前提到的,您的 useEffect 设置为在 picList 更改时触发。由于 picList 是在 useEffect 内部更改的,因此这会创建一个无限循环。

由于您要从 S3 检索对象,因此您只需检索一次即可。

useEffect(() => {
...
}, []);

确保 useEffect 在首次渲染时仅运行一次

React hook 会异步更改状态,因此紧随其后的 console.logging 将生成 None 或之前的值。

您需要做的是向渲染函数添加条件语句,以便在状态更新时重新渲染组件。

function renderLander() {
return (
<div className="lander">
<h1>Lander</h1>
</div>
);
}

return(
<div className="Gallery">
{picList ? renderLander() : null}
</div>
);

关于javascript - React useEffect无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59146735/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com