【问题标题】:React track height of div in state?反应状态下div的轨道高度?
【发布时间】:2018-08-02 13:54:27
【问题描述】:

我发现this answer for tracking page size 的代码 sn-p 很有用。我想把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 只是空的,示例不起作用。

【问题讨论】:

  • $("#list_container") 是否返回正确的元素?
  • @ChaseDeAnda 抱歉,我不确定如何检查。我添加了一个 sn-p 来显示我定义它的位置。我该如何检查?
  • 在您的 updateWindowDimensions 方法中,您可以执行 console.log($("#list_container"))
  • 或者只是打开您的开发工具并将 $("#list_container") 粘贴到控制台中。它应该返回您尝试测量的元素。
  • @ChaseDeAnda 它找到了对象,但它没有 .height().height 的属性

标签: reactjs


【解决方案1】:

如果您使用的是 jQuery,width()height() 是函数,而不是属性。试试:

this.setState({ width: $("#list_container").width(), height: $("#list_container").height() });

【讨论】:

  • 谢谢,试过了也没用,要更新我的问题。
【解决方案2】:

你需要使用 refs,因为 js 可能在组件渲染到 dom 之前运行。

React documentation on refs

render() {
  return (
    <div id="list_container" ref={ el => this.componentName = el }>
      // ...

要在这个组件中引用这个 dom 节点,你只需要调用 this.componentName

updateWindowDimensions = () => {
  $(this.componentName).height()  // returns height
}

【讨论】:

  • componentDidMount 中,所有的DOM 节点都应该已经挂载到屏幕上了(see docs)。我同意你的观点,refs 是打破 React 抽象的推荐方式。
  • 谢谢,但它为我返回 0
  • 是的,这不是最好的例子……updateWindowDimensions
  • 等等,让我试试componentDidMount()没有的其他东西
  • 你的列表容器有高度吗?如果它的孩子是绝对定位的,它可能会显示 0,在这种情况下,你必须寻找一个 clearfix 解决方案来获得正确的高度
【解决方案3】:

要使用 refs 扩展 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 的生活的好例子。

另外,我强烈建议取消调整大小处理程序。

【讨论】:

  • 抱歉,不知道该放在哪里。尝试componentDidMount(),但它似乎保持为 0。
  • @PhilipKirkbride,很难说没有看到您的完整代码,但这似乎表明列表容器内容尚未呈现。这是一个单独的组件还是回调?
  • 我在这个问题上加了一点。我想我需要使用它,但像你说的那样在渲染后运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-08
  • 1970-01-01
  • 2019-04-18
相关资源
最近更新 更多