undefined не является объектом (оценка this.props.navigation.navigate) для onPress

#javascript #reactjs #react-native #react-native-navigation #stack-navigator

#javascript #reactjs #реагировать -родной #реагировать-native-navigation #stack-navigator

Вопрос:

Я новичок в react native и получаю эту ошибку:

undefined не является объектом (оценка this.props.navigation.navigate)

Это очень распространенная ошибка, но причина может быть другой, поскольку я не могу ее исправить, увидев другие ответы на похожие вопросы.

У меня есть экран с этим кодом:

 function MyClientsScreen(props) {

    return (
        <Stack.Navigator>
            <Stack.Screen name='Clients' component={ClientSrc} options={{
                title: 'My Clients',
                headerRight: () => (
                    <TouchableOpacity onPress={() => props.navigation.navigate('AddClients')}>
                        <Image source={require('../assets/addClient.png')} style={styles.addBtnImg} />
                    </TouchableOpacity>
                ),
            }} />
            <Stack.Screen name='AddClients' component={AddClientSrc} options={{
                title: 'Add New Client',
                headerRight: () => (
                    <TouchableOpacity>
                        <Text style={styles.headerButtton}>Save</Text>
                    </TouchableOpacity>
                )
            }} />
        </Stack.Navigator>
    );
}
 

headerRight Кнопка на текущем экране должна перейти к AddClients (которая находится внутри навигации по стеку) при нажатии.

navigation нигде не определено, и я смог это сделать, когда у меня был код кнопки внутри функции, которую я создал const ClientSrc = ({ navigation }) => {... , но когда я переместил кнопку как headerRight кнопку, onPress она начала выдавать ошибку.

Ответ №1:

Чтобы получить навигационный реквизит, этот компонент должен быть частью навигации.

Вы можете справиться с этим по-другому, как показано ниже

 <Stack.Screen name='Clients' component={ClientSrc} options={({ navigation }) => ({
                title: 'My Clients',
                headerRight: () => (
                    <TouchableOpacity onPress={() => navigation.navigate('AddClients')}>
                        <Image source={require('../assets/addClient.png')} style={styles.addBtnImg} />
                    </TouchableOpacity>
                ),
            })} />
 

Параметры передают навигацию заданной функции, которую вы можете использовать и получить доступ к навигации.