我将onContextMenu事件附加到父组件和子组件。两者都是反应合成事件,但是event.stopPropagation无法阻止它。
两者都是反应性事件
编辑:我有一个顿悟,是因为我在内容可编辑的div中充水了吗?和react不知道这两个组件都是父组件,因为react会忽略可编辑div中的内容。有没有办法让反应能理解这一点?
ParentComponent
const CMSCheckBox = (props, ref) => {
openMenu=()=>{
alert("Parent");
}
//hydrating components based on props
useEffect(() => {
if (props.objValue && props.objValue.SubElements) {
props.objValue.SubElements.map(SubElement => {
let strDivId = SubElement.DivId ? SubElement.DivId : "element_" + SubElement.iElementId;
if (!document.getElementById(strDivId)) {
let objSavedSel = ApplicationState.GetProperty("objActiveSelection");
if (objSavedSel && objSavedSel != null) {
let divElement;
divElement = document.createElement("span");
ApplicationState.SetProperty("objActiveDiv",
{
strDivId: strDivId
});
divElement.id = strDivId;
divElement.setAttribute('type', SubElement.iElementType.toLowerCase() + 'div');
let range = document.createRange();
range.setStart(document.getElementById(objSavedSel.divId),
0);
range.collapse(true);
var nodeStack = [document.getElementById(objSavedSel.divId)
], node, foundStart = false, stop = false, charIndex = 0;
while (!stop && (node = nodeStack.pop())) {
if (node.nodeType == 3) {
var nextCharIndex = charIndex + node.length;
if (!foundStart && objSavedSel.intStart >= charIndex && objSavedSel.intStart <= nextCharIndex) {
range.setStart(node, objSavedSel.intStart - charIndex);
foundStart = true;
}
if (foundStart && objSavedSel.intEnd >= charIndex && objSavedSel.intEnd <= nextCharIndex) {
range.setEnd(node, objSavedSel.intEnd - charIndex);
stop = true;
}
charIndex = nextCharIndex;
} else {
var i = node.childNodes.length;
while (i--) {
nodeStack.push(node.childNodes[i
]);
}
}
}
range.deleteContents();
range.insertNode(divElement); //insert div to hydrate
}
}
let Element = UndoRedo(ElementController.getComponent(SubElement.iElementType.toLowerCase()));
ReactDom.hydrate(<Provider store={store
} ><Element ElementJson={SubElement
} PageId={props.PageId
} Mode={props.Mode
} /></Provider>, document.getElementById(strDivId));
// setTimeout(() => {
// onContentChange();
// }, 100);
})
}
return () => {
divRef.current.removeEventListener("blur", onContentChange_Callbck);
divRef.current.removeEventListener("mousedown", onMouseDown_Callbck);
}
},
[state, props
])
retrun (<div onContextMenu={} contenteditable="true"></div>)
}
根据点击位置将子组件合并到父组件中内容可编辑的div中
const Child =(props,ref) =>{
const openmenu=(e)=>{
e.stopPropagation(); //doesnt work
alert("child");
}
return (<div onContextMenu={openmenu}>Test</div>);
}
两个上下文菜单事件都被调用
答案 0 :(得分:1)
所以问题出在我的编辑中,因为我的div是可编辑的内容,react不知道它们都是父和子dom元素,因此在调用stopPropagation时什么也不做。
我发现一种解决方案,尽管很麻烦,但它是将子组件添加为 ref ,然后使用javascript的 addEventListener 方法附加react事件处理程序。由于该事件不再是合成事件,也不是由react管理,因此该事件不再冒泡给父事件。
答案 1 :(得分:0)
e.nativeEvent.stopImmediatePropagation();
本参考指南记录了SyntheticEvent