A super lightweight modern alternative to react-slot-fill
with familiar API.
- Control sub-components rendering with
Slot
andFill
- Render content of sub-component in multiple places
- Speedy -
Fill
andSlot
communicate directly with each other - Tested with
testing-library
- Uses
nanoevents
under hood - Only 421 B (including deps)
npm i -S nano-slots
yarn add nano-slots
import { Box, Flex } from 'theme-ui'
import { SlotsProvider, Slot } from 'nano-slots'
export const MediaObject = ({ children }) => (
<SlotsProvider>
<Flex>
<Box mr={3}>
<Slot name="media-side" />
</Box>
<Box>
<Box mb={2}>
<Slot name="media-title" />
</Box>
<Box>
<Slot name="media-description" />
</Box>
{children}
</Box>
</Flex>
</SlotsProvider>
)
import { Fill } from 'nano-slots'
import { MediaObject } from './media-object'
const MyApp = () => (
<MediaObject>
<Fill name="media-side">
<img src='https://placekitten.com/200' alt="Kitten" />
</Fill>
<Fill name="media-title">
<h3>Mew</h3>
</Fill>
<Fill name="media-description">
<p>Purr purr purr</p>
</Fill>
</MediaObject>
)
import { SlotsProvider } from 'nano-slots'
children: ReactNode
— any valid react children element
Creates a context for Slot
/ Fill
components.
import { Slot } from 'nano-slots'
name: string
— unique slot name for currentSlotsProvider
children?: ReactNode
— fallback in caseFill
with matchingname
not provided, optional
Define the target slot for Fill
component, can be used multiple times with the same name inside each SlotsProvider
import { Fill } from 'nano-slots'
name: string
— unique slot name for currentSlotsProvider
children: ReactNode
— will be rendered inside matchingSlot
Render children into matching Slot
of current SlotsProvider
.
export interface SlotsProviderProps {
children: React.ReactNode;
}
export function SlotsProvider(props: SlotsProviderProps): JSX.Element;
export interface SlotProps {
name: string;
children?: React.ReactNode;
}
export function Slot(props: SlotProps): JSX.Element;
export interface FillProps {
name: string;
children?: React.ReactNode;
}
export function Fill(props: FillProps): null;
react-slot-fill
- abandoned project that inspired this onereact-view-slot
- more modern approach, but 12x times bigger
MIT © John Grishin