Я сделал это для реакции-навигации v5:
Я создал компонент CustomDrawerContent-Component, чтобы можно было обрабатывать каждое нажатие на элементе:
(Примечание: игнорировать свойства header
и footer
, это только корректировка для моего ящика.)
...
import {
DrawerContentScrollView,
DrawerItem,
} from '@react-navigation/drawer';
...
function CustomDrawerContent(props) {
const {
state: {routes, index},
descriptors,
navigation,
header,
footer,
} = props;
return (
<>
{header}
<DrawerContentScrollView {...props}>
{routes.map((route, i) => {
const focused = i === index;
const {title, drawerLabel, drawerIcon} = descriptors[
route.key
].options;
return (
<DrawerItem
key={route.key}
label={
drawerLabel !== undefined
? drawerLabel
: title !== undefined
? title
: route.name
}
icon={drawerIcon}
focused={focused}
onPress={() => {
navigation.dispatch(
CommonActions.reset({index: i, routes: [{name: route.name}]}),
// NOTICE: Removes the routes.<name>.state of the Stack to discard
// navigation-Position if coming back to it via Drawer-Menu.
// If this Stack-State in seeded later on, you can adjust it here needed
);
}}
/>
);
})}
</DrawerContentScrollView>
{footer}
</>
);
}
function MainDrawer(props) {
const {
screen,
screen: {initialRoute},
navigatorProps,
header,
footer,
hideDrawerItems,
} = props;
return (
<Navigator
initialRouteName={initialRoute}
{...navigatorProps}
drawerContent={(drawerProps) => (
<CustomDrawerContent {...drawerProps} header={header} footer={footer} />
)}>
{createMenuEntries(screen, hideDrawerItems)} // that's only an custom implementation of mine to create <Screen>-Entries. Feel free to replace it with your own
</Navigator>
);
}
export default MainDrawer;
Волхвы c по крайней мере здесь:
{routes.map((route, i) => {
...
onPress => navigation.dispatch => CommonActions.reset({index: ⇒⇒ i ⇐⇐
Пока мы наносим на карту каждый маршрут, мы используем текущий индекс и имя маршрута (самого элемента ящика), чтобы сбросить его состояние маршрута, если мы коснулись его.
Это прекрасно работает для моих целей, потому что даже если вы находитесь в News ⇒ News Detail"
, откройте ящик и снова щелкните по News
, вы попадете на первый экран вашего News-Stack
.