Если я правильно понимаю вашу проблему, вы хотели изменить заголовок стека при изменении вкладки. В этом случае вы можете использовать React Context для управления им.
(я также помещаю этот код в Snack https://snack.expo.io/@gie3d / change-header-from-tab )
edit: 1, я разделил его на 3 файла и предполагаю, что все они находятся в одном каталоге.
HomeTitleContext. js
export const HomeTitleContext = React.createContext({
title: 'default title',
setTitle: () => {},
});
Приложение. js
import { HomeTitleContext } from './HomeTitleContext';
export default function App() {
const [title, setTitle] = useState('default title');
return (
<HomeTitleContext.Provider
value={{
title,
setTitle,
}}
>
<HomeTitleContext.Consumer>
{(ctx) => (
<NavigationContainer>
<Stack.Navigator>
<Stack.Screen
name="Tab"
component={TabNav}
options={{ title: ctx.title }} // The title will be dynamically changed here
/>
<Stack.Screen
name="Category"
component={OtherScreen}
></Stack.Screen>
<Stack.Screen
name="SpecialBeerScreen"
component={OtherScreen}
></Stack.Screen>
</Stack.Navigator>
</NavigationContainer>
)}
</HomeTitleContext.Consumer>
</HomeTitleContext.Provider>
);
}
В вашем компоненте, например: HomeScreen, вы настраиваете useFocusEffect и меняете заголовок из setTitle, который вы получите из контекста
Главный экран. js
import React, { useContext } from 'react';
import { useFocusEffect } from '@react-navigation/native';
import { View, Text } from 'react-native';
import { HomeTitleContext } from './HomeTitleContext';
const HomeScreen = ({ navigation }) => {
const { setTitle } = useContext(HomeTitleContext);
useFocusEffect(() => {
setTitle('this is home');
});
return (
<View>
<Text>Home</Text>
</View>
);
};