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