React Navigations 5: превышена максимальная глубина обновления - PullRequest
1 голос
/ 07 августа 2020

У меня есть файл ShopNavigator.js, в котором я обрабатываю всю свою навигацию:

import React from 'react';
import { NavigationContainer } from '@react-navigation/native';
import { createStackNavigator } from '@react-navigation/stack';
import { Platform } from 'react-native';

import ProductsOverviewScreen from '../screens/shop/ProductsOverviewScreen';
import ProductDetailScreen from '../screens/shop/ProductDetailScreen';
import CartScreen from '../screens/shop/CartScreen';
import { useSelector } from 'react-redux';

import Colors from '../constants/Colors';
import { HeaderButtons, Item } from 'react-navigation-header-buttons';
import HeaderButton from '../components/UI/HeaderButton';

const ProductsNavigator = createStackNavigator();

const ProductsNavMenu = () => {
    return (
        <NavigationContainer>
            <ProductsNavigator.Navigator
                screenOptions={{
                    headerStyle: {
                        backgroundColor: Platform.OS === 'android' ? Colors.primary : ''
                    },
                    headerTintColor: Platform.OS === 'android' ? 'white' : Colors.primary,
                    headerTitleStyle: {
                        fontSize: 17,
                        fontFamily: 'poppins-bold'
                    },
                    headerBackTitleStyle: {
                        fontFamily: 'poppins-regular'
                    }
                }}>
                <ProductsNavigator.Screen
                    name="Products"
                    component={ProductsOverviewScreen}
                    options={({ navigation }) => {
                     return {
                        headerRight: () => (
                            <HeaderButtons HeaderButtonComponent={HeaderButton}>
                                <Item
                                    title="Cart"
                                    iconName={Platform.OS === 'android' ? 'md-cart' : 'ios-cart'}
                                    onPress={ navigation.navigate('Cart') }
                                />
                            </HeaderButtons>
                        )
                      };
                    }}
                />
                <ProductsNavigator.Screen
                    name="ProductDetail"
                    component={ProductDetailScreen}
                    options={({ route }) => {
                        const productTitle = route.params.productTitle;
                        return {
                            title: productTitle
                        };
                    }}
                />
                <ProductsNavigator.Screen
                    name="Cart"
                    component={CartScreen}
                />
            </ProductsNavigator.Navigator>
        </NavigationContainer>
    );
};

export default ProductsNavMenu;

Но, в частности, здесь, в моем headerButton, мне нужно использовать функцию навигации, чтобы go в мою корзину через Ionicons:

<ProductsNavigator.Screen
                    name="Products"
                    component={ProductsOverviewScreen}
                    options={({ navigation }) => {
                     return {
                        headerRight: () => (
                            <HeaderButtons HeaderButtonComponent={HeaderButton}>
                                <Item
                                    title="Cart"
                                    iconName={Platform.OS === 'android' ? 'md-cart' : 'ios-cart'}
                                    onPress={ navigation.navigate('Cart') }
                                />
                            </HeaderButtons>
                        )
                      };
                    }}
                />

Как видите, я использую navigation.navigate('Cart') до go в своей корзине. Но вместо того, чтобы идти к моей тележке, он выдает ошибку:

Error: Maximum update depth exceeded. This can happen when a component repeatedly calls setState inside componentWillUpdate or componentDidUpdate. React limits the number of nested updates to prevent infinite loops.

This error is located at:
    in StackNavigator (at ShopNavigator.js:20)
    in EnsureSingleNavigator (at BaseNavigationContainer.tsx:390)
    in ForwardRef(BaseNavigationContainer) (at NavigationContainer.tsx:91)
    in ThemeProvider (at NavigationContainer.tsx:90)
    in ForwardRef(NavigationContainer) (at ShopNavigator.js:19)
    in ProductsNavMenu (at App.js:48)
    in Provider (at App.js:47)
    in App (created by ExpoRoot)
    in RNCAppearanceProvider (at src/index.tsx:70)
    in AppearanceProvider (created by ExpoRoot)
    in ExpoRoot (at renderApplication.js:45)
    in RCTView (at AppContainer.js:109)
    in DevAppContainer (at AppContainer.js:124)
    in RCTView (at AppContainer.js:135)
    in AppContainer (at renderApplication.js:39)

Счетчик моей корзины отправляется на моем ProductsOverviewScreen.js:

import React from 'react';
import { FlatList } from 'react-native';
import { useSelector, useDispatch } from 'react-redux';

import ProductItem from '../../components/shop/ProductItem';
// import all actions here
import * as cartActions from '../../store/actions/cart';


const ProductsOverviewScreeen = props => {
    // This data can be chop from reducers 
    const products = useSelector(state => state.products.availableProducts);
    
    // call the dispatch action:
    const dispatch = useDispatch();


    return <FlatList
        data={products}
        keyExtractor={item => item.id}
        renderItem={itemData => (
            <ProductItem
                image={itemData.item.imageUrl}
                title={itemData.item.title}
                price={itemData.item.price}
                onViewDetail={() => {
                    // Go to product detail and pass the data of the item
                    props.navigation.navigate('ProductDetail', { productId: itemData.item.id, productTitle: itemData.item.title });
                 }}
                 // dispatch the action here
                onAddToCart={() => { 
                    dispatch(cartActions.addToCart(itemData.item));
                }}
            />
        )}
    />;
};

export default ProductsOverviewScreeen;

Есть идеи, что я делаю не так Вот? Пожалуйста, помогите!

1 Ответ

0 голосов
/ 07 августа 2020
<HeaderButtons HeaderButtonComponent={HeaderButton}>
                                <Item
                                    title="Cart"
                                    iconName={Platform.OS === 'android' ? 'md-cart' : 'ios-cart'}
                                    onPress={ ()=>navigation.navigate('Cart') }
                                />
                            </HeaderButtons>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...