如果您使用的是TypeScript,则会看到如下错误: Type '{ children: string; }' has no properties in common with type 'IntrinsicAttributes'.ts(2559) TypeScript不知道CustomTag是有效的HTML标记名,并引发一个无益的错误。 要修复,请将CustomTag转换为keyof JSX.IntrinsicElements!
// var name must start with a capital letter
const CustomTag = `h${this.props.level}` as keyof JSX.IntrinsicElements;
<CustomTag>Hello</CustomTag>
来自文档: 创建并返回给定类型的新React元素。type参数可以是标记名称字符串(如'div'或'span'),也可以是React组件类型(类或函数)。 使用JSX编写的代码将转换为使用React.createElement()。如果使用JSX,通常不会直接调用React.createElement()。有关详细信息,请参阅React Without JSX。
9条答案
按热度按时间w6mmgewl1#
没有办法就地完成,只需将其放在变量(with first letter capitalised)中:
6ioyuze22#
如果您使用的是TypeScript,则会看到如下错误:
Type '{ children: string; }' has no properties in common with type 'IntrinsicAttributes'.ts(2559)
TypeScript不知道
CustomTag
是有效的HTML标记名,并引发一个无益的错误。要修复,请将
CustomTag
转换为keyof JSX.IntrinsicElements
!wlwcrazw3#
为了完整起见,如果您想使用动态名称,也可以直接调用
React.createElement
而不使用JSX:这样就不必创建新的变量或组件。
带 prop :
来自文档:
创建并返回给定类型的新React元素。type参数可以是标记名称字符串(如
'div'
或'span'
),也可以是React组件类型(类或函数)。使用JSX编写的代码将转换为使用
React.createElement()
。如果使用JSX,通常不会直接调用React.createElement()
。有关详细信息,请参阅React Without JSX。ldxq2e6h4#
所有其他的答案都很好,但我想多加一些,因为这样做:
1.它更安全一些,即使你的类型检查失败了,你仍然返回一个正确的组件。
1.它更具声明性,任何人只要看到这个组件就能知道它返回的是什么。
1.它更灵活,例如,代替“h1”、“h2”,......对于标题的类型,您可以使用一些其他抽象概念“sm”、“lg”或“primary'、”secondary“
标题组件:
你可以把它当作
或者你可以有一个不同的抽象概念,例如,你可以定义一个大小 prop 如下:
你可以把它当作
ahy6op9u5#
在动态标题**(h1,h2...)**的示例中,组件可以如下返回
React.createElement
(上面提到的Felix)。对于可组合性,将传递props和child。
See Example
vh0rcniy6#
这是我如何为我的项目设置它。
TypographyType.ts
Typography.tsx
6mw9ycah7#
你可以给予这个。我是这样实现的。
m528fe3b8#
泛化robstarbuck's answer,您可以创建一个完全动态的标签组件,如下所示:
你可以这样使用:
avwztpqn9#