只有 1 个真实状态介绍数组 React js

Only 1 true state intro array React js

怎么了?

我正在尝试使用 ReactJS (NextJS) 从 frontity 主页重现滑动按钮效果。 Sliding buttons from Frontity

我设法创建了滑动按钮效果,但我在状态管理方面遇到困难。 我将我所有的对象都映射为“isActive:true/false”元素,我将创建一个函数,将“isActive:true”放在单击的按钮上,但将“isActive:false”放在所有其他按钮上。 我不知道那种东西的语法/方法。

请查看我的 codesandbox 以获得更清晰的信息(使用反应挂钩): https://codesandbox.io/s/busy-shirley-lgx96

非常感谢大家:)

更新:正如上面 Drew Reese 所指出的,更 cleaner/easier 是只有一个 activeIndex 状态:

const TabButtons = () => {
  const [activeIndex, setActiveIndex] = useState(0);

  const handleButtonClick = (index) => {
    setActiveIndex(index);
  };

  return (
    <>
      <ButtonsWrapper>
        {TabButtonsItems.map((item, index) => (
          <div key={item.id}>
            <TabButtonItem
              label={item.label}
              ItemOrderlist={item.id}
              isActive={index === activeIndex}
              onClick={() => handleButtonClick(index)}
            />
          </div>
        ))}
        <SlidingButton transformxbutton={activeIndex}></SlidingButton>
      </ButtonsWrapper>
    </>
  );
};

我对你的 TabButtons 做了一点修改:

const TabButtons = () => {
  const [buttonProps, setButtonProps] = useState(TabButtonsItems);

  // ////////////   STATE OF SLIDING BUTTON (TRANSLATE X )  ////////////

  const [slidingbtn, setSlidingButton] = useState(0);

  // //////////// HANDLE CLIK BUTTON  ////////////

  const HandleButtonState = (item, index) => {
    setButtonProps((current) =>
      current.map((i) => ({
        ...i,
        isActive: item.id === i.id
      }))
    );

    setSlidingButton(index);
  };

  return (
    <>
      <ButtonsWrapper>
        {buttonProps.map((item, index) => (
          <div key={item.id}>
            <TabButtonItem
              label={item.label}
              ItemOrderlist={item.id}
              isActive={item.isActive}
              onClick={() => HandleButtonState(item, index)}
            />
          </div>
        ))}
        <SlidingButton transformxbutton={slidingbtn}></SlidingButton>
      </ButtonsWrapper>
    </>
  );
};

当我们点击一​​个按钮时,我们将其 isActive 状态设置为 true,并将所有其余按钮设置为 isActive: false。我们也应该使用状态,因为我们也声明了它。更改状态将强制组件为 re-render,我们也没有改变任何东西,而是重新创建按钮的状态。