【发布时间】:2022-01-22 00:02:49
【问题描述】:
我有一个下拉组件。这将有 2 个道具。
- 触发器(将触发下拉菜单)
- list(下拉列表内容)
这是我的组件:
import { useLayer } from "react-laag";
import { ReactElement, useState } from "react";
import classNames from 'classnames';
interface Props {
trigger?: string | ReactElement
children?: ReactElement | Array<ReactElement>
className?: string
}
const Dropdown = ({ trigger, children, className }: Props) => {
const [isOpen, setOpen] = useState(false);
// helper function to close the menu
function close() {
setOpen(false);
}
const { renderLayer, triggerProps, layerProps } = useLayer({
isOpen,
onOutsideClick: close, // close the menu when the user clicks outside
onDisappear: close, // close the menu when the menu gets scrolled out of sight
overflowContainer: true, // keep the menu positioned inside the container
auto: true, // automatically find the best placement
placement: "bottom-end", // we prefer to place the menu "top-end"
triggerOffset: 12, // keep some distance to the trigger
containerOffset: 16, // give the menu some room to breath relative to the container
arrowOffset: 16 // let the arrow have some room to breath also
});
// Again, we're using framer-motion for the transition effect
return (
<div className='dropdown' >
<button className='dropdown-trigger' {...triggerProps} onClick={() => setOpen(!isOpen)}>
{* I want to render trigger here *}
</button>
{isOpen &&
renderLayer(
<div className={classNames(['dropdown-list', className])} {...layerProps}>
{* I want to render list here *}
</div>
)}
</div>
);
}
export default Dropdown
这里我使用react-lagg 作为下拉菜单。
我想这样使用这个组件:
<Dropdown>
<Dropdown.Trigger>
<div>Some JSX content here</div>
</Dropdown.Trigger>
<Dropdown.List>
<div>Some JSX content here</div>
</Dropdown.List>
</Dropdown>
如何在 react 上实现这种模式?
【问题讨论】:
标签: javascript reactjs typescript