当前位置: 首页 > 面试题库 >

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

齐献
2023-03-14
问题内容

结合使用TypeScript和React,我们不再需要扩展React.Props,以使编译器知道所有react组件prop都可以有子代:

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据我所知,无状态组件不具有或不支持。

所以我可以children手动定义道具:

interface MyProps {
  children?: React.ReactNode;
}

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

第二:我必须将子级写为可选(?),否则消费者会认为这children应该是组件()的 属性<MyStatelessComponent children={} />如果未提供值,则会引发错误。

好像我缺少什么。谁能说清楚我的最后一个示例是否是在React中使用带有子元素的无状态功能组件的方法?


问题答案:

React 16.8更新: 从React
16.8开始,名称React.SFCReact.StatelessComponent被弃用。实际上,它们已成为React.FunctionComponent类型或React.FC简称的别名。

但是,您将以相同的方式使用它们:

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

在React 16.8(较旧)之前:

现在,您可以使用以下React.StatelessComponent<>类型:

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

我在此处添加的内容是将组件的返回类型设置为React.StatelessComponenttype。

对于具有自己的自定义道具(例如MyProps界面)的组件:

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

现在,props已经有了children属性以及来自MyProps接口的属性。

我在打字稿版本2.0.7中检查了这一点

此外,为了简洁起见,您可以使用React.SFC代替React.StatelessComponent



 类似资料:
  • 问题内容: 结合使用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?