Fully customizable collapsible views
yarn add @r0b0t3d/react-native-collapsible
I am using reanimated 2
for animation. So you should install and follow instruction here to setup your project react-native-reanimated
1️⃣ Support FlatList/ScrollView 2️⃣ Support sticky header 3️⃣ Can have multiple sticky headers 4️⃣ Easy to customize
import {
CollapsibleContainer,
CollapsibleFlatList,
CollapsibleScrollView,
} from '@r0b0t3d/react-native-collapsible';
// ...
const MyComponent = () => {
const {
collapse, // <-- Collapse header
expand, // <-- Expand header
scrollY, // <-- Animated scroll position. In case you need to do some animation in your header or somewhere else
} = useCollapsibleContext();
return (
<CollapsibleContainer> // 1️⃣ (Required) Outermost container
<CollapsibleHeaderContainer> // 2️⃣ (Required) Header view
<!-- Your header view -->
<StickyView> // 3️⃣ Sticky view
<!-- Your sticky view goes here -->
</StickyView>
</CollapsibleHeaderContainer>
<CollapsibleFlatList // 4️⃣ (Required) Your FlatList/ScrollView
data={data}
renderItem={renderItem}
headerSnappable={false} // <-- should header auto snap when you release the finger
/>
</CollapsibleContainer>
)
}
export default withCollapsibleContext(MyComponent); // 5️⃣ (Required)wrap your component with `withCollapsibleContext`
We support multiple CollapsibleHeaderContainer
and StickyView
. It come useful in case you need to break your code into smaller component.
Parent.tsx
const Parent = () => {
const [tabIndex, setTabIndex] = useState(0)
return (
<CollapsibleContainer>
<CollapsibleHeaderContainer>
<!-- Your header view -->
<StickyView>
<TabView currentTab={tabIndex} onTabChange={setTabIndex} />
</StickyView>
</CollapsibleHeaderContainer>
{tabIndex === 0 && <FirstTab />}
{tabIndex === 1 && <SecondTab />}
</CollapsibleContainer>
)
}
FirstTab.tsx
const FirstTab = () => {
return (
<>
<CollapsibleHeaderContainer>
<!-- 😍 You can have another headerview in each tab where you can add another StickyView there -->
<StickyView>
<!-- Your sticky view goes here -->
</StickyView>
<View />
<StickyView>
<!-- 🚀 Bonus, multiple sticky view -->
</StickyView>
</CollapsibleHeaderContainer>
<CollapsibleFlatList
data={data}
renderItem={renderItem}
/>
</>
)
}
Note: Feel free to add your showcase here by a PR
App | Gif |
---|---|
ANU Global |
-
Removed
persistHeaderHeight
contentMinHeight
-
Added
CollapsibleContainer
StickyView
- If your header doesn't contains touchable component, try
pointerEvents="none"
<CollapsibleHeaderContainer>
<View pointerEvents="none">
<Text>Header</Text>
</View>
</CollapsibleHeaderContainer>
- If your header contains touchable componet, try to set
pointerEvents="box-none"
for every nested views that contains touchable, otherwise usepointerEvents="none"
<CollapsibleHeaderContainer>
<View pointerEvents="box-none"> // <-- this is parent view
<View pointerEvents="none"> // <-- this view doesn't contain touchable component
<Text>Header</Text>
</View>
<View pointerEvents="box-none"> // <-- this view contain touchable component
<View pointerEvents="none">
<Text>Some text</Text>
</View>
<TouchableOpacity>
<Text>Button</Text>
</TouchableOpacity>
</View>
</View>
</CollapsibleHeaderContainer>
See the contributing guide to learn how to contribute to the repository and the development workflow.
MIT