wit*_*221 3 onclick typescript reactjs
我正在构建一个 React 组件,将其包裹在其他组件周围,这些组件将使子组件变灰并(希望)使它们对点击不做出反应。
我的做法是:
const TierGater: React.FC = (props) => {
const handleTierGaterClick = (e: React.MouseEvent<HTMLDivElement>) => {
console.log("outer - should be called");
// e.stopPropagation();
// e.preventDefault();
};
return (
<div onClick={handleTierGaterClick}>
<div
onClick={() => {
console.log("inner - should not be called");
}}
>
{props.children}
</div>
</div>
);
};
export default TierGater;
Run Code Online (Sandbox Code Playgroud)
我希望这是一个通用的解决方案,允许我任意包装组件,而无需修改子组件的 onClick。
我已经扫描了各种解决方案,但我的理解是事件处理程序将从孩子的命令触发到父母的命令。上面示例的控制台日志证实了这一点(首先调用内部)。
我相信我可以更改子项以检查事件目标并基于此中止 onClick 逻辑,但这违背了组件的目的 - 它应该环绕任何子项而不修改子项。
以上可能吗?如果是,需要进行哪些改变?
附带问题:我的事件处理程序的类型为React.MouseEvent<HTMLDivElement>
- 如何使其同时适用于鼠标和触摸事件?
使用onClickCapture
,您可以在捕获阶段拦截事件,然后将其传递给子级,并阻止它们传播:
<div onClickCapture={handleTierGaterClick}>
Run Code Online (Sandbox Code Playgroud)
const handleTierGaterClick = (e: React.MouseEvent<HTMLDivElement>) => {
e.stopPropagation();
e.preventDefault();
};
Run Code Online (Sandbox Code Playgroud)
为了更加 UI 友好,褪色的背景也许pointer-events: none
也会很好。