最近我开始使用React Native 0.61.5和React navigation 5.x.现在我需要将父函数传递到子屏幕.例如,我想通过按StackNavigator中嵌套的TabNavigator选项卡中的按钮来更改导航栏图标.以前(navigation ver.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>
)

一切正常,但我收到了以下警告:

enter image description here

全文:

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.

So how can I pass function from parent to child if warning says I cannot pass function using route params?

推荐答案

警告中的链接指向的文档页面显示:

如果不使用状态持久性或指向接受params中函数的屏幕的深度链接,则可以忽略警告.要忽略它,可以使用YellowBox.忽视警告.

So, in my case, I can ignore this warning and pass functions thought route params safely.

YellowBox.ignoreWarnings([
  'Non-serializable values were found in the navigation state',
]);

或对于0.63或更高版本:

LogBox.ignoreLogs([
  'Non-serializable values were found in the navigation state',
]);

React-native相关问答推荐

ITMS—91053:缺少API声明—ReactNative

React Native 无法下载模板

应用程序主体尚未注册

如何在react-native 中从 FlatList 中删除元素/索引?

Eslint 错误,configuration for rule "import/no-cycle" is invalid

Invariant Violation:Chrome 不支持在本机模块上调用同步方法

我如何知道我的代码是否作为 React Native 运行

纯在 Swift 中的 React Native 应用程序

react-native 从右到左

通过带有对象子对象的数组react native 映射 - 与react网络中的工作方式不同?

React Native - NSNumber 无法转换为 NSString

如何从 React Native-App 中的 res/drawable-folder 加载图像?

为什么 Android Studio 强制使用 Android 支持库中的 Androidx?

React Native ScrollView 在snapping后重新回到顶部

Android 构建错误AndroidManifest.xml requires a placeholder substitution

React Native Bullet Character? or Unicode?

如何更改键盘上的 return按钮?

试图在一个本应是不可变且已被冻结的对象上设置密钥

如何从 react-native-fbsdk 获取用户信息(邮箱、姓名等)?

在 react-native 中使用捏拉zoom 的可滚动图像