【问题标题】:ReactJs - how to keep only one "active" section at a timeReactJs - 如何一次只保留一个“活动”部分
【发布时间】:2021-12-19 14:55:14
【问题描述】:

我在为我的问题找到解决方案或正确方向时遇到问题。目前点击 -> className="List-section" 会显示 -> className="Paragraph-container" 中的信息,但它有 4 个部分,我只想允许一个部分一次打开。目前我可以打开所有这些并显示出来。 如果有帮助,这里是原型的链接(以及流程应该如何): https://www.figma.com/proto/ooya7hVTx4BvdwQQFPXZcj/CCT-Lab-task?node-id=5%3A711&scaling=min-zoom&page-id=0%3A1&starting-point-node-id=5%3A509

提前感谢所有帮助!

父组件

function App() {
  const data = [
    {
      title: "Build test task",
      items: [
        "Create repositor",
        "Implement designs",
        "Implement functionality",
      ],
    },
    {
      title: "Submit your test task",
      items: [
        "Open email client",
        "Sent link information to careers@cornercasetech.com",
      ],
    },
    {
      title: "Participate in tech interview",
      items: ["Talk with HR", "Talk with Tech team"],
    },
    {
      title: "Reciece anster",
      items: ["Receive answers", "Start your IT career"],
    },
  ];

  return (
    <div className="App">
      <header className="App-header">
        <h1>CCT Lab Process</h1>
      </header>
      <div className="App-content">
      {data.map((dataObject, index) => (
        <ListItem key={index} listData={dataObject} listNumber={index + 1} />
      ))}
      </div>

    </div>
  );
}

子组件

function ListItem({ listNumber, listData }) {
  const [isShownOne, setIsShownOne] = useState(false);

  return (
    <div className="List">
      <div className="List-section" onClick={() => setIsShownOne(!isShownOne)}
      >
        <div className="Section-item">{listNumber}</div>
        <p className="Section-title">{listData.title}</p>
      </div>
      {isShownOne && (
        <div className="List-paragraph">
          {listData.items.map((paragraphItem, index) => (
            <div className="Paragraph-container" key={index}>
              <CheckedIcon  />
              <p className="Paragraph-item">{paragraphItem}</p>
            </div>
          ))}
        </div>
      )}
    </div>
  );
}

顺便说一句,尝试谷歌搜索所有可能的选项,但无法找到解决方案。有些人建议检查父组件中的 id 并将逻辑传递给子组件。感觉有点失落!

【问题讨论】:

  • 如果您在这里搜索“react 手风琴”,您可能会找到一个很好的答案。

标签: javascript reactjs react-hooks onclick components


【解决方案1】:

将状态提升到父组件中,并将其更改为数字。该值表示打开的子项(如果有)。然后将一个道具传给每个孩子。

function App() {
  const [open, setOpen] = useState(-1);

  // ...
  {data.map((dataObject, index) => (
    <ListItem 
      key={index} 
      listData={dataObject} 
      listNumber={index + 1} 
      open={open === index}
      setOpen={setOpen}
    />
  ))}
}

function ListItem({ listNumber, listData, open, setOpen }) {
  // ...
  <div 
    className="List-section" 
    onClick={() => {
      setOpen(prev => {
        if (prev === listNumber - 1) {
          return -1;
        } else {
          return listNumber - 1;
        }
      })
    }}
  >
  // ...
  {open && (
    <div className="List-paragraph">
      {listData.items.map((paragraphItem, index) => (
        <div className="Paragraph-container" key={index}>
          <CheckedIcon  />
          <p className="Paragraph-item">{paragraphItem}</p>
        </div>
      ))}
    </div>
  )}
  </div>
}

您可能对这篇文章感兴趣:https://reactjs.org/docs/lifting-state-up.html

【讨论】:

  • 成功了,我一直在努力寻找 7 小时的解决方案......非常感谢,这是一个简单而优雅的解决方案!!!
猜你喜欢
  • 2023-03-22
  • 1970-01-01
  • 2017-04-10
  • 2019-08-24
  • 1970-01-01
  • 2020-08-15
  • 1970-01-01
  • 1970-01-01
  • 2019-02-19
相关资源
最近更新 更多