我发现this answer for tracking page size的代码段非常有用。我想将window.innerHeight
切换为$("#list_container").height
:
constructor(props) {
super(props);
this.state = { width: 0, height: 0 };
this.updateWindowDimensions = this.updateWindowDimensions.bind(this);
}
componentDidMount() {
this.updateWindowDimensions();
window.addEventListener('resize', this.updateWindowDimensions);
}
componentWillUnmount() {
window.removeEventListener('resize', this.updateWindowDimensions);
}
updateWindowDimensions() {
// !!! This works:
this.setState({ width: window.innerWidth, height: window.innerHeight });
// !!! This doesn't work:
this.setState({ width: $("#list_container").width(), height: $("#list_container").height() });
}
修改:已更新至.width()
和.height()
,已尝试过,但两者都不适合我。
列表容器在与外部div相同的模块中定义:
render() {
return (
<div id="list_container">
<ListGroup>
<VirtualList
width='100%'
height={this.state.height}
itemCount={this.state.networks.length}
itemSize={50}
renderItem={({index, style}) =>
<ListGroupItem
onClick={() => this.updateNetwork(this.state.networks[index].ssid, this.state.networks[index].security)}
action>
{this.state.networks[index].ssid}
</ListGroupItem>
}
/>
</ListGroup>
<Modal/>
// ...
注意:
如果我这样做:
<p>{this.state.height}</p>
0
不是空的,示例不起作用。
答案 0 :(得分:1)
如果您正在使用jQuery,width()
和height()
是功能,而不是属性。尝试:
this.setState({ width: $("#list_container").width(), height: $("#list_container").height() });
答案 1 :(得分:1)
要使用ref扩展Erics的答案,在没有jQuery的情况下将其拉出来,可以使用getBoundingClientRect:
const listRect = document.getElementById('list_container').getBoundingClientRect();
或者如果使用来自Erics的参考答案:
const listRect = this.componentName.getBoundingClientRect();
接着是
this.setState({
width: listRect.width,
height: listRect.height
});
我建议this page提供一些没有jQuery的生活中的好例子。
另外,我强烈建议去抖调整大小处理程序。
答案 2 :(得分:0)
你需要使用refs,因为在组件渲染到dom之前js可能正在运行。
render() {
return (
<div id="list_container" ref={ el => this.componentName = el }>
// ...
在此组件中引用此dom节点,您只需调用this.componentName
updateWindowDimensions = () => {
$(this.componentName).height() // returns height
}