useState 创建无限循环
useState create infinite loop
我正在创建一个带有 next 和 tailwind 的 Web 应用程序,我需要在我使用 useState 的方法之间传递一系列数据,但是在加载时它一直在加载,但 RAM 使用率荒谬而且从不收费。
组件:
export default function Home({ nav, footer, content, edition }) {
const [activeEdition, setActiveEdition] = useState({
background: '',
title: '',
prize: '',
sponsors: [],
});
return (
<div>
{edition.map((result) => {
const { data } = result;
if(data.active){
setActiveEdition({
background: data.edition_background.url,
title: data.edition_title,
prize: data.prize.url,
sopnsors: data.body[0].items,
});
}
return (
null
)
})}
{content.map((result) => {
const active = activeEdition
const { data } = result
return (
<Hero
key = {data.id}
active = {active}
/>
)
})}
</div>
);
}
实施:
function Hero({heroData, active, register}) {
const background = {
backgroundImage: `url('${active}')`
}
console.log(active)
return (
<div>
<h1>asdas</h1>
</div>
)
}
export default Hero
更新:添加了完整的组件以便更好地理解
将地图移动到 useEffect 钩子中,也不需要地图,因为您不转换数据,只需迭代并根据值进行更改。还添加了一个中断,因为我假设只有一项符合条件。
useEffect(() => {
for (const result of edition) {
const { data } = result;
if(data.active){
setActiveEdition({
background: data.edition_background.url,
title: data.edition_title,
prize: data.prize.url,
sopnsors: data.body[0].items,
});
break;
}
}}, [edition]);
就像我在评论中提到的那样:您正在创建一个无限循环,因为您在渲染时修改了状态。您想要的是根据版本更改更新状态。这个副作用应该在useEffect中完成。
我正在创建一个带有 next 和 tailwind 的 Web 应用程序,我需要在我使用 useState 的方法之间传递一系列数据,但是在加载时它一直在加载,但 RAM 使用率荒谬而且从不收费。
组件:
export default function Home({ nav, footer, content, edition }) {
const [activeEdition, setActiveEdition] = useState({
background: '',
title: '',
prize: '',
sponsors: [],
});
return (
<div>
{edition.map((result) => {
const { data } = result;
if(data.active){
setActiveEdition({
background: data.edition_background.url,
title: data.edition_title,
prize: data.prize.url,
sopnsors: data.body[0].items,
});
}
return (
null
)
})}
{content.map((result) => {
const active = activeEdition
const { data } = result
return (
<Hero
key = {data.id}
active = {active}
/>
)
})}
</div>
);
}
实施:
function Hero({heroData, active, register}) {
const background = {
backgroundImage: `url('${active}')`
}
console.log(active)
return (
<div>
<h1>asdas</h1>
</div>
)
}
export default Hero
更新:添加了完整的组件以便更好地理解
将地图移动到 useEffect 钩子中,也不需要地图,因为您不转换数据,只需迭代并根据值进行更改。还添加了一个中断,因为我假设只有一项符合条件。
useEffect(() => {
for (const result of edition) {
const { data } = result;
if(data.active){
setActiveEdition({
background: data.edition_background.url,
title: data.edition_title,
prize: data.prize.url,
sopnsors: data.body[0].items,
});
break;
}
}}, [edition]);
就像我在评论中提到的那样:您正在创建一个无限循环,因为您在渲染时修改了状态。您想要的是根据版本更改更新状态。这个副作用应该在useEffect中完成。