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

Проблема с навигацией по стеку между экранами. Я показываю данные на экране «SveKategorije». Это в основном кнопки категорий, когда я нажимаю кнопку, я просто хочу показать другой экран, но по какой-то причине он не работает. Когда я нажимаю onPress = {() => this.props.navigation.navigate('имя экрана')} это дает мне это ошибка Я использую (реагировать-нативный - 0.57.7)

Вот код router.js (где я объявляю свои маршруты)

import React from 'react';
import { View, Text, Button } from "react-native";
import { createBottomTabNavigator, createStackNavigator } from "react-navigation";
import { Icon } from 'react-native-elements';

//TABS
import Categories from '../tabs/categories';
import Home from '../tabs/home';
import Me from '../tabs/me';

//screens for CATEGORIES 
import ViceviPoKategoriji from '../components/Ispis/ViceviPoKategoriji';


//CATEGORIES STACK 
export const categoriesFeedStack = createStackNavigator({

    SveKategorije: {
        screen: Categories,
        navigationOptions: {
            title: 'KATEGORIJE',
        },
    },

    ViceviPoKategoriji: {
        screen: ViceviPoKategoriji,
    }

});


//TABS
export const Tabs = createBottomTabNavigator({


    Categories: {
        screen: categoriesFeedStack,
        navigationOptions: {
            title: 'Kategorije',
            label: 'Kategorije',
            tabBarIcon: ({ tintColor }) => <Icon name = "list" size = {35} color = {tintColor} />,
        }

    },
    Home: {
        screen: Home,
        navigationOptions: {
            title: 'Pocetna',
            label: 'Kategorije',
            tabBarIcon: ({ tintColor }) => <Icon name = "home" size = {35} color = {tintColor} />,
        }

    },
    Me: {
        screen: Me,
        navigationOptions: {
            title: 'Profil',
            label: 'Kategorije',
            tabBarIcon: ({ tintColor }) => <Icon name = "account-circle" size = {35} color = {tintColor} />,
        }
    },

},
    {
        initialRouteName: "Home",
        showIcon: true
    },

);

Вот скрин SveKategorije

import React from 'react';
import { StyleSheet, Text, View, ActivityIndicator, ScrollView, Button } from 'react-native';
import { createStackNavigator, createAppContainer, StackNavigator, navigate } from 'react-navigation';


export default class SveKategorije extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            isLoading: true,
            dataSource: null
        }
    }




    componentDidMount() {
        return fetch('http://centarsmijeha.com/api/allCategories')
            .then((response) => response.json())
            .then((responseJson) => {
                this.setState({
                    isLoading: false,
                    dataSource: responseJson.data,
                })
            })
            .catch((error) => {
                console.info(error)
            });
    }
    render() {

        if (this.state.isLoading) {
            return (
                <View style = {styles.container}>
                    <ActivityIndicator />
                </View>
            )
        } else {
            let data = this.state.dataSource.map((val, key) => {

                return (
                    <View key = {key} style = {styles.item}>

                        <Button
                            onPress = {() => this.props.navigation.navigate('ViceviPoKategoriji')}
                            title = {val.categoryName}
                        />
                    </View>
                );

            });
            return (
                <ScrollView>

                    {data}
                </ScrollView >
            );
        }
    }
}




//CSS
const styles = StyleSheet.create({
    container: {
        flex: 1,
        backgroundColor: '#fff',
        alignItems: 'center',
        justifyContent: 'center',
        width: '100%'
    },
    item: {
        flex: 1,
        alignSelf: 'stretch',
        width: '100%',
        textAlign: 'center',
        alignItems: 'center',
        justifyContent: 'center'
    }
});

а вот экран «ViceviPoKategoriji» (экран, который должен отображаться при нажатии любой кнопки на экране «SveKategorije»)

import React from 'react';
import { StyleSheet, Text, View, ActivityIndicator, ScrollView } from 'react-native';


export default class ViceviPoKategoriji extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            isLoading: true,
            dataSource: null,
        }
    }
    componentDidMount() {
        return fetch('http://centarsmijeha.com/api/jokesByCategory/16')
            .then((response) => response.json())
            .then((responseJson) => {
                this.setState({
                    isLoading: false,
                    dataSource: responseJson.data,
                })
            })
            .catch((error) => {
                console.info(error)
            });
    }
    render() {
        if (this.state.isLoading) {
            return (
                <View style = {styles.container}>
                    <ActivityIndicator />
                </View>
            )
        } else {
            let data = this.state.dataSource.map((val, key) => {

                return <View key = {key} style = {styles.item}><Text>{val.jokeText}</Text></View>

            });
            return (
                <ScrollView>

                    {data}
                </ScrollView >
            );
        }
    }
}
const styles = StyleSheet.create({
    container: {
        flex: 1,
        backgroundColor: '#fff',
        alignItems: 'center',
        justifyContent: 'center',
    },
    item: {
        flex: 1,
        alignSelf: 'stretch',
        marginTop: 50,
        marginRight: '15%',
        marginLeft: '15%',
        width: '70%',
        textAlign: 'center',
        alignItems: 'center',
        justifyContent: 'center',
        borderBottomWidth: 1,
        borderBottomColor: '#eee'
    }
});

SveKategorije не существует в стеке вашего маршрутизатора, поэтому, что касается навигационной библиотеки, этого экрана не существует, поэтому, когда вы пытаетесь использовать this.props.navigation, вы получаете, что он не определен.

Michael Ostrovsky 06.02.2019 03:53
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
1
2 627
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

React-навигация — это навигация на основе реквизита. Я думаю, что ваш компонент не имеет навигационных реквизитов. Пожалуйста, проверьте, есть ли в вашем компоненте навигационные реквизиты.

делать

render() {
  console.info(this.props.navigation)
  // or debugger
  return (

Если результат console.info не определен, добавьте «import SveKategorije» в файл маршрутизации.

Импортировал «SveKategorije» и вставил в качестве экрана, у меня сработало <3

Sadmir Hasanic 07.02.2019 08:40

Вам нужно сделать еще несколько настроек для навигации из компонента. Вы можете получить доступ к навигатору через ссылку и передать его в NavigationService, который мы позже будем использовать для навигации.

https://reactnavigation.org/docs/en/navigating-without-navigation-prop.html

В моем случае я случайно использовал this.props.navigation внутри функционального компонента. Если кто-то допустил подобную ошибку, еще раз проверит ваш код.

Другие вопросы по теме