You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React中直接传SelectItem与组件包裹传的差异及报错原因

为什么封装SelectItem后传给NextSelect会报错?

我使用NextUI的Select组件(问题核心与NextUI无关),该组件要求子元素为NextUI的SelectItem组件。

可行写法

export const Select: FC<SelectProps> = ({
  isInvalid = false,
  variant = "flat",
  children,
  ...rest
}) => {
  return (
    <NextSelect variant={variant} isInvalid={isInvalid} {...rest}>
      <SelectItem key="1">Select item</SelectItem>
    </NextSelect>
  );
};

这个写法可行,因为直接将SelectItem组件作为NextSelect的子元素传入。

报错写法

export const AnotherComponent = () => {
  return <SelectItem key="1">Select item</SelectItem>;
};

export const Select: FC<SelectProps> = ({
  isInvalid = false,
  variant = "flat",
  children,
  ...rest
}) => {
  return (
    <NextSelect variant={variant} isInvalid={isInvalid} {...rest}>
      <AnotherComponent/>
    </NextSelect>
  );
};

此时会抛出错误:TypeError: type.getCollectionNode is not a function

差异原因

  • NextUI的Select组件内部会直接遍历子元素,检查每个子节点是否为它提供的SelectItem组件,并且会调用SelectItem上的内部方法(比如getCollectionNode)来处理选项逻辑。
  • 第二种写法里,SelectItem被包裹在了自定义组件AnotherComponent中,此时NextSelect拿到的子元素是这个自定义组件,而非直接的SelectItem实例。自定义组件本身没有getCollectionNode这个内部方法,所以触发了报错。
  • 本质就是:NextSelect需要直接获取到SelectItem的实例,无法穿透自定义组件去识别内部的SelectItem。

内容的提问来源于stack exchange,提问作者sir-haver

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 15:40:12