You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native组件同时使用Props和Navigation的报错解决

问题根源
  • 组件参数解构写法错误:组件接收的所有入参都存放在同一个顶层props对象上,写法{ navigation, props }相当于试图从顶层props中解构出一个名为props的子属性,但调用组件时只传了title属性,根本不存在这个嵌套的props字段,自然会报props.title为undefined的错误。
  • 普通子组件不会自动注入navigation:只有被React Navigation直接注册为路由页面的组件(即写在<Stack.Screen>/<Tab.Screen>等配置项里的组件),才会自动收到导航传入的navigation prop。手动在业务页引入、渲染的Foobar组件属于普通嵌套子组件,不会自动拿到props上的navigation对象。
解决方案

最通用、无需额外传参的方案是使用React Navigation提供的useNavigation Hook获取导航对象,自定义props可以正常读取/解构,不受影响:

  • 先在组件文件顶部导入Hook:
import { useNavigation } from '@react-navigation/native';
  • 修正后的组件代码:
const Foobar = (props) => {
  const navigation = useNavigation();
  return (
    <Container>
      <TitleBar onPress={() => navigation.navigate("Home")}>
        <Title>{props.title}</Title>
      </TitleBar>
    </Container>
  );
};
export default Foobar;

如果偏好解构写法,可以直接把自定义属性解出来,代码更简洁:

const Foobar = ({ title }) => {
  const navigation = useNavigation();
  return (
    <Container>
      <TitleBar onPress={() => navigation.navigate("Home")}>
        <Title>{title}</Title>
      </TitleBar>
    </Container>
  );
};
export default Foobar;
特殊场景说明

如果Foobar不是手动渲染的子组件,而是直接注册在导航栈中的页面,不需要使用Hook,直接把自定义属性和navigation并列解构即可,不要额外嵌套一层props:

// 仅适用于Foobar被直接注册为路由页面的场景
const Foobar = ({ navigation, title }) => (
  <Container>
    <TitleBar onPress={() => navigation.navigate("Home")}>
      <Title>{title}</Title>
    </TitleBar>
  </Container>
);
export default Foobar;

内容的提问来源于stack exchange,提问作者user1469734

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 08:51:59