reactjs - Dom 包含或比较 React 中的文档位置模拟

标签 reactjs

我有一些组件包含另一个门户组件,例如

<Parent>
    <Portal>
        <Child>Lorem Ipsum</Child>
    </Portal>
</Parent>

但是在真实的 dom 上它看起来像:

<div class="parent"></div>
<div class="child">Lorem Ipsum</div>

我需要知道,子组件的 native 节点是父组件的子节点。

最佳答案

嗯,我遇到了一个稍微不同的问题。并且Parent包含Child,我们可以通过事件冒泡知道。

门户:

class Portal extends React.Component {
  el: any;

  constructor(props: any) {
    super(props);
    this.el = document.createElement('div');
  }

  componentDidMount() {
    document.body.appendChild(this.el);
  }

  componentWillUnmount() {
    document.body.removeChild(this.el);
  }

  render() {
    return ReactDOM.createPortal(
      this.props.children,
      this.el,
    );
  }
}

child :

class Child extends React.Component {
  render() {
    return <div className="child">Lorem Ipsum</div>;
  }
}

父级:

class Parent extends React.Component {
  target: any;

  componentDidMount () {
    document.addEventListener('mousedown', this.onDocMouseDown);
  }

  componentWillUnmount () {
    document.removeEventListener('mousedown', this.onDocMouseDown);
  }

  onDocMouseDown = (e: any) => {
    const target = e.target;
    const isChild = this.target === target;

    if (isChild) {
      // do something
    }

    this.target = null;

  };

  onElemMouseDown = (e: any) => {
    this.target = e.target;
  };

  render() {
    return (
      <div className="parent" onMouseDown={this.onElemMouseDown}>
        <Portal>
          <Child />
        </Portal>
      </div>
    );
  }
}

来自 React Portal 文档:

An event fired from inside a portal will propagate to ancestors in the containing React tree, even if those elements are not ancestors in the DOM tree

在父类中,我们在文档和包装 div 上有事件“mousedown”的句柄。当 mousedown 被触发时,首先将工作包装器句柄。我们将其保存到像“this.target”这样的变量中。然后事件冒泡到文档并在文档句柄中我们可以将“e.target”与“this.target”相等。据此我们可以知道Parent中是否有这个目标。

关于reactjs - Dom 包含或比较 React 中的文档位置模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47865209/

相关文章:

javascript - Array.fill() 保留先前选择的月份日期

javascript - React - 请求取消页面更改

reactjs - 无法为 react 使用历史读取未定义的属性 'push'

javascript - 如何在不实际最小化浏览器窗口的情况下在全屏桌面 View 上显示 react.js 组件的 css 移动 View 分辨率?

javascript - 结果到达客户端时,Next JS 服务器端渲染如何工作?

javascript - 如何将 D3 圆与半圆对齐

javascript - Purge-css 正在删除所有 CSS 样式,而不仅仅是未使用的样式

reactjs - 为什么 ref ='string' 是 "legacy"?

javascript - 使用 React Router 进行按钮导航

javascript - react onClick 方法