使用 Hooks 在 React Js 中切换问题

Toggle issue in React Js using Hooks

我正在尝试实现切换功能,通过使用此功能,用户可以 select 所需的单个偏好,并且用户还可以 select 所有偏好,方法是使用“Select 所有“ 按钮。我已经实现了支持单个 selection 的代码,我想实现 select 所有功能。

这就是我处理切换的方式

const toggleItem = useCallback((isToggled, value) => {
    if (isToggled) {
        setToggledItems((prevState) => [...prevState, value]);
    } else {
        setToggledItems((prevState) => [...prevState.filter((item) => item !== value)]);
    }
}, []);

const [toggledItems, setToggledItems] = useState([]);

var eventsnfo = [
    {
        icon: '',
        title: 'select All',
        subTitle: '',
    },
    {
        icon: 'event1',
        title: 'event1',
        subTitle: 'event1desc',
    },
    {
        icon: 'event2',
        title: 'event2',
        subTitle: 'event2desc',
    },
    {
        icon: 'event3',
        title: 'event3',
        subTitle: 'event3desc',
    },
    {
        icon: 'event4',
        title: 'event4',
        subTitle: 'event4desc',
    },
];

这就是我加载所有切换部分的方式

<div>
    {eventsnfo?.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>;

我想你可以通过改变你的toggleItem函数来切换所有

  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);
  };

工作Demo