#react-native #react-navigation
#react-native #react-навигация
Вопрос:
Я пытаюсь передать параметры на новый экран и реализовал это, как указано здесь.
У меня есть следующая TouchableOpacity
кнопка.
<TouchableOpacity
onPress={() => {
this.props.navigation.navigate('SomeScreen', {
title: 'Title',
subTitle: 'Subtitle',
});
}}
>
На другой странице (давайте назовем ее Somescreen) у меня есть следующее:
render() {
const { navigation } = this.props;
const title = navigation.getParam('title');
}
Но title
выше не определено:
{ params: undefined, routeName: "Somescreen", key: "id-xx" }
Мой корневой стек:
const RootStack = createStackNavigator({
SomescreenA: { screen: SomescreenA },
SomescreenB: { screen: SomescreenB },
}, { headerMode: 'none' });
Почему мои параметры не определены на новом экране?
Комментарии:
1. Вы пробовали передавать объект в
navigate
?2. @Kraylog, спасибо! В настоящее время у меня есть следующее (которое работает): this.props.navigation.navigate({ routeName: ‘SomeScreen’, параметры: { title: ‘title’, subTitle: ‘subTitle’ } }); И это на странице: this.props.navigation.getParam(‘title’); Если вы опубликуете свое предложение в качестве ответа, я с радостью приму его!
3. Отлично! Рад, что это сработало. Добавлен ответ.
Ответ №1:
Если вы столкнулись с ситуацией, когда ваш целевой экран получает undefined
параметры, вероятно, у вас есть вложенный стек навигации.
Здесь вы должны передать параметры методу navigate следующим образом:
navigation.navigate('Root', {
screen: 'Settings',
params: { user: 'jane' },
});
Для получения дополнительной информации прочитайте эту страницу в официальных документах:
https://reactnavigation.org/docs/nesting-navigators/#navigating-to-a-screen-in-a-nested-navigator
Ответ №2:
В моем конкретном случае я вызывал вложенный навигатор, поэтому мне нужно было управлять тем, как отправлять эти параметры на их конкретный экран, поэтому я сделал это:
Отправляйте параметры таким образом … обычным способом:
navigation.navigate(
'OrderNavigator',
{itemSelected},
);
Затем из стека navigator я сделал это:
const OrderNavigator = ({route: {params}}) => {
return (
<Stack.Navigator initialRouteName="Order">
<Stack.Screen name="Order" component={Order} options={{headerShown: false}} initialParams={params} />
</Stack.Navigator>
);
};
И это все. Затем на экране я получил их следующим образом:
const Order = ({route}) => {
const {itemSelected} = route.params;
const {first_name, last_name} = itemSelected;
return (...)
}
Комментарии:
1. Для меня это сработало идеально 🙂
Ответ №3:
Я, к сожалению, сталкивался со случаями, когда navigate(route, params, ...)
не передавал params
объект, как это сделали вы.
В качестве обходного пути я использую другой вариант, navigate({routeName, params, action, key})
который вы можете найти здесь. Это всегда работает.
Комментарии:
1. На самом деле не работает. Есть другое решение?
2. Это ответ от 2019 года. Я подозреваю, что с тех пор библиотека сильно изменилась.
3. Я перемещался между стеками, поэтому мне нужно было сделать это:
navigation.navigate({ routeName: 'Stack', action: NavigationActions.navigate({ routeName: 'Route', params: { booking, startDate: booking.attributes.startDate, }, }), });
Ответ №4:
Принятое решение для ответа у меня не сработало, так что, очевидно, если вы используете children
для рендеринга своего компонента (в настройках экрана) и передаете route
в качестве реквизита, это сработает
Ответ №5:
если вы используете react navigation v6 ^ используйте useRoute
перехват для доступа к объекту params
const route = useRoute();
useRoute
это перехват, который предоставляет доступ к объекту route. Это полезно, когда вы не можете передать route prop в компонент напрямую или не хотите передавать его в случае глубоко вложенного дочернего элемента.
ниже приведена реализация этого
import { useNavigation, useRoute } from '@react-navigation/native';
import { Pressable, Text } from 'react-native';
function Screen1() {
const navigation = useNavigation();
return (
<Pressable
onPress={() => {
navigation.navigate('Screen2', { caption: 'hey' });
}}
>
<Text> Go to Screen 2 </Text>
</Pressable>
);
}
function Screen2() {
const route = useRoute();
return <Text>{route.params.caption}</Text>;
}
Комментарии:
1. Это сработало для меня, и это, вероятно, одно из самых простых решений.