反应 props.children 宽度

me-*_*-me 7 reactjs

有没有办法获得 React 组件子项的宽度。我有一个包装器组件,因为缺少名称 Container 并且我从 Component1 向它添加了 div 类型的子项。见下面的例子。我想知道是否有办法在挂载时获取 Container 中每个 div 子项的宽度。

更新说明: 我尝试获取容器子项宽度的原因是我可以根据子项总数动态设置容器宽度。通过将容器宽度设置为儿童宽度的数量,然后我可以允许一些我想做的水平滚动效果。

组件 1

export default class Component1 extends Component{
render(){
  return(
    <Container>
        <div className="large-box"/>
        <div className="large-box-dark"/>
    </Container>
  )
 }
}
Run Code Online (Sandbox Code Playgroud)

现在我的容器组件。

    export default class Container extends Component{
      componentDidMount(){
        this.props.children.forEach(( el ) => {
        // get each child's width 
        console.log("el  =", el);
      });
      }


  render() {
    return (
      <div className="scroller" ref={(scroller) => { this.scroller = scroller }}>
        {this.props.children}
      </div>
    )
  }
 }
Run Code Online (Sandbox Code Playgroud)

Fyr*_*yre 7

您可以使用refs。尽管除非没有其他办法,否则您应该避免接触 DOM。但我们开始了。

给你的子组件一个 ref ,它是 React 提供的逃生舱口来访问 DOM(在使用其他方法之前警告)。

子组件

class ChildComp extends Component {
  getWidth = () => {
     //Access the node here and get the width
     return this.childNode.offsetWidth(); //or clientWidth();
  } 
  render() {
     return (
       <div ref={(r) => {this.childNode = r}}>
       </div>
     );
  }
}
Run Code Online (Sandbox Code Playgroud)

父组件:

class ParentComp extends Component {
  componentDidMount() {
     //Access the child component function from here
     this.childComponent.getWidth();
  }
  render() {
     return (
       <ChildComp 
          ref={(r) => {this.childComponent = r}} />
     );
  }
}
Run Code Online (Sandbox Code Playgroud)

但请记住,当无法以声明方式完成任务时,请使用上述方法。

  • 不接触 DOM 的原因是 DOM 操作是昂贵的,如果你滥用它,你的性能会受到很大的影响,所以你应该让 React 以最佳方式处理 DOM 操作。获取宽度是没有其他方法的情况(除非您使用固定宽度,您可以将其存储在 JS 配置中的某个位置)。您能否让我知道为什么这是一个过度劳累的解决方案。如果我们需要 DOM 的动态属性(例如宽度或高度)中的某些内容,我们需要获取 DOM 节点,而 React 的方法是使用 refs。如果存在其他方式,请告诉我。 (2认同)

Ste*_*per 0

我想说,从技术上来说,这似乎是不可能的。JSX

<div className="large-box"/>
Run Code Online (Sandbox Code Playgroud)

不是指 DOM 元素(渲染后就有宽度),而是指 React 元素,它是一个内存中的对象,描述如何创建DOM 元素。由于 React 元素没有渲染,甚至没有连接到浏览器中的实际 DOM,因此它无法知道宽度。

请记住,React 可以在服务器上呈现 - 服务器无法知道不同计算机上的浏览器将显示什么。

我也同意佩德罗·纳西门托 (Pedro Nascimento) 指出的观点——这个解决方案可能最好通过其他方式解决,但如果没有上下文,就很难提供帮助。