React 中的可重用组件

Posted

技术标签:

【中文标题】React 中的可重用组件【英文标题】:Reusable Component in React 【发布时间】:2021-10-01 14:01:25 【问题描述】:

我想使用 Styled-Components 在我的 React 应用程序中创建一个可重用的组件。我的问题是我得到了错误

错误:元素类型无效:应为字符串(对于内置 组件)或类/函数(用于复合组件),但得到: 不明确的。您可能忘记从文件中导出组件 它是在中定义的,或者您可能混淆了默认导入和命名导入。

请检查下面的代码:

import styled from 'styled-components'
import React from 'react'

const CustomSpinner = styled.svg`
  animation: rotate 1s linear infinite;
  width: 50px;
  height: 30px;

  & .path 
    stroke: $(props) => props.theme.colors.black;
    stroke-linecap: round;
    animation: dash 1.5s ease-in-out infinite;
  

  @keyframes rotate 
    100% 
      transform: rotate(360deg);
    
  
  @keyframes dash 
    0% 
      stroke-dasharray: 1, 150;
      stroke-dashoffset: 0;
    
    50% 
      stroke-dasharray: 90, 150;
      stroke-dashoffset: -35;
    
    100% 
      stroke-dasharray: 90, 150;
      stroke-dashoffset: -124;
    
  
`

export const Spinner = ( className) => 
  return (
    <CustomSpinner viewBox="0 0 50 50" className=className>
      <circle className="path" cx="25" cy="25" r="20" fill="none" strokeWidth="4" />
    </CustomSpinner>
  )

【问题讨论】:

【参考方案1】:

只需要将export const Spinner = (...) =&gt;改为export default (...) =&gt;,如下所示:

export default ( className) => 
      return (
        <CustomSpinner viewBox="0 0 50 50" className=className>
          <circle className="path" cx="25" cy="25" r="20" fill="none" strokeWidth="4" />
        </CustomSpinner>
      )
    

但我建议改为这样导出,以便在导入组件时可以从代码编辑器中获得完全自动完成功能:

const Spinner = ( className) => 
      return (
        <CustomSpinner viewBox="0 0 50 50" className=className>
          <circle className="path" cx="25" cy="25" r="20" fill="none" strokeWidth="4" />
        </CustomSpinner>
      )
    

export default Spinner;

【讨论】:

【参考方案2】:

这与您如何导入此组件有关。

当你这样做时

export const Spinner = ( className) => 
  return (
    <CustomSpinner viewBox="0 0 50 50" className=className>
      <circle className="path" cx="25" cy="25" r="20" fill="none" strokeWidth="4" />
    </CustomSpinner>
  )

然后你需要像这样导入它

import Spinner from 'path/to/Spinner

你可能会像这样导入它

import Spinner from 'path/to/Spinner'

上面这行从spinner中导入了默认导出,但是你没有默认导出,所以需要改一下你的导入,或者把你的导出改成

export default ( className) => 
  return (
    <CustomSpinner viewBox="0 0 50 50" className=className>
      <circle className="path" cx="25" cy="25" r="20" fill="none" strokeWidth="4" />
    </CustomSpinner>
  )


改为

【讨论】:

另外,您可能只想使用 ...props 而不是将 className 作为道具,然后您可以传入样式和其他任何内容,而不必担心 codesandbox.io/s/heuristic-violet-skhp0?file=/src/App.js

以上是关于React 中的可重用组件的主要内容,如果未能解决你的问题,请参考以下文章

React 中的可重用文本字段

重用具有不同样式的 React 组件

无法在反应引导模式中使用我的可重用反应组件

react-flux 应用程序的可重用性/可扩展性问题

如何在 Gatsby 中为我的可重用组件返回特定图像?

Magnolia 中的可重用表单组件