如何相对于其父级定位React组件?

时间:2016-01-07 16:33:36

标签: javascript css dom reactjs

我有一个包含子React组件的父React组件。

<div>
  <div>Child</div>
</div>

我需要将样式应用于子组件以将其置于其父组件中,但其位置取决于父组件的大小。

render() {
  const styles = {
    position: 'absolute',
    top: top(),    // computed based on child and parent's height
    left: left()   // computed based on child and parent's width
  };
  return <div style={styles}>Child</div>;
}

我不能在这里使用百分比值,因为顶部和左侧位置是孩子和父母的宽度和高度的函数。

实现此目的的React方式是什么?

2 个答案:

答案 0 :(得分:17)

这个问题的答案是使用Refs to Components中描述的参考号。

底层问题是需要DOM节点(及其父DOM节点)来正确定位元素,但在第一次渲染之后它才可用。从上面链接的文章:

  

执行DOM测量几乎总是需要使用ref访问“本机”组件并访问其底层DOM节点。参考是可靠地实现这一目标的唯一实用方法之一。

以下是解决方案:

getInitialState() {
  return {
    styles: {
      top: 0,
      left: 0
    }
  };
},

componentDidMount() {
  this.setState({
    styles: {
      top: computeTopWith(this.refs.child),
      left: computeLeftWith(this.refs.child)
    }
  })
},

render() {
  return <div ref="child" style={this.state.styles}>Child</div>;
}

这将在第一次渲染后立即正确定位元素。如果您还需要在更改道具后重新定位元素,请在componentWillReceiveProps(nextProps)中进行状态更改。

答案 1 :(得分:-4)

正确的方法是使用CSS。如果将MessageBox应用于父元素,则可以使用position:relativetop相对于该父元素移动子元素。您甚至可以使用百分比,例如left,它使用父元素的高度。