Avoid boolean props
Each boolean doubles the states. Compose the variant you need instead.
From vercel-composition-patterns, rule avoid-boolean-props.
Every flag doubles the states
Add a use case. Compare what each approach must cover.
One Composer + flagsBad
4 prop combos1 impossible
2 flags → 2² = 4 statesExplicit composersGood
3 components0 impossible
n use cases → n componentsImpossible combos still render
Turn on two flags at once. Then pick a variant.
Flags decideBad
isEditing ? … : isForwarding ? … : …Variant decidesGood
<ThreadComposer />// Thread composer: adds "also send to channel"
function ThreadComposer({ channelId }: { channelId: string }) {
return (
<Composer.Frame>
<Composer.Header />
<Composer.Input />
<AlsoSendToChannelField id={channelId} />
<Composer.Footer>
<Composer.Formatting />
<Composer.Emojis />
<Composer.Submit />
</Composer.Footer>
</Composer.Frame>
)
}
// Edit composer: different footer actions
function EditComposer() {
return (
<Composer.Frame>
<Composer.Input />
<Composer.Footer>
<Composer.Formatting />
<Composer.Emojis />
<Composer.CancelEdit />
<Composer.SaveEdit />
</Composer.Footer>
</Composer.Frame>
)
}
Why it matters, pros and cons
Why it matters
n booleans allow 2ⁿ prop combinations. Most are impossible, yet all compile and must be guarded.
Pros
- Each variant says what it renders.
- A new use case adds one component, not a doubling.
- Shared parts stay shared through
Composer.*.
Cons
- More components to name and export.
- A true on/off like
disabledis fine as a boolean. - Splitting a big monolith takes a real refactor.