-
-
Notifications
You must be signed in to change notification settings - Fork 2.2k
Open
Labels
Description
Current behaviour
- Open the Menu component
- The parent component re-renders
- Menu component closes and can't be opened again
Expected behaviour
- Open the Menu component
- The parent component re-renders
- Menu component stays open
How to reproduce?
import React, {useState} from 'react';
import {View} from 'react-native';
import {Button, Menu, PaperProvider} from 'react-native-paper';
const MyComponent = () => {
const [randomVarialbeToForceRerender, setRandomVarialbeToForceRerender] =
useState(0);
const [visible, setVisible] = useState(false);
const openMenu = () => {
console.debug('Opening menu');
setVisible(true);
/**
* We update a state variable to force a re-render of the component.
* A real-world example could be a network request or some other
* asynchronous operation that updates the state.
*/
setTimeout(() => setRandomVarialbeToForceRerender(Math.random()), 1000);
};
const closeMenu = () => {
setVisible(false);
console.debug('Closing menu');
};
console.debug('visible', visible);
return (
<PaperProvider>
<View
style={{
paddingTop: 50,
flexDirection: 'row',
justifyContent: 'center',
}}>
<Menu
visible={visible}
onDismiss={closeMenu}
anchor={<Button onPress={openMenu}>Show menu</Button>}>
<Menu.Item
onPress={() => {}}
title={`Random ${randomVarialbeToForceRerender}`}
/>
</Menu>
</View>
</PaperProvider>
);
};
export default MyComponent;
Preview
Simulator.Screen.Recording.-.iPhone.16.-.2025-06-23.at.12.55.03.mp4
What have you tried so far?
Memoization to avoid re-rendering the menu. However, this approach is limited and breaks
when the menu items are non-static (c.f. example)
Your Environment
software | version |
---|---|
ios | 18.5 |
android | x |
react-native | 0.77.2 |
react-native-paper | 5.13.1 |
node | 18.20.8 |
npm or yarn | 3.8.7 |
expo sdk | x.x.x |
atheck, vpzomtrrfrt and haykerman