Overview
What Are Prop Collections?
Prop Collection Example
const inputProps = {
onChange: handleChange,
value,
placeholder: 'Type here...',
};
Usage Example
<input {...inputProps} />
What Are Prop Getters?
Prop Getter Example
const getInputProps = (userProps) => ({
onChange: composeHandlers(userProps.onChange, handleChange),
value,
...userProps,
});
Usage Example
<input {...getInputProps({ placeholder: 'Search...' })} />
Let`s Build a Hook: useToggle
Step 1: Basic Toggle Hook
Basic Toggle Hook
import { useState } from 'react';
function useToggle(defaultOn = false) {
const [on, setOn] = useState(defaultOn);
const toggle = () => setOn(prev => !prev);
return { on, toggle };
}
Step 2: Add Prop Collection
Prop Collection Example
function useToggle(defaultOn = false) {
const [on, setOn] = useState(defaultOn);
const toggle = () => setOn(prev => !prev);
// Collection of props for a toggler button
const togglerProps = {
'aria-pressed': on,
onClick: toggle,
};
return {
on,
toggle,
togglerProps,
};
}
Usage Example
const { on, togglerProps } = useToggle();
<button {...togglerProps}>
{on ? 'ON' : 'OFF'}
</button>
Step 3: Add a Prop Getter
Prop Getter Example
function useToggle(defaultOn = false) {
const [on, setOn] = useState(defaultOn);
const toggle = () => setOn(prev => !prev);
const getTogglerProps = (props = {}) => ({
'aria-pressed': on,
onClick: (...args) => {
props.onClick?.(...args);
toggle();
},
...props,
});
return {
on,
toggle,
getTogglerProps,
};
}
Usage Example
const { on, getTogglerProps } = useToggle();
<button
{...getTogglerProps({
onClick: () => console.log('Clicked!'),
className: 'my-btn',
})}
>
{on ? 'ON' : 'OFF'}
</button>
Why Use These Patterns?
- 🧩 Encapsulation: You define logic, users define rendering.
- 🎛️ Composability: Easy to use in any UI framework.
- 🚦 Safety: Avoid prop collisions and handler overrides.
- 🧠 Developer Experience: Consumers get full control with sensible defaults.
Real-Life Examples
React Hook Form
React Hook Form Example
const { register } = useForm();
<input {...register('email')} />
Downshift
Downshift Example
const { getInputProps } = useCombobox();
<input {...getInputProps({ placeholder: 'Search' })} />
When To Use It
- You’re building a custom hook or headless UI library.
- You want to give users render control but preserve behavioral integrity.
- You're managing event handlers like onChange, onClick, onBlur, etc.