在反应中将 ref 传递给样式化的组件

Posted

技术标签:

【中文标题】在反应中将 ref 传递给样式化的组件【英文标题】:Passing ref into styled components in react 【发布时间】:2021-12-21 15:34:08 【问题描述】:

我想在 react 中获取样式化组件的高度和宽度。我正在使用这个https://opensourcelibs.com/lib/use-resize-observer,我的代码看起来像:

const Test = (className, ref) => 
    return (
        <div className=className ref=ref/>
    )


const StyledTest = styled(Test)`
  height: 100px;
  width: 100px;
  background-color: greenyellow;
`


const TestClass = () => 
    const testRef = useRef(null)
    const testSize = useResizeObserver(ref: testRef);

    return (
        <React.Fragment>
            <ThemeProvider theme=testTheme>
                <h1>Height test: leftContainerSize.height</h1>
                <StyledTest ref=leftContainerRef/>
            </ThemeProvider>
        </React.Fragment>
    )

不幸的是,它不起作用。如果我尝试对图像做同样的事情,它会起作用,所以我认为将 ref 传递给样式化组件存在问题。我读了这篇文章Using 'ref' on React Styled Components is not working,但我不知道如何在我的情况下使用innerRef。我也尝试使用 forwardRef 但我也失败了。有人知道让它工作吗?

【问题讨论】:

【参考方案1】:

试试这个。

在功能组件中使用 forwardRef 来获取 ref。不要试图从 props 中获取 ref。

您的示例缺少变量:leftContainerRef、leftContainerSize。 尽管您正在尝试使用它们。

const Test = forwardRef(( className , ref) => 
    return (
        <div className=className ref=ref />
    )
)

const StyledTest = styled(Test)`
  height: 100px;
  width: 100px;
  background-color: greenyellow;
`


const TestClass = () => 
    const  ref, height  = useResizeObserver();

    return (
        <React.Fragment>
            <ThemeProvider theme=testTheme>
                <h1>Height test: height</h1>
                <StyledTest ref=ref />
            </ThemeProvider>
        </React.Fragment>
    )

如果你想使用 ref.您可以创建 ref 并将其传递给钩子。

const Test = forwardRef(( className , ref) => 
    return (
        <div className=className ref=ref />
    )
)

const StyledTest = styled(Test)`
  height: 100px;
  width: 100px;
  background-color: greenyellow;
`


const TestClass = () => 
    const ownRef = useRef(null)
    const  height  = useResizeObserver( ref: ownRef );

    return (
        <React.Fragment>
            <ThemeProvider theme=testTheme>
                <h1>Height test: height</h1>
                <StyledTest ref=ownRef />
            </ThemeProvider>
        </React.Fragment>
    )

【讨论】:

以上是关于在反应中将 ref 传递给样式化的组件的主要内容,如果未能解决你的问题,请参考以下文章

样式化的 MUI 无法在 typescript 中将组件道具传递给 Typography

如何在反应中将信息传递给嵌套组件?

如何在反应中将最新状态从子组件传递给父组件

如何在反应中将子组件的状态数组传递给父组件?

如何在Vuejs中将反应性道具传递给孩子

TypeScript:为样式化的组件元素扩展 React 组件道具