kentcdodds/ama

JSX Inline switch statement for enumerated states

Opened this issue · 0 comments

Hey Kent,

As I've been working more with enumerated states, "OPEN", "CLOSED" etc, and moving away from using bools like isOpen I was looking for a more explicit inline control flow for conditional rendering than ternary operators { isOpen ? <OpenState /> : <ClosedState> }.

I came across a pattern of using objects as inline switch statements:

<>
{
  {
    OPEN : (<OpenState />),
    CLOSED: (<ClosedState />)
  } [openState]
}
</>

I had never seen it used before and wondered whether there are any drawbacks? As I see it:

✅ Inline code so easy to see control flow
✅ Explicit declarations of states, with ability to add a fallback by adding || <Fallback />
✅ Easy to add new states by adding new object entries
Does the creation of the object have a performance detriment over short-circuiting or ternaries?

The alternatives aren't perfect, ones I can see are:

Inline ternary

<>
{ openState === "OPEN" ? <OpenState /> : <ClosedState /> }
</>

✅ Good inline readability
❌ Difficult to add new states to the flow when requirements change

renderComponent() function

renderOpen = () => {
  switch(openState) {
    case "OPEN" : return <OpenState />
    case "CLOSED" : return <ClosedState />
    default: ...
}
return (
  <>
    {renderOpen()}
  </>
)

✅ Easier to add new states
❌ Arguably harder to read with control flow jumping around in the document
❌ I've seen this pattern get really out of hand with 10+ render functions in one component

Would be great to hear your, or anyone else's thoughts on this!