React 查找数组中所有未选中的元素
React find all unselected elements of the array
所以基本上我有一个对象数组,其中包含名称、id 和一个最初为 false 的 isSelected 值。当我将此数组映射到我的组件并显示它们时,我可以检测到使用我在 onClick={}.
中调用的 SelectHandler 函数选择的元素的索引
我想做的是让被选中的元素的 isSelected 为真,其余元素为假。因为我一次只能选择数组中的一个元素。然后选择元素样式后会发生变化。
我想知道如何实现这一点,以及我是应该使用 onClick 方法还是应该使用其他方法?
enter image description here
enter image description here
您可以使用单个状态变量跟踪当前选择的元素,例如
const [selectedId, setSelectedId] = useState();
然后,在onClick
onClick={() => setSelectedId(id)}
并且在元素的样式中,根据 selectedId 是否等于元素自己的 id 来应用样式
查看您的代码,并同意您可以使用单个状态变量来设置活动 ID,我想说您可以避免使用此 isSelected
布尔对象 属性 全部一起为这个特定的实例,像这样:
const UserProfileCard = (): JSX.Element => {
const [selectedId, setSelectedId] = useState<number | undefined>();
const MockSearchOptions = [
{ id: 1, option: 'Room Name' },
{ id: 2, option: 'Org Name' },
{ id: 3, option: 'Etc.....' },
];
return (
<div className="user-profile-card__search_options">
{MockSearchOptions.map((item, index) => {
const activeClassTag = selectedId === item.id ? '-selected' : '';
const { id, option } = item;
return (
<div
key={`${id}-${index}`}
onClick={() => setSelectedId(id)}
className={`user-profile-card__search-option${activeClassTag}`}
>
<p>{option}</p>
</div>
);
})}
</div>
);
};
首先不要发送对象的索引,如果您对数组进行排序或更改,索引可能会更改。只需发送点击对象的 ID。
onClick={() => selectHandler(item.id)}
const selectHandler = (id) => {
const tempArr = [...searchOptions]
tempArr.forEach(item => {
if(item.id === id) {
item.isSelected = !item.isSelected;
} else {
item.isSelected = false;
}
})
//if you use useState:
setSearchOptions([...tempArr])
}
所以基本上我有一个对象数组,其中包含名称、id 和一个最初为 false 的 isSelected 值。当我将此数组映射到我的组件并显示它们时,我可以检测到使用我在 onClick={}.
中调用的 SelectHandler 函数选择的元素的索引我想做的是让被选中的元素的 isSelected 为真,其余元素为假。因为我一次只能选择数组中的一个元素。然后选择元素样式后会发生变化。
我想知道如何实现这一点,以及我是应该使用 onClick 方法还是应该使用其他方法?
enter image description here
enter image description here
您可以使用单个状态变量跟踪当前选择的元素,例如
const [selectedId, setSelectedId] = useState();
然后,在onClick
onClick={() => setSelectedId(id)}
并且在元素的样式中,根据 selectedId 是否等于元素自己的 id 来应用样式
查看您的代码,并同意您可以使用单个状态变量来设置活动 ID,我想说您可以避免使用此 isSelected
布尔对象 属性 全部一起为这个特定的实例,像这样:
const UserProfileCard = (): JSX.Element => {
const [selectedId, setSelectedId] = useState<number | undefined>();
const MockSearchOptions = [
{ id: 1, option: 'Room Name' },
{ id: 2, option: 'Org Name' },
{ id: 3, option: 'Etc.....' },
];
return (
<div className="user-profile-card__search_options">
{MockSearchOptions.map((item, index) => {
const activeClassTag = selectedId === item.id ? '-selected' : '';
const { id, option } = item;
return (
<div
key={`${id}-${index}`}
onClick={() => setSelectedId(id)}
className={`user-profile-card__search-option${activeClassTag}`}
>
<p>{option}</p>
</div>
);
})}
</div>
);
};
首先不要发送对象的索引,如果您对数组进行排序或更改,索引可能会更改。只需发送点击对象的 ID。
onClick={() => selectHandler(item.id)}
const selectHandler = (id) => {
const tempArr = [...searchOptions]
tempArr.forEach(item => {
if(item.id === id) {
item.isSelected = !item.isSelected;
} else {
item.isSelected = false;
}
})
//if you use useState:
setSearchOptions([...tempArr])
}