在 ReactNav 5 中按下选项卡按钮时重置堆栈导航
Reset stack navigation when tab button is pressed in ReactNav 5
我有 3 个选项卡,每个选项卡后面都有一个堆栈导航。我总是想在单击另一个选项卡按钮时重置堆栈导航。
现在,当我像 A -> B -> C -> D 这样进入 Stack1 时
然后我切换到 Tab2,然后再切换回 Tab1,我又回到了屏幕 D。
我想再次看到屏幕 A。我使用 React-Navigation-5
我会接受任何向我展示一段代码如何实现它的答案。
我的代码如下所示:
App.js:
export default function App() {
return (
<NavigationContainer>
<Tab.Navigator>
<Tab.Screen name="Tab1" component={Stack1} />
<Tab.Screen name="Tab2" component={Stack2} />
<Tab.Screen name="Tab3" component={Stack3} />
</Tab.Navigator>
</NavigationContainer>
);
}
我的每个堆栈导航都是这样的:
function EventExploreStack({ navigation }) {
return (
<SettingsStack.Navigator initialRouteName="A">
<SettingsStack.Screen name="A" component={AScreen} />
<SettingsStack.Screen name="B" component={BScreen} />
<SettingsStack.Screen name="C" component={CScreen} />
<SettingsStack.Screen name="D" component={DScreen} />
<SettingsStack.Screen name="E" component={EScreen} />
</SettingsStack.Navigator>
);
}
export default EventExploreStack;
我正在使用 React Navigation 5。
一种选择是使用导航的重置操作。由于您在三个选项卡中有三个堆栈,因此您需要一个自定义的 tabbarbutton 来执行此操作,这将重置给定选项卡的状态。按钮的代码如下。
这里我使用了“主页”和“设置”作为选项卡,您必须根据需要更改它们。
const CustomButton = (props) => {
const navigation = useNavigation();
return (
<TouchableOpacity
{...props}
onPress={() => {
navigation.dispatch((state) => {
const newState = Object.assign(state);
const index = newState.routes.findIndex((x) => (x.name = 'Home'));
if (newState.routes[index].state) {
const { name, key } = newState.routes[index];
newState.routes[index] = { name, key };
}
return CommonActions.reset({
...newState,
});
});
navigation.navigate('Settings');
}}
/>
);
};
您可以将其放置在标签屏幕中,如下所示
<Tab.Screen
name="Settings"
component={SettingsScreen}
options={{
tabBarButton: (props) => <CustomButton {...props} />,
}}
/>
您可以在此处试用示例
https://snack.expo.io/@guruparan/bottomnavclick
希望这对您有所帮助:)
Take a look at the **createBottomTabNavigator** here https://reactnavigation.org/docs/bottom-tab-navigator/
例子
npm 安装@react-navigation/bottom-tabs
import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';
const Tab = createBottomTabNavigator();
function MyTabs() {
return (
<Tab.Navigator>
<Tab.Screen name="Home" component={HomeScreen} />
<Tab.Screen name="Settings" component={SettingsScreen} />
</Tab.Navigator>
);
}
创建一个助手来重置当前未选中的所有选项卡的堆栈,并将其传递给每个选项卡。
像这样:
助手:
import { StackActions } from '@react-navigation/native';
export const resetStacksOnTabClicks = ({ navigation }: any) => ({
tabPress: (e: any) => {
const state = navigation.dangerouslyGetState();
if (state) {
const nonTargetTabs = state.routes.filter((r: any) => r.key !== e.target);
nonTargetTabs.forEach((tab: any) => {
if (tab?.state?.key) {
navigation.dispatch({
...StackActions.popToTop(),
target: tab?.state?.key,
});
}
});
}
},
});
然后将该助手传递给 listeners
属性中的每个选项卡,如下所示:
<Tabs.Screen
name="TabName"
component={YourComponent}
listeners={resetStacksOnTabClicks}
/>
我有 3 个选项卡,每个选项卡后面都有一个堆栈导航。我总是想在单击另一个选项卡按钮时重置堆栈导航。
现在,当我像 A -> B -> C -> D 这样进入 Stack1 时 然后我切换到 Tab2,然后再切换回 Tab1,我又回到了屏幕 D。 我想再次看到屏幕 A。我使用 React-Navigation-5
我会接受任何向我展示一段代码如何实现它的答案。
我的代码如下所示:
App.js:
export default function App() {
return (
<NavigationContainer>
<Tab.Navigator>
<Tab.Screen name="Tab1" component={Stack1} />
<Tab.Screen name="Tab2" component={Stack2} />
<Tab.Screen name="Tab3" component={Stack3} />
</Tab.Navigator>
</NavigationContainer>
);
}
我的每个堆栈导航都是这样的:
function EventExploreStack({ navigation }) {
return (
<SettingsStack.Navigator initialRouteName="A">
<SettingsStack.Screen name="A" component={AScreen} />
<SettingsStack.Screen name="B" component={BScreen} />
<SettingsStack.Screen name="C" component={CScreen} />
<SettingsStack.Screen name="D" component={DScreen} />
<SettingsStack.Screen name="E" component={EScreen} />
</SettingsStack.Navigator>
);
}
export default EventExploreStack;
我正在使用 React Navigation 5。
一种选择是使用导航的重置操作。由于您在三个选项卡中有三个堆栈,因此您需要一个自定义的 tabbarbutton 来执行此操作,这将重置给定选项卡的状态。按钮的代码如下。
这里我使用了“主页”和“设置”作为选项卡,您必须根据需要更改它们。
const CustomButton = (props) => {
const navigation = useNavigation();
return (
<TouchableOpacity
{...props}
onPress={() => {
navigation.dispatch((state) => {
const newState = Object.assign(state);
const index = newState.routes.findIndex((x) => (x.name = 'Home'));
if (newState.routes[index].state) {
const { name, key } = newState.routes[index];
newState.routes[index] = { name, key };
}
return CommonActions.reset({
...newState,
});
});
navigation.navigate('Settings');
}}
/>
);
};
您可以将其放置在标签屏幕中,如下所示
<Tab.Screen
name="Settings"
component={SettingsScreen}
options={{
tabBarButton: (props) => <CustomButton {...props} />,
}}
/>
您可以在此处试用示例 https://snack.expo.io/@guruparan/bottomnavclick
希望这对您有所帮助:)
Take a look at the **createBottomTabNavigator** here https://reactnavigation.org/docs/bottom-tab-navigator/
例子
npm 安装@react-navigation/bottom-tabs
import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';
const Tab = createBottomTabNavigator();
function MyTabs() {
return (
<Tab.Navigator>
<Tab.Screen name="Home" component={HomeScreen} />
<Tab.Screen name="Settings" component={SettingsScreen} />
</Tab.Navigator>
);
}
创建一个助手来重置当前未选中的所有选项卡的堆栈,并将其传递给每个选项卡。
像这样:
助手:
import { StackActions } from '@react-navigation/native';
export const resetStacksOnTabClicks = ({ navigation }: any) => ({
tabPress: (e: any) => {
const state = navigation.dangerouslyGetState();
if (state) {
const nonTargetTabs = state.routes.filter((r: any) => r.key !== e.target);
nonTargetTabs.forEach((tab: any) => {
if (tab?.state?.key) {
navigation.dispatch({
...StackActions.popToTop(),
target: tab?.state?.key,
});
}
});
}
},
});
然后将该助手传递给 listeners
属性中的每个选项卡,如下所示:
<Tabs.Screen
name="TabName"
component={YourComponent}
listeners={resetStacksOnTabClicks}
/>