反应 onClick 事件触发一键为时已晚

如何解决反应 onClick 事件触发一键为时已晚

我设置了一个组件来显示所有拥有帐户的玩家的照片。然后使用 onClick 事件处理程序在父组件中呈现该组件。问题是 onClick 事件触发一次点击太晚了。所以在第一次点击时状态不会改变,只有当我再次点击同一个播放器时状态才会改变。如果我点击下一个玩家,状态将仍然记录前一个玩家。下面是我负责该组件的代码片段。

以下是组件的设置。

const PlayerPhotos = ({ profiles,onClick }) => {
  return (
    <div className='playerPhotosRow'>
      <ul>
        {profiles.map((e) => (
          <li key={e.email}>
            <img src={e.photoURL} onClick={onClick} id={e.email}></img>
          </li>
        ))}
      </ul>
    </div>
  );
};`

const PlayerLoadChart = ({ profiles }) => {
  const [emailSelect,setEmailSelect] = useState('');

  const HandleClick = (e) => {
    setEmailSelect(e.target.id);
  };

  return (
    <div>{<PlayerPhotos profiles={profiles} onClick={HandleClick} />}</div>
  );
};

解决方法

首先移除 <PlayerPhotos profiles={profiles} onClick={HandleClick} /> 周围的 {}(div 也是不必要的,但不会影响功能)。并将函数名称更改为:handleClick(函数首字母小写)。

我不是 100% 认为这会解决问题,但从这个开始:)

那么我认为你应该有一个按钮而不是一个 img 标签(但那是为了可访问性)

const PlayerLoadChart = ({ profiles }) => {
  const [emailSelect,setEmailSelect] = useState('');

  const HandleClick = (e) => {
    setEmailSelect(e.target.id);
  };

  return (
    <PlayerPhotos profiles={profiles} onClick={HandleClick} />
  );
};
,

我刚刚复制了您的代码并进行了一些改进。目前没有问题。

const PlayerPhotos = ({profiles,onClick}) => {
  return (
    <div className='playerPhotosRow'>
      <ul>
        {profiles.map((profile) => (
          <li key={profile.email}>
            <img
              id={profile.email}
              src={profile.photoURL}
              onClick={onClick}
            />
          </li>
        ))}
      </ul>
    </div>
  );
};

const PlayerLoadChart = ({ profiles }) => {
  const [emailSelect,setEmailSelect] = React.useState('');

  const onClickHandler = React.useCallback((e) => {
    setEmailSelect(e.target.id);
  },[]);

  return (
    <div>
      <h1>{'Email: '}{emailSelect || 'none'}</h1>
      <PlayerPhotos profiles={profiles} onClick={onClickHandler} />
    </div>
  );
};

const App = () => {
  const profiles = [
    {
      email: 'user1@test.com',photoURL: 'https://via.placeholder.com/150.png?text=User+1'
    },{
      email: 'user2@test.com',photoURL: 'https://via.placeholder.com/150.png?text=User+2'
    },{
      email: 'user3@test.com',photoURL: 'https://via.placeholder.com/150.png?text=User+3'
    }
  ];
  
  return <PlayerLoadChart profiles={profiles} />;
};

ReactDOM.render(<App />,document.getElementById('app'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/17.0.2/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/17.0.2/umd/react-dom.production.min.js"></script>

<div id='app'></div>

,

从上面给出的代码中,我试图重现您提到的问题,但代码似乎运行良好。这是我的 codepen link,下面是您使用的代码。

在codepen中,你可能会注意到,当你点击图片时,相关的电子邮件会被记录在控制台中。

const PlayerPhotos = ({ profiles,onClick }) => {
    
    return (
      <div className='playerPhotosRow'>
        <ul>
          {profiles.map((e) => (
            <li key={e.email}>
              <img src={e.photoURL} onClick={onClick} id={e.email} />
            </li>
          ))}
        </ul>
      </div>
    );
};
  
const PlayerLoadChart = ({ profiles}) => {
    const [emailSelect,setEmailSelect] = React.useState('');
  
    const HandleClick = (e) => {
      setEmailSelect(e.target.id)
    }
  
    console.log(emailSelect);
    return (
        <div>
          {<PlayerPhotos profiles={profiles} onClick={HandleClick} />}
        </div>
    )
}

const App = () => {

    const profiles = [
        {
            email: "a@a.com",photoURL: "https://i.insider.com/5d0019836fc92043771f7522?width=750&format=jpeg&auto=webp",},{
            email: "a@b.com",photoURL: "https://lh3.googleusercontent.com/proxy/0vSwNGIyNd3sFKdRtyqquaOcs9sC75JNkklvfvUykS952p9ZICbgwOcjXuBHaXi60_TQz3le_keQ3dOTTKzj_2ZA7twMmDV1f-Ah3PY9HhKEfHbo39eOebDc7XZ93xlB4Bte9uiHmhFg",]

    return <div>
        <PlayerLoadChart profiles={profiles}/>
    </div>
}

ReactDOM.render(
  <React.StrictMode>
      <App />
  </React.StrictMode>,document.getElementById('root')
);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?