使用 Hooks 在 React Js 中切换多个部分的问题
Toggle issue with multiple section in React Js using Hooks
当我有两个不同的“Select 全部”按钮时,切换不起作用。当前功能正在运行“Select 全部”和单一选择。它不工作另一个“Select all”它在同一个列表中。
<div>
{othersinfo?.map(({ icon, title, subTitle }, index) => {
return (
<>
<div key={index} className='events__firstSection'>
<div className='events__agreeToAllContainer'>
{icon && (
<Icon name={icon} className='events__noticeIcon' isForceDarkMode />
)}
<div className={icon ? 'events__text' : 'events__text events__leftAlign '}>
{title}
</div>
</div>
<Toggle
containerClass='events__toggle'
checked={toggledItems.includes(title)}
onToggle={(isToggled) => toggleItem(isToggled, title)}
/>
</div>
{subTitle && <div className='events__description'>{subTitle}</div>}
<div className={index !== eventsnfo.length - 1 && 'events__divider'}></div>
</>
);
})}
</div>;
切换项目操作
const toggleItem = (isToggled, value) => {
let items = [...toggledItems];
if (isToggled) {
items =
value === "select All"
? eventsnfo?.map((events) => events.title)
: [...items, value];
if (items?.length === eventsnfo?.length - 1) {
items.push("select All");
}
} else {
items =
value === "select All"
? []
: [...items.filter((item) => item !== value && item !== "select All")];
}
setToggledItems(items);
};
您可以通过如下更改 toggleItem
函数来实现此功能。
const toggleItem = (isToggled, value) => {
let items = [...toggledItems];
const subItemArray = titleArray
?.filter((events) => events.type === "subItems")
.map((filteredArray) => filteredArray.title);
if (isToggled) {
items =
value === "select All"
? titleArray?.map((events) => events.title)
: value === "sub select All"
? [...subItemArray, ...items]
: [...items, value];
if (
subItemArray.every((val) => items.includes(val)) &&
!items.includes("sub select All")
) {
items.push("sub select All");
}
if (items?.length === titleArray?.length - 1) {
items.push("select All");
}
} else {
items =
value === "select All"
? []
: value === "sub select All"
? items.filter(
(el) =>
!subItemArray.includes(el) &&
el !== "sub select All" &&
el !== "select All"
)
: [
...items.filter((item) => item !== value && item !== "select All")
];
if (
subItemArray.includes(value) &&
items.indexOf("sub select All") >= 0
) {
items.splice(items.indexOf("sub select All"), 1);
}
}
setToggledItems(items);
};
这里是demo
当我有两个不同的“Select 全部”按钮时,切换不起作用。当前功能正在运行“Select 全部”和单一选择。它不工作另一个“Select all”它在同一个列表中。
<div>
{othersinfo?.map(({ icon, title, subTitle }, index) => {
return (
<>
<div key={index} className='events__firstSection'>
<div className='events__agreeToAllContainer'>
{icon && (
<Icon name={icon} className='events__noticeIcon' isForceDarkMode />
)}
<div className={icon ? 'events__text' : 'events__text events__leftAlign '}>
{title}
</div>
</div>
<Toggle
containerClass='events__toggle'
checked={toggledItems.includes(title)}
onToggle={(isToggled) => toggleItem(isToggled, title)}
/>
</div>
{subTitle && <div className='events__description'>{subTitle}</div>}
<div className={index !== eventsnfo.length - 1 && 'events__divider'}></div>
</>
);
})}
</div>;
切换项目操作
const toggleItem = (isToggled, value) => {
let items = [...toggledItems];
if (isToggled) {
items =
value === "select All"
? eventsnfo?.map((events) => events.title)
: [...items, value];
if (items?.length === eventsnfo?.length - 1) {
items.push("select All");
}
} else {
items =
value === "select All"
? []
: [...items.filter((item) => item !== value && item !== "select All")];
}
setToggledItems(items);
};
您可以通过如下更改 toggleItem
函数来实现此功能。
const toggleItem = (isToggled, value) => {
let items = [...toggledItems];
const subItemArray = titleArray
?.filter((events) => events.type === "subItems")
.map((filteredArray) => filteredArray.title);
if (isToggled) {
items =
value === "select All"
? titleArray?.map((events) => events.title)
: value === "sub select All"
? [...subItemArray, ...items]
: [...items, value];
if (
subItemArray.every((val) => items.includes(val)) &&
!items.includes("sub select All")
) {
items.push("sub select All");
}
if (items?.length === titleArray?.length - 1) {
items.push("select All");
}
} else {
items =
value === "select All"
? []
: value === "sub select All"
? items.filter(
(el) =>
!subItemArray.includes(el) &&
el !== "sub select All" &&
el !== "select All"
)
: [
...items.filter((item) => item !== value && item !== "select All")
];
if (
subItemArray.includes(value) &&
items.indexOf("sub select All") >= 0
) {
items.splice(items.indexOf("sub select All"), 1);
}
}
setToggledItems(items);
};
这里是demo