React Native SectionList Expand & Collapse Guide

1 min read

React Native has a component called SectionList that will render things in sections. Think favorite foods:

  • Deserts: ice cream, cheesecake
  • Drinks: water, coke, beer

sectionlist-example

The not-so-obvious part is how you can create a collapsible version of this. By collapsible I mean, being able to hide the individual items upon tapping the header:

sectionlist-collapsed

Luckily for you, getting it working is straight forward. The key is using the extraData prop for a SectionList.

extraData just re-renders the list when you have to pass in new data somewhere (like changing the expand/collapse toggle state.

Then you can use useState and an array or a set to get it working. I use a Set here b/c it's easy, but in its purest form, here's all you need to know:

 <SectionList    sections={DATA}    extraData={expandedSections} // extraData is required to re-render the list when expandedSections changes    keyExtractor={(item, index) => item + index}    renderItem={({ section: { title }, item }) => {      // check to see if the section is expanded      const isExpanded = expandedSections.has(title);      //return null if it is      if (!isExpanded) return null;      return <Item title={item} />;    }}    renderSectionHeader={({ section: { title } }) => (      <Pressable onPress={() => handleToggle(title)}>        <Text style={styles.header}>{title}</Text>      </Pressable>    )}/>

To see a working version of this, check out this Snack. In the event the Snack stops working, here's a gist you can copy/paste somewhere with the same code.