使用 useState hooks React 隐藏多个 div

Hide multiple divs with useState hooks React

我正在尝试使用 useSate 隐藏多个 div。

它们将在页面上随机呈现,而不是从列表中呈现。

我通过设置不同的变量设法做到了这一点,但找不到更通用的解决方案: https://stackblitz.com/edit/react-t3shrc?file=src%2FApp.js

还有点击外部时关闭它们的方法吗?

你能帮忙吗

export default function App() {
      const [isVisible, setIsVisible] = useState(false);
      const [isVisible2, setIsVisible2] = useState(false);

      const showInfo = (e, setIsVisible) => {
        e.preventDefault();
        setIsVisible(true);
      };
      const hideInfo = (e, setIsVisible) => {
        e.preventDefault();
        setIsVisible(false);
      };

      return (
        <div>
          <button
            onClick={(e) => {
              showInfo(e, setIsVisible);
            }}
          >
            Show info 1
          </button>
          {isVisible && (
            <div className="info">
              Info 1
              <button
                onClick={(e) => {
                  hideInfo(e, setIsVisible);
                }}
              >
                Close
              </button>
            </div>
          )}
          <br></br>
          <br></br>
          <button
            onClick={(e) => {
              showInfo(e, setIsVisible2);
            }}
          >
            Show info 2
          </button>
          {isVisible2 && (
            <div className="info">
              Info 2
              <button
                onClick={(e) => {
                  hideInfo(e, setIsVisible2);
                }}
              >
                Close
              </button>
            </div>
          )}
        </div>
      );
    }

我不是 100% 确定您所说的更多 'generic' 解决方案是什么意思。这是我想到的:

首先,我们创建一个更复杂的对象来基本上保存我们遇到的所有变量/部分,并将其用作我们的状态。

const initialVisibleAreas = {
  area1: true,
  area2: false
};

const [visibleAreas, setVisibleAreas] = useState(initialVisibleAreas);

请注意,这可能是您想使用 Object.keys(...) 或映射数组从数据中生成的内容。

接下来,我们为按钮创建函数以相应地使用这个新状态:

  // shows the element by given key
  const showInfo = (event, key) => {
    event.preventDefault();
    setVisibleAreas({ ...visibleAreas, ...{ [key]: true } });
  };

  // hides the element by given key
  const hideInfo = (event, key) => {
    event.preventDefault();
    setVisibleAreas({ ...visibleAreas, ...{ [key]: false } });
  };

  // sets every key to false to hide them all at once
  const hideAllInfo = (event) => {
    event.preventDefault();

    const allFalse = Object.assign(
      ...Object.keys(visibleAreas).map((key) => ({ [key]: false }))
    );

    setVisibleAreas(allFalse);
  };

最后但同样重要的是,我们在 jsx 中使用它们。这基本上是一个 'section':

<button
  onClick={(e) => {
    showInfo(e, 'area2');
  }}
>
  Show info 2
</button>
{
  visibleAreas['area2'] && (
    <div className="info">
      Info 2
      <button
        onClick={(e) => {
          hideInfo(e, 'area2');
        }}
      >
        Close
      </button>
    </div>
  );
}

回答最后一个问题;没有什么可以阻止您在周围 div 的 onClick 处理程序中调用 'hideAllInfo'。示例包含在修改后的 stackblitz 中。

完整查看修改后的stackblitz

编辑:如果您想通过单击周围的 div 来关闭所有区域,请确保不要传播按钮单击事件:

event.stopPropagation();

我再次更新了 stackblitz。