所以嘿伙计们,基本上我正在使用反应,我想得到父div的高度,并通过道具让它的孩子拥有相同的高度。每次调整窗口大小时,父div都会呈现。我尝试使用componentDidMount
和setState
来获取父级的高度,但仅在我的父div渲染时调用componentDidMount
。
我无法在ReactDOM.findDOMNode(this).clientHeight
函数中使用render()
。
为简化起见,这些步骤如下:
有什么想法吗?
这是一段代码:
import React, { Component } from 'react';
import Div2 from './Div2';
class Div1 extends Component {
constructor(props){
super(props);
this.state = {
height: 0
};
}
componentDidMount() {
var height = (ReactDOM.findDOMNode(this).clientHeight);
this.setState({height: height})
}
render() {
return(
<div className='Div1'>
<Div2 height={this.state.height}/>
</div>
);
}
}
export default Div1;
答案 0 :(得分:3)
您必须在3个地方更新父亲state
的新身高:
componentDidMount
将在第一个render
之后调用(第一次父母div
将实际出现)。componentDidUpdate
和render
更新引起的props
之后调用的state
。您只有在实际使用任何props
时才需要这样做,而且他们的更新可能会导致div
的身高变化。您必须使用refs
在div
方法中获取父render
个DOM元素。之后,您可以在componentDidMount
和componentDidUpdate
中使用它(请查看React Component Lifecycle文档)。
将所有内容组合在一起产生以下代码,其中Foo
将其根div高度传递给Bar
:
class Bar extends React.Component {
render() {
return (
<div className='bar' style={{height: `${this.props.height / 2 }px`}} />
);
};
};
class Foo extends React.Component {
constructor() {
super();
this.state = { height: 0 };
this.updateHeight = this.updateHeight.bind(this);
}
componentDidMount() {
this.updateHeight();
window.addEventListener("resize", this.updateHeight);
}
componentWillUnmount() {
window.removeEventListener("resize", this.updateHeight);
}
componentDidUpdate() {
this.updateHeight();
}
updateHeight() {
if (this.state.height != this.div.clientHeight)
this.setState({ height: this.div.clientHeight })
}
render() {
return (
<div ref={ div => { this.div = div; } } className='foo'>
<Bar height={this.state.height} />
</div>
);
}
}
ReactDOM.render(<Foo/>, document.getElementById('app'));
可以找到工作示例here。