首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在单击事件后正确更新状态?

如何在单击事件后正确更新状态?
EN

Stack Overflow用户
提问于 2019-04-22 13:56:21
回答 3查看 8.3K关注 0票数 1

在我的JSX中,我通过一个对象数组(从本地JS文件导入)进行映射,以显示一组带有键、id和alt标记的图标。

我使用钩子将状态设置为空字符串。我希望使用一个onClick事件(传递给HeroIcons组件)来用单击图标的id (该id是一个字符串)替换此状态。下面是代码:

代码语言:javascript
复制
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组件中:

代码语言:javascript
复制
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函数重新运行,并阻止正常的控制台日志。

我怎样才能解决这个问题?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-04-22 14:08:01

First您必须使用e.currentTarget.id而不是e.target.id,这样才能获得当前图像的id

代码语言:javascript
复制
  const setCurrentHero = e => {
    currentHero(e.currentTarget.id);
    console.log(hero);
  };

第二次 useState Hook需要您处理回调以使用当前状态的值log,而它不接受setState这样的callback。您可以使用useEffect,但最好使用e.currentTarget.id的值;

票数 1
EN

Stack Overflow用户

发布于 2019-04-22 14:09:41

这是因为您的hero在控制台时没有更新,所以在更新该值时需要使用useEffect钩子。

代码语言:javascript
复制
const setCurrentHero = e => {
  currentHero(e.target.id);
  console.log(hero);
};

useEffect(() => {
  console.log('Hero', hero);
}, [hero]);

票数 1
EN

Stack Overflow用户

发布于 2021-01-20 21:39:03

为什么不直接在呈现中设置值:

代码语言:javascript
复制
<HeroIcons
          key={id}
          id={id}
          src={src}
          altTag={altTag}
          setCurrentHero={setCurrentHero(id)}
        />
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55795542

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档