nano-slots
v1.4.0
Published
A super lightweight modern alternative to [`react-slot-fill`](https://github.com/camwest/react-slot-fill) with familiar API.
Downloads
13,752
Maintainers
Readme
nano-slots
A super lightweight modern alternative to react-slot-fill
with familiar API.
- [x] Control sub-components rendering with
Slot
andFill
- [x] Render content of sub-component in multiple places
- [x] Speedy -
Fill
andSlot
communicate directly with each other - [x] Tested with
testing-library
- [x] Written in TypeScript
- [x] Zero dependencies
- [x] Only ~431 B
📦 Install
npm i -S nano-slots
yarn add nano-slots
💻 Usage
Create a component and define 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>
)
Render elements directly inside each slot
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>
)
📖 API
SlotsProvider
import { SlotsProvider } from 'nano-slots'
Props
children: ReactNode
— any valid react children element
Description
Creates a context for Slot
/ Fill
components.
Slot
import { Slot } from 'nano-slots'
Props
name: string
— unique slot name for currentSlotsProvider
children?: ReactNode
— fallback in caseFill
with matchingname
not provided, optionalonChange?(hasFilled: boolean): void
— callback for detecting state changes, ontrue
children of matchingFill
is rendered and fallback is hidden
Description
Define the target slot for Fill
component. Can be used multiple times with the same name inside each SlotsProvider
.
Fill
import { Fill } from 'nano-slots'
Props
name: string
— unique slot name for currentSlotsProvider
children: ReactNode
— will be rendered inside matchingSlot
Description
Render children into matching Slot
of current SlotsProvider
.
createSlots
import createSlots from 'nano-slots'
Description
Designed for more advanced usages and stronger types. Returns an object containing:
.Provider
— same asSlotsProvider
, but with different context.Slot
— same asSlot
, but with own context.Fill
— same asFill
, but with own context
Returned Slot
and Fill
can be used without a Provider
.
Types
export interface ProviderProps {
children: React.ReactNode;
}
export function SlotsProvider(props: ProviderProps): JSX.Element;
export interface SlotProps<Names extends PropertyKey> {
name: Names;
children?: React.ReactNode;
}
export function Slot(props: SlotProps): JSX.Element;
export interface FillProps<Names extends PropertyKey> {
name: Names;
children?: React.ReactNode;
}
export function Fill(props: FillProps): null;
export default function createSlots<Names extends PropertyKey>(): {
Provider: (props: SlotsProviderProps): JSX.Element;
Slot: (props: SlotProps<Names>): JSX.Element;
Fill: (props: FillProps<Names>): null;
}
Alternatives
react-slot-fill
- abandoned project that inspired this onereact-view-slot
- more modern approach, but 12x times bigger
MIT © John Grishin