我尝试编写一个 React 组件。对于 html 标题标签(h1、h2、h3 等...),其中标题优先级根据我们在 props 中定义的优先级动态变化。
这是我尝试做的。
<h{this.props.priority}>Hello</h{this.props.priority}>
预期输出:
<h1>Hello</h1>
这是行不通的。有没有可能的方法来做到这一点?
我尝试编写一个 React 组件。对于 html 标题标签(h1、h2、h3 等...),其中标题优先级根据我们在 props 中定义的优先级动态变化。
这是我尝试做的。
<h{this.props.priority}>Hello</h{this.props.priority}>
预期输出:
<h1>Hello</h1>
这是行不通的。有没有可能的方法来做到这一点?
无法就地执行此操作,只需将其放入变量中(首字母大写):
const CustomTag = `h${this.props.priority}`;
<CustomTag>Hello</CustomTag>
如果你使用的是 TypeScript,你会看到这样的错误:
Type '{ children: string; }' has no properties in common with type 'IntrinsicAttributes'.ts(2559)
TypeScript 不知道这CustomTag
是一个有效的 HTML 标记名称并抛出一个无用的错误。
要修复,请强制转换CustomTag
为keyof JSX.IntrinsicElements
!
const CustomTag = `h${this.props.priority}` as keyof JSX.IntrinsicElements;
<CustomTag>Hello</CustomTag>
为了完整起见,如果要使用动态名称,也可以直接调用React.createElement
而不是使用 JSX:
React.createElement(`h${this.props.priority}`, null, 'Hello')
这避免了必须创建新变量或组件。
带props:
React.createElement(
`h${this.props.priority}`,
{
foo: 'bar',
},
'Hello'
)
从文档:
创建并返回给定类型的新 React 元素。type 参数可以是标签名称字符串(例如
'div'
或'span'
),也可以是 React 组件类型(类或函数)。使用 JSX 编写的代码将转换为使用
React.createElement()
.React.createElement()
如果您使用 JSX,您通常不会直接调用。请参阅不使用 JSX 的 React以了解更多信息。
所有其他答案都工作正常,但我会添加一些额外的内容,因为这样做:
标题组件:
import React from 'react';
const elements = {
h1: 'h1',
h2: 'h2',
h3: 'h3',
h4: 'h4',
h5: 'h5',
h6: 'h6',
};
function Heading({ type, children, ...props }) {
return React.createElement(
elements[type] || elements.h1,
props,
children
);
}
Heading.defaultProps = {
type: 'h1',
};
export default Heading;
你可以像这样使用它
<Heading type="h1">Some Heading</Heading>
或者你可以有一个不同的抽象概念,例如你可以定义一个大小props,如:
import React from 'react';
const elements = {
xl: 'h1',
lg: 'h2',
rg: 'h3',
sm: 'h4',
xs: 'h5',
xxs: 'h6',
};
function Heading({ size, children }) {
return React.createElement(
elements[size] || elements.rg,
props,
children
);
}
Heading.defaultProps = {
size: 'rg',
};
export default Heading;
你可以像这样使用它
<Heading size="sm">Some Heading</Heading>