Недавно я начал использовать React Native 0.61.5
и навигацию React 5.x
. Теперь мне нужно передать родительскую функцию на дочерний экран. Например, я хочу изменить значок панели навигации, нажав кнопку на вкладке TabNavigator, вложенной в StackNavigator. Ранее (навигационная версия 3.x) я использовал getActiveChildNavigationOptions
для своих нужд, но теперь он удален. Поэтому единственный способ достичь этой цели - передать пользовательские функции дочерним компонентам.
Вот пример кода, который я хочу изменить с XXXXXXXX
на YYYYYYYYY
:
const TabA = ({ route }) => (
<View>
<Text>Tab A</Text>
<Button
title="Change header"
onPress={() => route.params.setHeaderRightName("YYYYYYYYY")}/>
</View>
)
const TabB = () => <><Text>Tab B</Text></>
const Tabs = createBottomTabNavigator();
const TabsNavigator = ({ navigation }) => {
const [headerRightName, setHeaderRightName] = useState("XXXXXXXX");
useLayoutEffect(() => navigation.setOptions({
headerRight: () => <MyNavIcon name={headerRightName}/>
}), [headerRightName]);
return (
<Tabs.Navigator>
<Tabs.Screen name="tab-a" component={TabA} initialParams={{ setHeaderRightName }} />
<Tabs.Screen name="tab-b" component={TabB} />
</Tabs.Navigator>
);
}
const Stack = createStackNavigator();
export default App = () => (
<NavigationContainer>
<Stack.Navigator>
<Stack.Screen name="tabs" component={TabsNavigator} />
<Stack.Screen name="another-screen" component={AnotherScreen} />
</Stack.Navigator>
</NavigationContainer>
)
Все работает нормально, но я получаю это предупреждение:
Полный текст:
Non-serializable values were found in the navigation state, which can break usage such as persisting and restoring state. This might happen if you passed non-serializable values such as function, class instances etc. in params. If you need to use components with callbacks in your options, you can use 'navigation.setOptions' instead. See https://reactnavigation.org/docs/troubleshooting#i-get-the-warning-non-serializable-values-were-found-in-the-navigation-state for more details.
Так как можно Я передаю функцию от родителя к потомку, если в предупреждении говорится, что я не могу передать функцию с помощью параметров маршрута?