使用带有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中使用带有子级的无状态功能组件的方法吗?
更简单的答案:使用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>} />
React 16.8更新:自React 16.8以来,名称React.SFC
和React.StatelessComponent
已弃用。实际上,它们已成为React.FunctionComponent
type或简称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.StatelessComponent
type。
对于具有自定义道具(如
MyProps
interface)的组件:
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
。
您可以使用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?