#reactjs #react-native #react-navigation
#reactjs #react-native #react-навигация
Вопрос:
Я использую React Navigation. У меня есть кнопка «еще» в качестве последнего элемента навигатора нижней вкладки, и я хочу, чтобы она открывала ящик, когда пользователь нажимает на него. Я перепробовал так много вещей и изучил так много ответов, но ничего не работает. Самое близкое, что я могу получить, находится ниже. Это приведет вас на страницу, содержащую ящик, который можно открыть. Однако я хочу, чтобы он открывался при нажатии.
Пока у меня есть этот код…
const MoreStack = createDrawerNavigator({
More: { screen: More }
})
const MainTabNavigator = createBottomTabNavigator({
Home: { screen: HomeStack }
...
More: { screen: MoreStack }
})
const MainStackNavigator = createStackNavigator({
MainTabNavigator: MainTabNavigator,
})
const AppSwitchNavigator = createSwitchNavigator({
Welcome: { screen: WelcomeScreen },
Home: { screen: MainStackNavigator }
})
const AppContainer = createAppContainer(AppSwitchNavigator)
Обновить
Таким образом, возможным решением является открытие MoreStack с начальным маршрутом, который отображает FlatList, а не ящик. В MoreStack я также создаю все страницы, которые мне нужны для включения в список More FlatList. Затем на экране «Еще» я создаю массив с каждым маршрутом в качестве объекта и связываюсь с ними из FlatList с помощью navigation.navigate (item.name )
Проблема с этим и ключ к тому, чтобы заставить его работать как ящик, заключалась в настройке backBehavior: ‘история’ в MainTabNavigator. Затем, когда вы добавляете обработчик жестов на экран «Больше» на swiperight и устанавливаете значение navigation.GoBack (null), он вернет вас к предыдущему маршруту, создавая ощущение, что вы «закрываете» экран «Больше».
Я не уверен, как все это будет работать, когда я попаду в другие ситуации навигации по маршрутам в MoreStack, но, думаю, я разберусь с этим, когда доберусь до него.
Ответ №1:
Ваш навигатор вкладок и StackNavigator должны быть дочерними элементами MainTabNavigator, поскольку:
const MainTabNavigator = createBottomTabNavigator({
Home: { screen: HomeStack }
More: { screen: MoreStack }
})
const MainStackNavigator = createStackNavigator({
MainTabNavigator: MainTabNavigator,
})
const MoreStack = createDrawerNavigator({
SomePage:{screen:MainTabNavigator}//<<<<<<<<
SomeOther:{screen:MainStackNavigator}//<<<<<<<<<<
More: { screen: More }
})
const AppSwitchNavigator = createSwitchNavigator({
Welcome: { screen: WelcomeScreen },
Home: { screen: MaoreStack }//<<<<<<<<<<<<<<<<<<<<<<
})
а затем предоставьте больше стека AppSwitchNavigator…..
Комментарии:
1. Я получаю «Компонент для маршрута SomePage должен быть компонентом react». Я думаю, потому что MainStackNavigator и MainTabNavigator находятся под MoreStack. Когда я помещаю их выше MoreStack, я получаю «не могу найти переменную MainTabNavigator»
2. хорошо, я отредактирую ответ, проверьте его, пожалуйста. просто измените порядок создания объекта, это исправит … я должен создать MainTabNavigator перед moreStack
3. Это тоже не работает. Затем я получаю сообщение «Компонент для маршрута More должен быть компонентом react»
4. Ps — Я также пытался выделить каждую функцию и импортировать их, и это по-прежнему создает ту же проблему.
Ответ №2:
Вы можете использовать этот код. Я использовал 3.x версию react-navigation
const FooterTabs = (props) => (
<Footer>
<FooterTab}>
<Button
vertical
onPress={() => props.navigation.openDrawer()}>
<Text style={styles.Text}> Menu</Text>
</Button>
</FooterTab>
</Footer>
)
const MainTabNavigator = createBottomTabNavigator({
Home: { screen: HomeStack }
...
More: { screen: MoreStack }
},{
tabBarComponent: props =>
<FooterTabs
{...props} />,
initialRouteName: "Home",
})
const MoreStack = createDrawerNavigator({
More: { screen: More }
})
const AppContainer = createAppContainer(MoreStack )