开发者问题收集

React.forwardRef 中的 ref 为 null

2019-12-29
11074

我在 React 中组件之间传递 refs 时遇到了困难。我决定使用 React.forwardRef,但遇到了一个问题。这是我的代码

const Wrapper = React.forwardRef((props, ref) => {
  return (
    <StyledWrapper ref={ref} >
      {console.log(ref.current)}
      <ParallaxProvider scrollContainer={ref.current}>
        <TransitionProvider value={ref.current}>{children}</TransitionProvider>
      </ParallaxProvider>
    </StyledWrapper>
  );
});

export default class MainTemplate extends React.Component {
  constructor(props) {
    super(props);
    this.scrollContainer = React.createRef();
  }


  render() {
    const { toggled, overflow } = this.state;
    const { uri, children } = this.props;
    return (
      <>
        <SEO />
        <GlobalStyle />
        <ThemeProvider theme={GlobalTheme}>
          <>
            <Hamburger handleToggle={this.handleToggle} />
            <Perspective active={toggled}>
              <Navigation pathname={uri} handleToggle={this.handleToggle} />
              <Wrapper
                ref={this.scrollContainer}
              >
                {children}
              </Wrapper>
            </Perspective>
          </>
        </ThemeProvider>
      </>
    );
  }
}

我需要将 ref.current 传递给 and,但问题是 ref.current 始终为空。有人能解释一下这种行为吗?我该如何让它工作?

1个回答

在 React 中,ref 总是在 第一次渲染之后 分配。在第一次渲染之前尝试访问将给出一个空对象。

解决这个问题的一种方法是使用条件渲染

const Wrapper = React.forwardRef((props, ref) => {
    return (
        <StyledWrapper ref={ref} >
            {ref.current && 
                <ParallaxProvider scrollContainer={ref.current}>
                    <TransitionProvider value={ref.current}>{children}</TransitionProvider>
                </ParallaxProvider>
            }
        </StyledWrapper>
    );
});

此外,如果您编写了 ParallaxProviderTransitionProvider 组件,您可以修改它们,以便在它们不为空时分别仅使用 scrollContainervalue ...

值得指出的是,React 不会在 ref 更改时重新渲染,但由于这是作为 prop 传递给 Wrapper 的,prop 的更改将导致重新渲染,您应该能够获取 ref.current

Kwame Opare Asiedu
2019-12-29