React Native - 底部选项卡导航器 - 错误 - 传递内联函数会导致组件状态在 re-render 上丢失?
React Native - Bottom Tab Navigator - error - Passing an inline function will cause the component state to be lost on re-render?
我有一个堆栈导航器,其中包含一个底部选项卡导航器。
底部选项卡导航器的第一个选项卡还包含一个 TopTab 导航器。
这样做是为了显示顶部选项卡和底部选项卡。
其他每个底部选项卡屏幕都会打开一个新屏幕。
这是代码:(包含底部选项卡导航器的堆栈导航器)
const StackNav = createNativeStackNavigator();
function Main() {
return (
<NavigationContainer>
<StackNav.Navigator>
<StackNav.Screen
name="BottomTab"
component={BottomTabScreen}
options={{
headerTitle: props => <LogoTitle {...props} />,
headerBlurEffect: 'dark',
}}
/>
</StackNav.Navigator>
</NavigationContainer>
);
}
底部选项卡导航器在下方(第一个选项卡包含嵌入式顶部选项卡导航器 TopTabScreen 以显示 header,其余选项卡在底部显示选项卡)
const BottomTabScreen = () => {
return (
<BottomNav.Navigator barStyle={{backgroundColor: '#febe00'}}>
<BottomNav.Screen
name="Home"
component={TopTabScreen}
options={{
tabBarIcon: ({color, size}) => (
<MaterialCommunityIcons name="home" color={color} size={26} />
),
labelStyle: {textTransform: 'none'},
upperCaseLabel: false,
}}
/>
<BottomNav.Screen
name="MyInitiatives"
component={InitiativesScreen}
options={{
tabBarIcon: ({color, size}) => (
<IonIcons name="rocket-outline" color={color} size={26} />
),
}}
/>
<BottomNav.Screen
name="Contact-Whatsapp"
component={() => null}
listeners={{
tabPress: (e) => {
e.preventDefault();
console.log("tabPress tabTwo");
let link = 'https://wa.me/xxx';
Linking.openURL(link);
},
}}
options={{
tabBarIcon: ({color,size}) => (
<FontAwesome name="whatsapp" color={color} size={26} />
),
}}
/>
</BottomNav.Navigator>
);
};
因此在底部选项卡上 - 将显示三个选项卡:
主页 - 显示嵌入 header
的选项卡
MyInitiatives - 单击时显示单独的视图
Contact-Whatsapp - 这是一个选项卡,我试图显示它在单击时应该打开什么
应用程序而不是新屏幕,所以点击选项卡 - 我不想要任何
'component' 渲染,而不是简单地打开什么应用程序
注意 - whatsapp 正在打开但收到此警告:
WARN Looks like you're passing an inline function for 'component' prop for the screen
'Whatsapp'
(e.g. component={() => <SomeComponent />}). Passing an inline function will cause the
component state to be lost on re-render and cause perf issues since it's re-created every
render. You can pass the function as children to 'Screen' instead to achieve the desired
behaviour.
所以问题是:
#1 我该如何解决这个问题?
我如何确保在单击底部选项卡时 - 它应该打开 link(在本例中 - whatsapp)而不是尝试打开组件/视图?
出现警告的原因是您将函数而不是函数名称传递给组件属性。您可以将任何组件名称放在那里,因为 e.preventDefault() 它不会被打开。您可以只创建一个小的虚拟组件并传入名称。即使是 component={View}
也能胜任。
我有一个堆栈导航器,其中包含一个底部选项卡导航器。 底部选项卡导航器的第一个选项卡还包含一个 TopTab 导航器。
这样做是为了显示顶部选项卡和底部选项卡。 其他每个底部选项卡屏幕都会打开一个新屏幕。
这是代码:(包含底部选项卡导航器的堆栈导航器)
const StackNav = createNativeStackNavigator();
function Main() {
return (
<NavigationContainer>
<StackNav.Navigator>
<StackNav.Screen
name="BottomTab"
component={BottomTabScreen}
options={{
headerTitle: props => <LogoTitle {...props} />,
headerBlurEffect: 'dark',
}}
/>
</StackNav.Navigator>
</NavigationContainer>
);
}
底部选项卡导航器在下方(第一个选项卡包含嵌入式顶部选项卡导航器 TopTabScreen 以显示 header,其余选项卡在底部显示选项卡)
const BottomTabScreen = () => {
return (
<BottomNav.Navigator barStyle={{backgroundColor: '#febe00'}}>
<BottomNav.Screen
name="Home"
component={TopTabScreen}
options={{
tabBarIcon: ({color, size}) => (
<MaterialCommunityIcons name="home" color={color} size={26} />
),
labelStyle: {textTransform: 'none'},
upperCaseLabel: false,
}}
/>
<BottomNav.Screen
name="MyInitiatives"
component={InitiativesScreen}
options={{
tabBarIcon: ({color, size}) => (
<IonIcons name="rocket-outline" color={color} size={26} />
),
}}
/>
<BottomNav.Screen
name="Contact-Whatsapp"
component={() => null}
listeners={{
tabPress: (e) => {
e.preventDefault();
console.log("tabPress tabTwo");
let link = 'https://wa.me/xxx';
Linking.openURL(link);
},
}}
options={{
tabBarIcon: ({color,size}) => (
<FontAwesome name="whatsapp" color={color} size={26} />
),
}}
/>
</BottomNav.Navigator>
);
};
因此在底部选项卡上 - 将显示三个选项卡:
主页 - 显示嵌入 header
的选项卡MyInitiatives - 单击时显示单独的视图
Contact-Whatsapp - 这是一个选项卡,我试图显示它在单击时应该打开什么 应用程序而不是新屏幕,所以点击选项卡 - 我不想要任何 'component' 渲染,而不是简单地打开什么应用程序 注意 - whatsapp 正在打开但收到此警告:
WARN Looks like you're passing an inline function for 'component' prop for the screen
'Whatsapp'
(e.g. component={() => <SomeComponent />}). Passing an inline function will cause the
component state to be lost on re-render and cause perf issues since it's re-created every
render. You can pass the function as children to 'Screen' instead to achieve the desired
behaviour.
所以问题是: #1 我该如何解决这个问题? 我如何确保在单击底部选项卡时 - 它应该打开 link(在本例中 - whatsapp)而不是尝试打开组件/视图?
出现警告的原因是您将函数而不是函数名称传递给组件属性。您可以将任何组件名称放在那里,因为 e.preventDefault() 它不会被打开。您可以只创建一个小的虚拟组件并传入名称。即使是 component={View}
也能胜任。