Background

在Reaction中,您可以为组件构造函数使用变量,如下面的代码中的ComponentToRender.

import { Badger, Mushroom } from './components';

const renderBadger = true;

const Snake = () => {
    const ComponentToRender = renderBadger ? Badger : Mushroom;
    return <ComponentToRender />;
};

在这里,我有一个条件(renderBadger),我根据该条件 Select ComponentToRender的类型.然后,我使用JSX构造适当组件(BadgerMushroom)的实例.

Question

如果我想在Badger和普通的基本HTMLbutton之间进行 Select ,我应该怎么做?即在下面的空白处填入普通按钮的组件名称.

const ComponentToRender = renderBadger ? Badger : ________;

Temporary Workaround

我知道我可以使用React.createElement(见下文)来实现这一点,但如果可能的话,我更愿意了解如何使用JSX来实现这一点.

const elementName = renderBadger ? Badger : 'button';

return React.createElement(elementName);

Alternative Solution

我还意识到我可以创建一个无操作包装器<button>组件,如下所示:

const Button = (
    props: React.PropsWithChildren<
        React.ButtonHTMLAttributes<HTMLButtonElement>
    >,
) => {
    const { children, ...rest } = props;
    return (
        <button {...rest} type='button'>
            {children}
        </button>
    );
};

但我真的不想介绍一堆毫无意义的包装器.

推荐答案

感谢@AndyRay的 comments .您仍然可以在JSX构造函数中使用字符串版本,它将工作得很好.

const ComponentToRender = renderBadger ? Badger : 'button';

有关哪里出错的更多信息,请查看here.

Typescript相关问答推荐

判断对象A中存在的对象B的键是否存在对象A中键的另一个数组值中

如何使用Generics保留构造函数的类型信息?

有没有办法适当缩小类型?

如何为ViewContainerRef加载的Angular组件实现CanDeactivate保护?

有没有可能使用redux工具包的中间件同时监听状态的变化和操作

如何正确地对类型脚本泛型进行限制

输入元素是类型变体的对象数组的正确方法是什么?'

对于合并对象中的可选属性(例如选项),类型推断可能是错误的

TypeScrip:逐个 case Select 退出noUncheck kedIndexedAccess

Angular NgModel不更新Typescript

嵌套对象的类型

对于始终仅在不是对象属性时才抛出的函数,返回Never

保护函数调用,以便深度嵌套的对象具有必须与同级属性函数cargument的类型匹配的键

在React中定义props 的不同方式.FunctionalComponent

为什么发送空字段?

为什么特定的字符串不符合包括该字符串的枚举?

使用或属性编写无限嵌套的接口

任何导航器都未处理有效负载为";params";:{";roomId";:";...";}}的导航操作

有没有什么方法可以使用ProvideState()提供多个削减器作为根减减器

我可以使用对象属性的名称作为对象中的字符串值吗?