我有这样的场景,当单击父元素时,它会翻转以显示具有不同颜色的子元素。不幸的是,当用户单击其中一种颜色时,父元素上的“click”事件也会被触发。
当子项被点击时,如何停止父项上的事件触发?
我想知道的可能的解决方案:
pointer-events : none
pointer-events
ref
React
event.target
非常感谢您的想法和更好的解决方案。问题是:当单击子项时,如何停止父项上的事件触发器?
为了防止单击子元素时触发父元素上的事件,可以使用stopPropagationJavaScript 中的方法。此方法会阻止事件冒泡到父元素。
stopPropagation
以下是如何在 React 应用程序中实现此目的:
event.stopPropagation()
下面是一个完整的例子来演示这一点:
import React from 'react'; const Child = ({ onClick, color }) => ( <div onClick={(e) => { e.stopPropagation(); onClick(); }} style={{ backgroundColor: color, padding: '20px', margin: '10px', cursor: 'pointer' }} > {color} </div> ); const Parent = () => { const [flipped, setFlipped] = React.useState(false); const handleParentClick = () => { setFlipped(!flipped); }; const handleChildClick = (color) => { console.log(`Child ${color} clicked`); }; return ( <div onClick={handleParentClick} style={{ padding: '50px', border: '2px solid black', cursor: 'pointer' }} > {flipped ? ( <div> <Child onClick={() => handleChildClick('red')} color="red" /> <Child onClick={() => handleChildClick('blue')} color="blue" /> <Child onClick={() => handleChildClick('green')} color="green" /> </div> ) : ( <div>Click to flip</div> )} </div> ); }; export default Parent;
Child
onClick
color
div
div``e.stopPropagation()``onClick
Parent
flipped
handleParentClick
handleChildClick
此解决方案无需 CSS 技巧或全局引用,直接解决了事件传播问题。此stopPropagation方法是管理嵌套组件中事件处理的一种简洁有效的方法。