Skip to content
Advertisement

How to render “N items selected” rather than the list of N selected items with react-select

I’m looking into using react-select as a selector for a city-picker, where users can pick 1 or multiple cities to filter some data on. Here is a screenshot of it rendered in my page: city selector

The city list can be large, and I don’t want the selector to grow outside of its blue container if a large number are selected at once. Here is what happens when I simulate that now:

enter image description here

I’m not a huge fan of that! One alternative I can think of is to render “4 cities selected” instead of the entire list. This will have a predictable size on the page.

How can this be done with react-select?

Advertisement

Answer

Note: this answer is for react-select v1. See the answer by NearHuscarl for a solution for v3.

Rendering “N items selected”

This can be achieved with the valueRenderer and className props and a minimal amount of CSS.

Here I’m showing the first three selections normally, and then “N items selected” when 4+ items have been selected. It makes no sense to show the remove selection icon (×) besides “N items selected,” so I also removed that (with CSS).

JavaScript
JavaScript
JavaScript

Alternative approach

Looking at your screenshots, it looks like there’s space to show up to four selections without making the selector overflow. Instead of showing “N items selected” when 4+ cities have been selected, you could show the first 3 selections normally and then “+N more.” Like this:

  • City A
  • City A, City B
  • City A, City B, City C
  • City A, City B, City C, + 1 more
  • City A, City B, City C, + 2 more
  • City A, City B, City C, + 3 more
  • etc.

From UX perspective, I think it’s good to show the first 3 or so selections normally. It’s confusing if every selection is suddenly hidden behind the text “4 items selected” after the 4th city is selected.

This solution is very similar than the first one. The className prop is now simply a string. The renderValue method and the CSS selectors are a bit different.

JavaScript
JavaScript
JavaScript

Here’s another approach of showing the selections:

  • City A
  • City A, City B
  • City A, City B, City C
  • City A, City B, City C, City D
  • City A, City B, City C, + 2 more
  • City A, City B, City C, + 3 more
  • etc.

From UX perspective, it’s a bit silly to show “+ 1 more” instead of showing the value, so in my opinion this is the best option.

The renderValue method is once again a bit different. The CSS selectors are now a bit uglier and more complex, but they work.

JavaScript
JavaScript
JavaScript
Advertisement