实用程序

插槽

将它的 props 合并到它的直接子元素上。

特征

    可用于支持您自己的 `asChild` prop。

安装

从命令行安装组件。

npm install @radix-ui/react-slot

解剖

导入组件。

import { Slot } from '@radix-ui/react-slot';
export default () => (
<Slot>
<div>Hello</div>
</Slot>
);

基本示例

用于创建您自己的 asChild API。

当您的组件只有一个子元素时

// your-button.jsx
import React from 'react';
import { Slot } from '@radix-ui/react-slot';
function Button({ asChild, ...props }) {
const Comp = asChild ? Slot : 'button';
return <Comp {...props} />;
}

使用当您的组件有多个子元素时,将 props 传递给正确的元素

// your-button.jsx
import React from 'react';
import { Slot, Slottable } from '@radix-ui/react-slot';
function Button({ asChild, children, leftElement, rightElement, ...props }) {
const Comp = asChild ? Slot : 'button';
return (
<Comp {...props}>
{leftElement}
<Slottable>{children}</Slottable>
{rightElement}
</Comp>
);
}

用法

import { Button } from './your-button';
export default () => (
<Button asChild>
<a href="/contact">Contact</a>
</Button>
);

事件处理程序

任何以 on 开头的 prop(例如,onClick)都被视为事件处理程序。

合并事件处理程序时,Slot 将创建一个新的函数,其中子处理程序优先于插槽处理程序。

如果事件处理程序之一依赖于 event.defaultPrevented,请确保顺序正确。

import { Slot } from '@radix-ui/react-slot';
export default () => (
<Slot onClick={(event) => { if (!event.defaultPrevented) console.log('Not logged because default is prevented.'); }} >
<button onClick={(event) => event.preventDefault()} />
</Slot>
);
上一个传送门
下一个视觉隐藏