问题描述
在我的React Native应用中,我正在使用react-navigation
的第5版和react-native-paper
。
我试图在我的底部选项卡中找到一项来指向堆栈导航器。当我这样做时,出现以下错误:
已超过最大更新深度。组件调用时可能会发生这种情况 useEffect中的setState,但是useEffect要么没有 依赖项数组,或每个渲染上的依赖项更改之一。
如果我将标签项指向常规屏幕,则一切正常。根据{{1}}文档,我使用react-navigation
中的BottomNavigation
组件,而不是使用他们的制表符解决方案-https://reactnavigation.org/docs/material-bottom-tab-navigator/#using-with-react-native-paper-optional
这是我的标签页组件:
react-paper
这是我指向的堆栈导航器,它会导致错误:
import React from 'react';
import { BottomNavigation } from 'react-native-paper';
// Components
import CodeScanner from '../../../screens/vendors/CodeScannerScreen';
import Home from '../../../screens/home/HomeScreen';
import vendors from '../vendors/vendoRSStack';
// Stylesheet
import { styles } from './style-home-tabs';
const HoMetabs = (props) => {
const [index,setIndex] = React.useState(0);
// Routes
const homeRoute = () => <Home />;
const vendorsRoute = () => <vendors />;
const scanRoute = () => <CodeScanner />;
const [routes] = React.useState([
{ key: 'home',title: 'Home',icon: 'newspaper-variant-multiple' },{ key: 'vendors',title: 'vendors',icon: 'storefront' },{ key: 'codescanner',title: 'Scan',icon: 'qrcode-scan' }
]);
const renderScene = BottomNavigation.SceneMap({
home: homeRoute,vendors: vendorsRoute,codescanner: scanRoute
});
return (
<BottomNavigation
navigationState={{ index,routes }}
onIndexChange={setIndex}
renderScene={renderScene}
labeled={false} />
);
}
export default HoMetabs;
正如我所说,如果我要指向常规屏幕,一切正常。知道这里发生了什么以及如何解决吗?
解决方法
将路线声明移到组件外部可以解决此问题。每次安装组件时,它都会调用这些函数,从而导致了问题。
import React from 'react';
import { BottomNavigation } from 'react-native-paper';
// Components
import CodeScanner from '../../../screens/vendors/CodeScannerScreen';
import Home from '../../../screens/home/HomeScreen';
import Vendors from '../vendors/VendorsStack';
// Stylesheet
import { styles } from './style-home-tabs';
// Routes
const homeRoute = () => <Home />;
const vendorsRoute = () => <Vendors />;
const scanRoute = () => <CodeScanner />;
const HomeTabs = (props) => {
const [index,setIndex] = React.useState(0);
const [routes] = React.useState([
{ key: 'home',title: 'Home',icon: 'newspaper-variant-multiple' },{ key: 'vendors',title: 'Vendors',icon: 'storefront' },{ key: 'codescanner',title: 'Scan',icon: 'qrcode-scan' }
]);
const renderScene = BottomNavigation.SceneMap({
home: homeRoute,vendors: vendorsRoute,codescanner: scanRoute
});
return (
<BottomNavigation
navigationState={{ index,routes }}
onIndexChange={setIndex}
renderScene={renderScene}
labeled={false} />
);
}
export default HomeTabs;