javascript 单击子元素时自动关闭折叠/可折叠操作

zdwk9cvp  于 2022-12-25  发布在  Java
关注(0)|答案(1)|浏览(162)

当单击子元素Button时,折叠/折叠会自动关闭。如何防止?
沙盒:https://codesandbox.io/s/restless-tdd-9qzmb3?file=/src/App.js

export default function App() {
  const [accordion, setAccordion] = useState([true, false]);
  const handleCollapse = useCallback(
    (newIdx) => {
      const state = accordion.map((val, index) =>
        index === newIdx ? !val : false
      );
      setAccordion(state);
    },
    [accordion]
  );

  return (
    <div className="App">
      <div
        style={{ marginTop: "1rem", cursor: "pointer" }}
        onClick={() => handleCollapse(0)}
        aria-expanded={accordion[0]}
        aria-controls={"basic-collapsible-0"}
      >
        <Card sectioned>
          <div style={{ display: "flex", justifyContent: "space-between" }}>
            <Text variant="headingMd" as="h6">
              Accordion 1
            </Text>
            <Icon source={accordion[0] ? ChevronUpMinor : ChevronDownMinor} />
          </div>
          <Collapsible
            open={accordion[0]}
            id="basic-collapsible"
            transition={{ duration: "400ms", timingFunction: "ease-in-out" }}
          >
            <div style={{ padding: "5rem" }}>
              <Button onClick={() => {}}>Child Action 1</Button>
            </div>
          </Collapsible>
        </Card>
      </div>

      
    </div>
  );
}
svujldwt

svujldwt1#

将onClick处理程序从父元素移到切换器元素这样就不会影响子元素,但是如果有必要的话,你可以将click处理程序保留在父元素上,你有两个选择.
1:通过在子元素上放置一个类似<div onClick={e=> e.stopPropagation()}>的单击处理程序来防止子元素传播事件,这将随着子元素的增长而变得非常困难。
2:检查被点击的元素是否在你的父div里面。
使用e.currentElement获取您将事件分配到的元素
使用e.target获取触发此事件的元素
然后可以使用contains方法检查单击的元素是否是父元素的子元素
例如e.currentElement.contains(e.target)

相关问题