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

如何在类型脚本中使用具有 React 无状态函数组件的子项

吉俊德
2023-03-14

使用类型脚本和 React,我们不再需要扩展 React.Props,以便编译器知道所有反应组件 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”类型上不存在。

我想这是因为编译器确实无法知道一个普通函数将在props参数中被赋予children

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

我可以回到MyProps extends React的老方法。Props,但Props接口被标记为不推荐使用,并且无状态组件没有或不支持Props。根据我的理解,请参阅

所以我可以手动定义儿童prop:

interface MyProps {
  children?: React.ReactNode;
}

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

第二:我必须把孩子写成可选的(),否则消费者会认为孩子应该是组件的一个属性(

我好像错过了什么。谁能澄清一下我的上一个例子是否是在React中使用无状态功能组件的方法?


共有3个答案

包唯
2023-03-14

更简单的答案:使用ReactNode

js prettyprint-override">interface MyProps {
  children?: React.ReactNode
}

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

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

最后,关于将孩子作为“属性”传递(在 React 术语中,它将作为“道具”传递,而不是属性):这是可能的,但在大多数情况下,当传递 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.FunctionComponent类型或React.FC的别名。

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

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

React 16.8(旧版本)之前:

现在,您可以使用 React.无状态组件

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

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

对于具有自定义属性的组件(如< code>MyProps接口):

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

现在,props已经获得了childrenprops属性,以及来自

我在2.0.7版打字稿中检查过这个

此外,您可以使用< code>React。SFC而不是< code>React。StatelessComponent。

欧阳玺
2023-03-14

您可以使用< code>React。有孩子的建议

interface MyProps { }

function MyComponent(props: React.PropsWithChildren<MyProps>) {
  return <div>{props.children}</div>;
}
 类似资料:
  • 我见过多个使用Typescript的React组件示例: +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++组件 当我们不使用道具或国家时,似乎没有一个明确的惯例。 人们将这些类型设置为,,,, ,等等。这是我到目前为止看到的:

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

  • 使用带有React的TypeScript,我们不再需要扩展,以便编译器知道所有React组件Props都可以有子级: 然而,无状态功能组件似乎不是这样: 发出编译错误: 错误:(102,17)TS2339:类型“MyProps”上不存在属性“children”。 我想这是因为编译器真的无法知道在props参数中会给出

  • 在我的React JS项目中,我正在处理。我已经通过了使用进行私有路由和身份验证的示例。 https://reacttraining.com/react-router/web/example/auth-workflow 根据这个留档,他们创建了一个作为无状态组件。 但我的要求是将其转换为有状态的React组件,因为我想将我的组件连接到redux存储。 这是我的代码。 无状态组件 我将这个组件转换成

  • 我需要使用父组件中子组件内部的状态值。 组成部分: 这是父组件:

  • 我的Navbar组件有2个子组件。每个组件都有自己的状态。在其组成部分内工作正常的国家。如何更新这两个状态从假到真的同时,当两个功能onclick将被执行? 主组件导航栏 列表菜单组件 汉堡包成分