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

React Native中如何用TouchableOpacity实现卡片导航并传参?

解决React Native导航中"can't find variable navigate"错误并传递参数

嘿,这个问题我之前也碰到过,很容易解决!先给你拆解一下问题,再一步步改代码:

为什么会出现"can't find variable navigate"?

你的HomeScreen组件里直接用了navigate,但它根本不知道navigate是什么——因为你没有拿到React Navigation提供的navigation对象。这个对象是导航栈里的组件才会默认拥有的,或者需要通过钩子/ props传递进来。

解决方案:获取navigation并传递cat_id参数

我给你两种常用的解决方式,选哪种都可以:

方式1:从props接收navigation(适合列表项组件)

如果你的HomeScreen是作为列表项被父组件渲染的,那需要把父组件的navigation通过props传进来,然后在HomeScreen里使用:

修改HomeScreen组件:

const HomeScreen = ({course, navigation}) =>{ // 这里新增navigation参数
  const {name,featured_image,cat_id} = course;
  return(
    // 这里改成navigation.navigate,同时把cat_id作为参数传过去
    <TouchableOpacity onPress={() => navigation.navigate("CourseDetail", { cat_id })}>
      <Card>
        <CardSection>
          <View style={styles.thumbnailContainerStyle}>
            {course.term_id == '28' ? (<View></View>) : (
              <Text style={styles.userStyle}>{name} </Text>
            )}
          </View>
        </CardSection>
      </Card>
    </TouchableOpacity>
  );
};

然后在渲染HomeScreen的父组件里,记得把navigation传下去(比如父组件是导航栈里的屏幕):

// 假设父组件是这样的
const ParentScreen = ({ navigation }) => {
  return (
    <FlatList
      data={yourCourseListData}
      renderItem={({ item }) => <HomeScreen course={item} navigation={navigation} />}
    />
  );
};

方式2:使用useNavigation钩子(React Navigation 5+推荐)

如果你的项目用的是React Navigation 5及以上版本,可以直接用useNavigation钩子来获取导航对象,不用手动传props:

首先导入钩子:

import { useNavigation } from '@react-navigation/native';

然后修改HomeScreen:

const HomeScreen = ({course}) =>{
  const navigation = useNavigation(); // 获取navigation对象
  const {name,featured_image,cat_id} = course;
  return(
    <TouchableOpacity onPress={() => navigation.navigate("CourseDetail", { cat_id })}>
      {/* 原有代码不变 */}
    </TouchableOpacity>
  );
};

在CourseDetail页面接收cat_id参数

跳转过去之后,你需要在CourseDetail页面拿到这个cat_id,同样分两种情况:

函数组件用useRoute钩子

import { useRoute } from '@react-navigation/native';

const CourseDetail = () => {
  const route = useRoute();
  const { cat_id } = route.params; // 取出传递的cat_id

  return (
    <View>
      <Text>当前课程分类ID:{cat_id}</Text>
      {/* 其他页面内容 */}
    </View>
  );
};

Class组件从props获取

如果是Class组件,直接从this.props.route.params里拿:

class CourseDetail extends React.Component {
  render() {
    const { cat_id } = this.props.route.params;
    return (
      <View>
        <Text>当前课程分类ID:{cat_id}</Text>
      </View>
    );
  }
}

最后再确认一下你的StackNavigator配置,确保CourseDetail已经正确注册进去了,就像你写的那样:

const ScheduledApp = StackNavigator({
  CourseDetail:{ screen: CourseDetail }
});

这样改完之后,点击卡片就能正常跳转到详情页,同时也能拿到cat_id参数啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:58:17