当前位置: 首页 > 知识库问答 >
问题:

如何在TypeScript中使用带有React无状态功能组件的子级?

轩辕成天
2023-03-14

使用带有React的TypeScript,我们不再需要扩展React.Props,以便编译器知道所有React组件Props都可以有子级:

interface MyProps { }

class MyComponent extends React.Component<MyProps, {}> {
  public render(): JSX.Element {
    return <div>{this.props.children}</div>;
  }
}

然而,无状态功能组件似乎不是这样:

const MyStatelessComponent = (props: MyProps) => {
  return (
    <div>{props.children}</div>
  );
};

发出编译错误:

错误:(102,17)TS2339:类型“MyProps”上不存在属性“children”。

我想这是因为编译器真的无法知道在props参数中会给出子函数

所以问题是我们应该如何在TypeScript中的无状态函数组件中使用子级?

我可以回到以前的MyProps extends React.Props,但是Props接口被标记为已弃用,无状态组件没有或不支持我所理解的Props.ref

因此,我可以手动定义子类道具:

interface MyProps {
  children?: React.ReactNode;
}

第一:ReactNode是正确的类型吗?

第二:我必须将children写为可选(),否则消费者会认为children应该是组件的属性(

我好像错过了什么。有人能澄清一下我的最后一个示例是否是在React中使用带有子级的无状态功能组件的方法吗?


共有3个答案

井礼骞
2023-03-14

更简单的答案:使用ReactNode

interface MyProps {
  children?: React.ReactNode
}

是否子项是可选的(即是否具有)取决于您的组件。是表达这一点的最简洁的方式,因此没有什么错。

关于历史:当最初被问到时,这不一定是正确的答案:类型ReactNode仅在2017年3月通过这个拉式请求添加到(几乎)其当前形式中,但今天几乎所有阅读本文的人都应该使用足够现代的React版本。

最后,关于将子项作为“属性”传递(在React行话中,将其作为“prop”而不是属性传递):这是可能的,但在大多数情况下,当传递JSX子项时读起来更好:

<MyComponent>
  <p>This is part of the children.</p>
</MyComponent>

阅读比阅读容易

<MyComponent children={<p>This is part of the children.</p>} />
丁震博
2023-03-14

React 16.8更新:自React 16.8以来,名称React.SFCReact.StatelessComponent已弃用。实际上,它们已成为React.FunctionComponenttype或简称React.FC的别名。

不过,你会以同样的方式使用它们:

const MyStatelessComponent : React.FunctionComponent<MyProps> = props =>
    <div>
        <p>{props.propInMyProps}</p>
        <p>{props.children}</p>
    </div>

在React 16.8(旧)之前:

现在,您可以使用React.stateless组件

const MyStatelessComponent : React.StatelessComponent<{}> = props =>
    <div>{props.children}</div>

我在这里添加的是将组件的返回类型设置为React.StatelessComponenttype。

对于具有自定义道具(如MyPropsinterface)的组件:

const MyStatelessComponent : React.StatelessComponent<MyProps> = props =>
    <div>
        <p>{props.propInMyProps}</p>
        <p>{props.children}</p>
    </div>

现在,props已经获得了子属性以及来自MyProps接口的属性。

我在打印版本2.0.7中检查了这个

此外,为了简洁起见,您可以使用React.SFC而不是React.StatelessComponent

索寒
2023-03-14

您可以使用React.PropsWithChildren

interface MyProps { }

function MyComponent(props: React.PropsWithChildren<MyProps>) {
  return <div>{props.children}</div>;
}

 类似资料:
  • 问题内容: 结合使用TypeScript和React,我们不再需要扩展,以使编译器知道所有react组件prop都可以有子代: 但是,无状态功能组件似乎并非如此: 发出编译错误: 错误:(102、17)TS2339:类型“ MyProps”上不存在属性“子级”。 我猜这是因为编译器实际上没有办法知道在props参数中将提供香草函数。 所以问题是我们应该如何在TypeScript的无状态功能组件中使

  • 我创建了一个包含登录组件和注册组件的签名页面组件。我的问题是,我如何传递一个onhtml函数从父到子,以便更改我的父组件(签名页组件)的状态?我期望的是,通过单击子组件中的按钮,可以切换父组件的活动状态,并根据活动状态更改样式。我试图通过一个处理功能从父到子,但它不能很好地工作。 有什么解决办法吗? codesandbox中的详细信息:https://codesandbox.io/s/wizard

  • 问题内容: 我正在尝试将在这里找到的这个很棒的动画转换为React可重用的组件。看来此组件将需要一个父组件作为画布,而许多子组件则为。 出于性能方面的考虑,将它们变成无状态组件可能会更好,因为会有很多这样的组件。我不熟悉制作无状态组件,并且想知道应该在哪里定义和中定义的和函数。 无状态组件的功能是在组件内部还是外部?换句话说,以下哪个更好? 1: 2: 每种都有什么优点/缺点,其中哪一种对我的特定

  • 问题内容: 使用Typescript在Visual Studio中输入“ .ts”文件,请考虑以下声明: 这很好,类型检查很好,一切都很好。 现在,将完全相同的代码放入用于JSX和React的“ .tsx”文件中。 Intellisense感到非常沮丧和抱怨,因为它试图使 成为React JSX元素。但我的意图是让编译器将其视为通用类型指示符。 编译器抱怨: [gulp-typescript] 1

  • 有了钩子,功能性React组件不再是无状态组件。它可以有状态,所以为功能组件定义状态接口是有意义的。 虽然打字稿不会抛出任何错误/警告,但最好定义一下。 需要帮助做同样的事情。

  • 在不使用类的情况下,如何在react的功能性无状态组件中使用PropTypes?