首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >React ref.current为空

React ref.current为空
EN

Stack Overflow用户
提问于 2019-03-19 19:14:17
回答 4查看 84.9K关注 0票数 40

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

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

如果现在是下午3点的话。我们距离议程开始还有480分钟。这意味着显示当前时间的线应该在日历正文顶部的796,8像素(480 * 1,66)。

没有问题的计算,但在获得高度的议程机构。我正在考虑用React来获得高度,但我得到了一个错误:ref.current is null

以下是一些代码:

代码语言:javascript
运行
复制
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>
        );
    }
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-03-19 19:29:43

因此,裁判的问题是,它们不能保证在第一次渲染。您可以确定它们是在componentDidMount期间和之后设置的,因此您有两种前进的方法。

您可以使用回调样式ref并在此基础上设置状态。例如,您可以传入一个对像this.handleRef这样的函数的引用,而不是将您的参考作为支柱传递,它会在其中执行一些逻辑:

代码语言:javascript
运行
复制
  handleRef = r => {
    this.setState({ bodyHeight: r.clientHeight})
    this.calendarBodyRef.current = r;
  };

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

代码语言:javascript
运行
复制
  componentDidMount() {
    this.setState({ bodyHeight: this.calendarBodyRef.current.clientHeight });
  }

最终,您不能像这样立即读取ref的当前值,您必须在呈现之后检查它,然后从状态读取bodyHeight

票数 31
EN

Stack Overflow用户

发布于 2020-07-14 12:58:01

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

代码语言:javascript
运行
复制
<tbody ref={this.calendarBodyRef}>
...
calendarBodyRef = (e) => {
console.log(e)
}

您将获得DOM元素,因此不需要使用"current“。

票数 5
EN

Stack Overflow用户

发布于 2021-04-01 15:28:38

如果使用react-redux并将组件包装为connect函数,则需要传递第四个参数,即像这样的forwardRef。

代码语言:javascript
运行
复制
connect(mapStateToProps, mapDispatchToProps, null, {forwardRef: true})

我希望这会有所帮助。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55248483

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档