以前在React Navigation v5之前,可以使用getCustomActionCreators
通过按钮打开特定的抽屉。
一个这样做的例子在这里:React Native two drawers on one screen
但是,似乎该功能已被删除。在React Navigation 5中有没有办法做到这一点?
这可以通过创建自定义路由器来实现。
以下是一些重要的见解:
自定义操作:
export const openMenuDrawerAction = { type: 'OPEN_MENU_DRAWER' };
帮助程序功能,以分派自定义操作(可选)
export const openMenuDrawer = navigation => {
navigation.dispatch(openMenuDrawerAction);
};
自定义路由器
const MenuDrawerRouter = options => {
const router = DrawerRouter(options);
const oldGetStateForAction = router.getStateForAction;
return {
...router,
getStateForAction: (state, action, options) => {
switch (action.type) {
case 'OPEN_MENU_DRAWER':
return oldGetStateForAction(state, DrawerActions.openDrawer(), options);
default:
return oldGetStateForAction(state, action, options);
}
}
};
};
自定义导航器>>
这是基于createDrawerNavigator中的代码。
现在,我们不用const createDrawerNavigatorWithRouter = router => { // eslint-disable-next-line react/prop-types function DrawerNavigator({ initialRouteName, openByDefault, backBehavior, children, screenOptions, ...rest }) { const { state, descriptors, navigation } = useNavigationBuilder(router, { initialRouteName, openByDefault, backBehavior, children, screenOptions }); return <DrawerView {...rest} state={state} descriptors={descriptors} navigation={navigation} />; } return createNavigatorFactory(DrawerNavigator)(); };
创建导航器实例
const Drawer = createDrawerNavigator()
创建导航器,而是用const Drawer = createDrawerNavigatorWithRouter(MenuDrawerRouter)
创建导航器。重复
上述步骤将创建一个抽屉。现在,您将上述内容(具有不同的动作名称)复制到第二个抽屉中。createDrawerNavigatorWithRouter
可以重复使用而无需重复,因为它是抽屉式导航器的通用属性。