event.Stoppropagation无法停止冒泡父母



我有附属于父母和子女组件的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进行管理,因此该事件不再起泡。

相关内容

  • 没有找到相关文章

最新更新