在我的JSX中,我通过一个对象数组(从本地JS文件导入)进行映射,以显示一组带有键、id和alt标记的图标。
我使用钩子将状态设置为空字符串。我希望使用一个onClick事件(传递给HeroIcons组件)来用单击图标的id (该id是一个字符串)替换此状态。下面是代码:
import React, { useState } from "react";
import HeroImages from "../images/HeroImages";
import HeroIcons from "../components/HeroIcons";
import HeroShowcase from "../components/HeroShowcase";
const Heroes = () => {
const [hero, currentHero] = useState("");
const setCurrentHero = e => {
currentHero(e.target.id);
console.log(hero);
};
return (
<div className="row">
<div className="col-heroes">
<ul className="hero-list">
{/* map function below */}
{HeroImages.map(({ id, src, altTag }) => (
<HeroIcons
key={id}
id={id}
src={src}
altTag={altTag}
setCurrentHero={setCurrentHero}
/>
))}
</ul>
</div>
<div className="col-showcase">
<HeroShowcase />
</div>
</div>
);
};
export default Heroes;在heroIcons组件中:
import React from "react";
const HeroIcons = props => {
return (
<li key={props.id} id={props.id} onClick={props.setCurrentHero}>
<img src={props.src} alt={props.altTag} />
</li>
);
};
export default HeroIcons;当单击图标(由map函数创建)时,id不会登录到控制台。但是,当我愤怒地多次单击它时,有时确实会记录一个id。这给了我一个提示,即这个单击事件可能导致map函数重新运行,并阻止正常的控制台日志。

我怎样才能解决这个问题?
发布于 2019-04-22 14:08:01
First您必须使用e.currentTarget.id而不是e.target.id,这样才能获得当前图像的id。
const setCurrentHero = e => {
currentHero(e.currentTarget.id);
console.log(hero);
};第二次 useState Hook需要您处理回调以使用当前状态的值log,而它不接受setState这样的callback。您可以使用useEffect,但最好使用e.currentTarget.id的值;
发布于 2019-04-22 14:09:41
这是因为您的hero在控制台时没有更新,所以在更新该值时需要使用useEffect钩子。
const setCurrentHero = e => {
currentHero(e.target.id);
console.log(hero);
};
useEffect(() => {
console.log('Hero', hero);
}, [hero]);
发布于 2021-01-20 21:39:03
为什么不直接在呈现中设置值:
<HeroIcons
key={id}
id={id}
src={src}
altTag={altTag}
setCurrentHero={setCurrentHero(id)}
/>https://stackoverflow.com/questions/55795542
复制相似问题