
Description
Current situation
This is a proposal based on a chat I had with @HendrikThePendric. We were talking about the <Menu>
component, and how it's a bit awkward that it has some state that it would need to communicate with the <SubMenu>
he was conceptualizing.
A similar situation exists for the <SingleSelect>
and <MultiSelect>
with its options, the <Transfer>
component and its options, and maybe other ones as well. Now I think we've talked about the above before, but I don't remember creating an issue for it, so I thought I'd create one to centralize the discussion a bit.
Benefits
The benefit of the current api is that it's reminiscent of how you'd compose regular html elements. I understand we also try to avoid incompatibility with web components, so we don't block that as a future upgrade path (and I might have missed other benefits).
Proposal
On the other hand, it does create a fair bit of extra complexity, with all the mapping and cloning of children, and the data flow in the components becomes a bit awkward. Where instead of everything flowing from the top component down, data flow is a bit more opaque. It feels less like a react-like flow and more like we're mixing approaches.
So the proposal is to move to an api where instead of specific children, the data is passed to the root component directly via a prop, as a simple object, instead of as react children. So a Select
could accept an options
prop, same with the Transfer
, etc.
It'd be a big change, so I know it's quite a thing to propose. And there might valid usecases that this'd block. Nevertheless, it hass come up a couple times, so I thought I'd just document it somewhere, so we can form an opinion and remember why we like it or not.