无法呈现作为道具传递的 React 元素

Having trouble rendering a React element passed as a prop

我有以下组件:

const Chip = (props) => {
  const ChipIcon = props.icon;
  let deleteButton = null;

  if (!props.readOnly) {
    deleteButton = <Delete
      style={styles.deleteButton}
      onTouchTap={props.onRemove}
    />
  }

  return <div className="Chip" style={styles.tag}>
    <ChipIcon />
    {' ' + props.label + ' '}
    {deleteButton}
  </div>
};

props.icon 绝对是 Material UI SvgIcon,但我在尝试此操作时收到警告。

arning: React.createElement: type should not be null, undefined, boolean, or number. It should be a string (for DOM elements) or a ReactClass (for composite components). Check the render method of Chip.

但这似乎有效:

const Chip = (props) => {
  const chipIcon = props.icon;
  let deleteButton = null;

  if (!props.readOnly) {
    deleteButton = <Delete
      style={styles.deleteButton}
      onTouchTap={props.onRemove}
    />
  }

  return <div className="Chip" style={styles.tag}>
    {chipIcon}
    {' ' + props.label + ' '}
    {deleteButton}
  </div>
};

如果第一个确实是 React 元素,为什么它不起作用?

您的 icon 属性 已经是元素,而不是您用来呈现元素的 class。

在 JSX 中 <ChipIcon /> 将被转换为 React.createElement(ChipIcon, null)。您的 icon 属性 是 已经 创建的元素,而不是您传递给 React 为您创建元素的 class。

如果 ChipIcon 是一个 React 组件,你的第一个例子就会起作用。您的第二个示例有效,因为 chipIcon 是 React 元素 ,即已经呈现的组件。

您可以通过以下方式使用 jsx 语法实例化组件:<MyComponent /> 如果 MyComponent 是 React 组件。如果 MyComponent 已经是一个渲染组件,您可以使用语法 { MyComponent } 注入它,因为它已经是一个有效元素。但是使用渲染的 element 作为组件没有多大意义 class :<MyComponent /> 实际上是 React.createElement(MyComponent, null).