javascript - 为什么 id 和 itemId 在此代码中的工作方式不同?
问题描述
代码:
const Game = () => {
const [itemId, setItemId] = useState('');
const [letters, setLetter] = useState([]);
const handleItemClick = (id) => {
letters[letters.length - 1] === 'H' ? setLetters([...letters, 'L']) :
setLetters([...letters, 'H']);
setItemId(id);
}
return (
<div class="app">
<ul>
{
[...Array(9)].map((_, idx) => {
return (
<Item
letters={letters}
handleSquareClick={handleItemClick}
id={idx}
itemId={itemId}
/>
)
})
}
</ul>
</div>
)
}
Item
零件
const Item = ({letters, handleItemClick, id, itemId }) => {
return (
<li
onClick={() => handleItemClick(id)}
>
//the problem is here
//letters[id] returns different result from letters[itemId]
</li>
)
}
为什么letters[itemId]
在Item
组件中使用,让所有li
的'一键接收'H'字母,而letters[id]
让li的每一个点击接收值
解决方案
问题是:
因为 itemId 与您所有的相同<Item>
,所以与所有共享单个值<Item>
这idx
是索引并且是所有的差异<Item>
const [letters, setLetters] = useState([]);
const [itemId, setItemId] = useState(null);
const handleItemClick = id => {
letters[letters.length - 1] === "H"
? setLetters([...letters, "L"])
: setLetters([...letters, "H"]);
setItemId(id); // <---- itemId is being set from here
};
{[...Array(9)].map((_, idx) => { // <----- idx coming from here, and is index
return (
<Item
letters={letters}
handleItemClick={handleItemClick}
id={idx} // <--- this is index, comes diff for all item
itemId={itemId} // <--- you are passing same value for all item
/>
);
})}
您可以将 Item 组件替换为以下一个并检查两个值
const Item = ({ letters, id, itemId, handleItemClick }) => {
return <li onClick={() => handleItemClick(id)}>idx : {idx} and item Id : {itemId} ---> {letters[itemId]}</li>;
};
请检查:
推荐阅读
- php - 如何获取给定用户名的所有推文(在 PHP 中)
- r - Theme() 不适用于 ggplot2 Unicode 显示
- php - 选中复选框,删除选中的消息
- ios - 如何在 UIView - Swift 中居中我的 CAShapeLayer?
- amazon-web-services - AWS Lambda - NAT 网关互联网访问导致超时
- ios - 使用 AudioKit 将音频文件作为麦克风输入播放 - 用于 iOS 模拟器听写测试
- arrays - 根据前一个元素的每个值的百分比差异创建一个数组
- ios - 保存到多个实体中 - 核心数据 - Swift
- python - 如何在 Python 中水平移动直方图?
- python - 在这种情况下我应该使用什么正则表达式?