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

React Navigation传参时dataForCategoryPage未定义问题求助

问题原因及解决方法

1. 先修复navigation.navigate的参数传递错误

navigation.navigate的第二个参数必须是单个对象,你现在传了多个独立对象,导致只有第一个{item}会被当作有效参数,dataForCategoryPage和isLoadingCategory都被忽略了,这是参数接收为undefined的直接原因。

错误写法:

navigation.navigate('CategoryRes',{item},{dataForCategoryPage},{isLoadingCategory})

正确的参数传递方式:

// 把所有要传递的参数合并到一个对象里
navigation.navigate('CategoryRes', {
  item,
  dataForCategoryPage,
  isLoadingCategory
})

2. 解决React状态异步更新的问题

setDataForCategoryPage是异步执行的,调用后不会立刻更新状态值,所以你在调用navigate时,传递的dataForCategoryPage还是旧的初始值(大概率是undefined)。

最简洁的优化:直接传递目标数据,不用中转state

既然你是根据item.category确定要传的数据,完全可以直接把对应的数据变量(catBurger/catPizza等)直接传给目标页面,跳过state中转,既避免异步问题,又简化代码:

修改后的categoryHandler函数:

const categoryHandler = (item) => {
  let targetData;
  if(item.category === 'Burger'){
    targetData = catBurger;
  } else if(item.category === 'Pizza'){
    targetData = catPizza;
  } else if(item.category === 'Sushi'){
    targetData = catSushi;
  } else {
    targetData = catMiddleEast;
  }

  // 直接传递targetData,不用经过state
  navigation.navigate('CategoryRes', {
    item,
    dataForCategoryPage: targetData,
    isLoadingCategory
  })
}

如果确实需要保留dataForCategoryPage这个state(比如其他组件或逻辑要用到),可以用useEffect监听状态变化,等状态更新完成后再跳转:

import { useEffect, useState } from 'react';

// 新增状态标记跳转需求
const [needNavigate, setNeedNavigate] = useState(false);
const [currentItem, setCurrentItem] = useState(null);
const [currentLoadingState, setCurrentLoadingState] = useState(false);

const categoryHandler = (item) => {
  let targetData;
  if(item.category === 'Burger'){
    targetData = catBurger;
  } else if(item.category === 'Pizza'){
    targetData = catPizza;
  } else if(item.category === 'Sushi'){
    targetData = catSushi;
  } else {
    targetData = catMiddleEast;
  }

  // 更新状态,标记需要跳转
  setDataForCategoryPage(targetData);
  setCurrentItem(item);
  setCurrentLoadingState(isLoadingCategory);
  setNeedNavigate(true);
}

// 监听跳转标记,状态更新后执行跳转
useEffect(() => {
  if(needNavigate){
    navigation.navigate('CategoryRes', {
      item: currentItem,
      dataForCategoryPage: dataForCategoryPage,
      isLoadingCategory: currentLoadingState
    });
    setNeedNavigate(false); // 重置标记,避免重复跳转
  }
}, [needNavigate, dataForCategoryPage, currentItem, currentLoadingState, navigation]);

3. 目标页面接收逻辑无需修改

const CategoryRes = ({navigation, route}) => {
  const [data, setData] = useState([]);
  const {item, isLoadingCategory, dataForCategoryPage} = route.params;
  
  // 可选:把传递过来的数据赋值给本地state
  useEffect(() => {
    setData(dataForCategoryPage);
  }, [dataForCategoryPage]);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 03:10:25