反应 ref.current 为空

新手上路,请多包涵

我正在开发具有可变时间范围的议程/日历应用程序。要显示当前时间的线条并显示已进行约会的块,我需要计算在给定时间范围内与一分钟对应的像素数。

例如:如果议程从早上 7 点开始,到下午 5 点结束,则总范围为 10 小时。假设日历主体的高度为 1000 像素。这意味着每小时代表 100 像素,每分钟代表 1,66 像素。

如果当前时间是下午 3 点。距离议程开始还有 480 分钟。这意味着显示当前时间的线应位于距日历主体顶部 796,8 像素 (480 * 1,66) 处。

计算没有问题,但获得议程主体的高度。我正在考虑使用 React Ref 来获取高度,但出现错误: ref.current is null

下面是一些代码:

 class Calendar extends Component {
    calendarBodyRef = React.createRef();

    displayCurrentTimeLine = () => {
        const bodyHeight = this.calendarBodyRef.current.clientHeight; // current is null
    }

    render() {
        return (
            <table>
                <thead>{this.displayHeader()}</thead>
                <tbody ref={this.calendarBodyRef}>
                    {this.displayBody()}
                    {this.displayCurrentTimeLine()}
                </tbody>
            </table>
        );
    }
}

原文由 Thore 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
2 个回答

所以关于 refs 的事情是它们不能保证在第一次渲染时设置。您可以确定它们是在 componentDidMount 期间和之后设置的,因此您有两种前进方式。

您可以使用回调样式 ref 并基于此设置状态。例如,不是将您的 ref 作为道具传递,您可以传递对函数的引用,如 this.handleRef 它会在那里执行一些逻辑:

   handleRef = r => {
    this.setState({ bodyHeight: r.clientHeight})
    this.calendarBodyRef.current = r;
  };

或者,您可以保留当前设置,但您必须将 clientHeight 位移动到生命周期函数,例如:

   componentDidMount() {
    this.setState({ bodyHeight: this.calendarBodyRef.current.clientHeight });
  }

最终,您不能立即读取这样的 ref 的当前值,您必须在渲染后检查它,然后从 state 读取您的 bodyHeight

原文由 Tom Finney 发布,翻译遵循 CC BY-SA 4.0 许可协议

您可以使用 ref 回调函数。在这种情况下,您不需要使用“React-createRef()”。

 <tbody ref={this.calendarBodyRef}>
...
calendarBodyRef = (e) => {
console.log(e)
}

您将取回 DOM 元素,因此不需要使用“current”。

原文由 Lukas Magerusan 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进