javascript - 如何在不向其父/子添加逻辑的情况下获取组件中子元素的 dom 节点?

标签 javascript reactjs

在下面的例子中WrapperComp需要访问 divs 的 dom 节点在第 5 行和第 8 行中,没有向 PageComp 添加逻辑或 ItemComp .我唯一可以改变的东西 PageComp是 div 标签。例如。我可以添加 ref , prop , data-attribute等给他们。

divs不必在 PageComp 中创建. WrapperComp也将被允许创建它们,但它们必须包装其每个子项(在本例中为每个 ItemComp )。

示例

class PageComp extends React.Component {
  render() {
    return (
    <WrapperComp>
      <div>
        <ItemComp/>
      </div>
      <div>
        <ItemComp/>
      </div>
    </WrapperComp>
    );
  }
}

class WrapperComp extends React.Component {
  render() {
    return (
      <div>
        <h1>A wrapper</h1>
        {this.props.children}
      </div>
    );
  }
}

class ItemComp extends React.Component {
  render() {
    return (
      <div>
        <h1>An item</h1>
      </div>
    );
  }
}

ReactDOM.render(
  <PageComp/>,
  document.getElementById('app')
);

JSBIN

到目前为止我尝试了什么:

  • 我已经试过放一个ref=divs 上,但是ref仅在 PageComp 中可用不在 WrapperComp .
  • 我还尝试创建 divs里面WrapperComp并放一个 ref=从那里开始,但这将导致 Refs Must Have Owner Warning

现在我想知道..解决该问题的适当 react 方式是什么?

到目前为止,我想到的唯一解决方案是放置一个 data-attribute在每个 div并在 componentDidMount 之后搜索它们的 dom像那样:document.querySelectorAll('[data-xxx]') .也许我不确定这是否是您的 react 方式..

为什么要获取WrapperComp里面的节点?

我想创建一个组件来调整其子组件的尺寸。在示例中,该组件将是 WrapperComp .调整只能在 child 渲染到 dom 之后进行,例如得到clientHeight .

最佳答案

如果您不限制这需要通过应该如何获取 DOM、传递它们等方式来解决,我会摆脱这个难题并从不同的方向来解决它。

因为您没有太多控制权 <PageComp><WrapperComp>看起来很灵活,我稍后会通过将传递的子项转换为您需要的内容来进行包装。

class PageComp extends React.Component {
  render() {
    return (
      <WrapperComp>
        <ItemComp/>
        <ItemComp/>
      </WrapperComp>
    );
  }
}

class WrapperComp extends React.Component {
  render() {
    const wrappedChldren = React.Children.map(this.props.children, function(child) {
      return (
        <div ref={function(div) {
            this.setState{clientHeight: div.clientHeight}
        }}>
          <h1>A wrapper</h1>
          { child }
        </div>
      ); 
    });
    return <div>{ wrappedChildren }</div>;
  }
}

有了这个浓缩液就可以在<WrapperComp>上进行改造了,顾名思义,它非常直观。

关于javascript - 如何在不向其父/子添加逻辑的情况下获取组件中子元素的 dom 节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38550007/

相关文章:

Javascript 数组

javascript - 有没有更好的方法可以测量从 Ajax 调用返回数据所需的总时间?

javascript - Bootstrap Javascript 无法在实时网站上运行

javascript - 带有 ID 列表的 Prisma deleteMany

javascript - React + TypeScript : 'React' refers to a UMD global but the current file is a module. 考虑改为添加导入。 (理由)

javascript - React js钩子(Hook)useEffect无限循环

reactjs - google的OAuth clientID可以直接放在代码中吗?

javascript - 仅 HTML/Javascript 3 个范围 slider ,总和为 100,2 个独立的数学交互

javascript - 异步触发 shouldComponentUpdate?

reactjs - 如果列表未超出页面,则在底部渲染 FlatList 页脚