Skip to content

Primer Component’s 'SelectMenu' should be usable as a controlled component #933

@emplums

Description

@emplums

(Moved over from the ds repo thanks @smockle !)

Problem

Currently, SelectMenu manages its own open/closed state. By calling setOpen from SelectMenu.Context, a component descendent of SelectMenu can open or close the menu. But it’s currently difficult for a component outside SelectMenu’s render tree to open or close it.

In another project at GitHub using PRC, there is a need to be able to open SelectMenu components from places outside of the SelectMenu hierarchy.

Solution

SelectMenu should accept an open prop, which controls whether the menu is open/visible or closed/hidden.

Alternatives

Another project at GitHub using PRC is able to auto-open the SelectMenu s by defining a custom SelectMenu component which renders a SelectMenuInternal component which consumes a useSelectMenuInternal hook.

Because useSelectMenuInternal is called by SelectMenuInternal (a child of SelectMenu), it has access to both SelectMenu.Context and a set of propagated props (specifically, open, onOpen and onClose).

By using useEffect to respond to changes in SelectMenu.Context and props, useSelectMenuInternal is able to synchronize the SelectMenu.Context’s internal open value with the value of the open prop.

This effectively allows the SelectMenu component to be controlled.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions