我有附属于父母和子女组件的oncontextmenu事件。两者都是React合成事件,但事件。Stoppropagation无法阻止此。
两个都是React Events
编辑:我有一个顿悟,是因为我在内容编辑的div中保湿吗?反应不知道这两个组件都是子女,因为React忽略了可编辑的Divs中的内容。有没有办法使反应理解这一点?
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>);
}
两个上下文菜单事件都被称为
e.nativeEvent.stopImmediatePropagation();
本参考指南记录了Syntheticevent
因此,问题在我的编辑中所述,由于我的div是内容可编辑的,因此react不知道两个都是父元和子元素元素,因此当调用stoppropagation时什么都不做。<<<<<<<<。/p>
我发现的解决方案尽管一个混乱的解决方案是将子组件添加为 ref 然后使用javascript的 AddeventListener 方法连接React事件处理程序。由于事件不再合成,不再由React进行管理,因此该事件不再起泡。