实用程序

多态

创建强类型多态组件。

此包已被弃用,取而代之的是 asChild 属性。了解有关如何 更改此处渲染的元素

特点

    基于 `as` 属性的类型化属性

    基于 `as` 属性的类型化属性

    基于 `as` 属性的类型化事件

安装

从命令行安装组件。

npm install @radix-ui/react-polymorphic

导入

导入组件。

import type * as Polymorphic from '@radix-ui/react-polymorphic';

基本示例

制作一个多态 Box 组件。

import React from 'react';
import type * as Polymorphic from '@radix-ui/react-polymorphic';
type PolymorphicBox = Polymorphic.ForwardRefComponent<'div', {}>;
const Box = React.forwardRef(({ as: Comp = 'div', ...props }, forwardedRef) => (
<Comp {...props} ref={forwardedRef} />
)) as PolymorphicBox;
export default () => (
<Box>
<Box as="h1">This is a h1</Box>
<Box as="button">This is a button</Box>
</Box>
);

API 参考

ForwardRefComponent

将多态 as 属性类型添加到 forwardRef 组件。

Polymorphic.ForwardRefComponent<
keyof JSX.IntrinsicElements,
OwnProps
>

OwnProps 不应包含 DOM 属性。这些将为您添加。使用 Polymorphic.OwnProps 实用程序从现有的多态组件中提取这些属性。

用法

Polymorphic.ForwardRefComponent<
'button',
{ variant: 'solid' | 'outline' }
>

OwnProps

从多态组件中提取属性,不包括其 DOM 属性。

Polymorphic.OwnProps<
Polymorphic.ForwardRefComponent
>;

用法

Polymorphic.OwnProps<typeof Button>;
// { variant: 'solid' | 'outline' }

IntrinsicElement

从多态组件中提取 JSX.IntrinsicElements 键。

Polymorphic.IntrinsicElement<
Polymorphic.ForwardRefComponent
>;

用法

Polymorphic.IntrinsicElement<typeof Button>;
// 'button'

例子

扩展多态组件

通过将上述实用程序组合在一起,在将多态组件包装在您自己的自定义组件中时保持多态性。

import React from 'react';
import * as Dialog from '@radix-ui/react-dialog';
import type * as Polymorphic from '@radix-ui/react-polymorphic';
type PolymorphicDialogContent = Polymorphic.ForwardRefComponent<
Polymorphic.IntrinsicElement<typeof Dialog.Content>,
Polymorphic.OwnProps<typeof Dialog.Content> & {
size?: 'small' | 'large';
}
>;
const DialogContent = React.forwardRef(
({ size = 'small', ...props }, forwardedRef) => (
<Dialog.Content {...props} className={size} ref={forwardedRef} />
)
) as PolymorphicDialogContent;
export default () => (
<Dialog.Root>
<Dialog.Trigger>Open</Dialog.Trigger>
<Dialog.Overlay />
<DialogContent as="article">
<p>This is an article</p>
</DialogContent>
</Dialog.Root>
);
上一个ID 提供者
下一个传送门