javascript - 反应 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>
);
};
解决方案
我刚刚复制了您的代码并进行了一些改进。到目前为止没有任何问题。
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>
推荐阅读
- .net-core - 为什么我的验证器无法捕获必填字段错误
- angular - 结构类型和多态 - 添加超类型
- python - python 无法让代码正常工作
- laravel - Laravel 计数 > N
- vagrant - Vagrant Up (private_network) 错误:默认值:警告:连接中止。重试
- node.js - 为什么nodejs在处理路由请求后返回404?
- babeljs - 如何使汇总扩展`require`语句?
- javascript - JavaScript
不工作 - javascript - MeteorJS - 添加 SlickJS afterChange 事件
- laravel-5 - Laravel 在从 Gmail API 发送电子邮件时使用视图