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>
);
});
此外,如果您编写了
ParallaxProvider
和
TransitionProvider
组件,您可以修改它们,以便在它们不为空时分别仅使用
scrollContainer
和
value
...
值得指出的是,React 不会在 ref 更改时重新渲染,但由于这是作为 prop 传递给
Wrapper
的,prop 的更改将导致重新渲染,您应该能够获取
ref.current
。
Kwame Opare Asiedu
2019-12-29