【问题标题】:(ReactJS) Separate trigger for each Collapsible element (react-collapsible)(ReactJS) 每个可折叠元素的单独触发器 (react-collapsible)
【发布时间】:2021-04-22 14:23:54
【问题描述】:

如何使用单个 useState(最好)为每个可折叠元素创建单独的触发器?

CodeSandBox - https://codesandbox.io/s/separate-triggers-question-forked-vgs5b

App.js

import React from "react";
import Collapsible from "react-collapsible";

function App() {
  const database = [
    { id: 1, name: "Name1", description: "Desc1" },
    { id: 2, name: "Name2", description: "Desc2" },
    { id: 3, name: "Name3", description: "Desc3" },
    { id: 4, name: "Name4", description: "Desc4" },
    { id: 5, name: "Name5", description: "Desc5" }
  ];

  const [items, setItems] = React.useState(database);
  const [open, setOpen] = React.useState(false);

  return (
    <div className="tracker_master">
      {items.map((item, index) => (
        <div onClick={() => setOpen(!open)} key={item.id}>
          {item.name.toUpperCase()}

          <Collapsible open={open}>
            <div>{item.description.toUpperCase()}</div>
          </Collapsible>
        </div>
      ))}
    </div>
  );
}

export default App;

【问题讨论】:

标签: reactjs use-state


【解决方案1】:

要为每个项目设置单独的触发器,我建议将每个元素抽象为具有自己打开状态的自己的组件。

所以你可以这样做:

const Item = ({ item }) => {
  const [open, setOpen] = React.useState(false);
  return (
    <div onClick={() => setOpen(!open)} key={item.id}>
      {item.name.toUpperCase()}

      <Collapsible open={open}>
        <div>{item.description.toUpperCase()}</div>
      </Collapsible>
    </div>
  );
};

function App() {
  const database = [
    { id: 1, name: "Name1", description: "Desc1" },
    { id: 2, name: "Name2", description: "Desc2" },
    { id: 3, name: "Name3", description: "Desc3" },
    { id: 4, name: "Name4", description: "Desc4" },
    { id: 5, name: "Name5", description: "Desc5" }
  ];

  return (
    <div className="tracker_master">
      {database.map((item) => (
        <Item item={item} key={item.id} />
      ))}
    </div>
  );
}

sandbox example

【讨论】:

    【解决方案2】:

    如果你想使用单个useState,那么你的单个状态对象应该管理所有项目的打开标志,如下所示(我已经更新了你的代码并测试了它的工作正常)。

    openFlags 是单一状态,它通过 id 维护每个项目的打开标志,并使用它来触发协作和独立展开项目。

    import React from "react";
    import Collapsible from "react-collapsible";
    
    function App() {
      const database = [
        { id: 1, name: "Name1", description: "Desc1" },
        { id: 2, name: "Name2", description: "Desc2" },
        { id: 3, name: "Name3", description: "Desc3" },
        { id: 4, name: "Name4", description: "Desc4" },
        { id: 5, name: "Name5", description: "Desc5" }
      ];
    
      const [items, setItems] = React.useState(database);
      let initialOpenFlags = {}
       items.forEach((i) => {
        initialOpenFlags = {
          ...initialOpenFlags,
          [i.id]: false
        };
      });
      const [openFlags, setOpenFlags] = React.useState(initialOpenFlags);
    
      return (
        <div className="tracker_master">
          {items.map((item, index) => (
            <div
              onClick={() =>
                setOpenFlags({ ...openFlags, [item.id]: !openFlags[item.id] })
              }
              key={item.id}
            >
              {item.name.toUpperCase()}
    
              <Collapsible open={openFlags[item.id]}>
                <div>{item.description.toUpperCase()}</div>
              </Collapsible>
            </div>
          ))}
        </div>
      );
    }
    
    export default App;
    
    

    【讨论】:

      猜你喜欢
      • 2013-09-13
      • 2022-12-18
      • 1970-01-01
      • 2015-02-09
      • 2022-01-25
      • 1970-01-01
      • 2019-07-25
      • 2014-02-24
      • 1970-01-01
      相关资源
      最近更新 更多