我有一个ReactTS-App,我通过Router-Dom-Props将一个props 传递给另一个组件.这里的问题是,我可以单独使用meal.name,但如果我使用meal.Food搭配它或单独使用meal,它就不再起作用了.

Uncaught TypeError: meal.food is undefined

我判断了打字脚本和使用效果错误,但我还没有找到解决方案.

props 在第一次渲染之前加载了吗?

UPDATE当我像那样使用meal.Food时,我可以打印它,但在我设置了它之后,我不能在useState中使用它-我是控制台.将它记录在useEffect中.

Meal.tsx

  return (
    <Link className="Meal Link" to={`/MealDetails/${meal.id}`} state={{ meal: meal }}>
      <div className="MealIconMealName">
        <div className="MealName">{meal.name}</div>
      </div>
    </Link>
  );
};

MealDetails.tsx

const MealDetails = () => {
  const location = useLocation();
  const navigate = useNavigate();
  
  const [meal, setMeal] = useState(Object);

  useEffect(() => {
    if (location.state) {
      if (location.state.meal) {
        setMeal(location.state.meal);
        console.log("useEffect" + meal);
      }
    }
    return () => {};
  }, [location]);

  return (
    <div className="MealDetails">
      <header>
        <div className="HeaderText">{meal.name}</div>
      </header>
      <div className="MealDetailsCalorieCounter"></div>
      {meal.food.map((meal : any) => (
        <Food
          key={meal.id}
        />
      ))}
    </div>
  );
};

示例Meal-.json文件中的对象

    { 
      "id": 1,
      "name": "Breakfast",
      "food": [
        {
            "name": "Waffeln",
            "kcal" : 505
        }
      ],
      "calories": 505
    }

推荐答案

Issue

这里的问题是,在useEffect挂钩根据路由状态(即,从location.state)更新本地组件状态之前,在初始呈现上似乎没有定义meal.food.

Solution

它被认为是将传递的数据和/或派生的"状态"存储在本地组件状态中的react 反模式.直接消费传递的location.state.meal路由状态即可.您还应该使用防御性编程模式,以防用户从其他任何地方other than导航到路由呈现MealDetails,该链接通过路由状态.

示例:

const MealDetails = () => {
  const { state } = useLocation(); // <-- access state
  const navigate = useNavigate();
  
  const meal = state || {}; // <-- provide fallback value

  return (
    <div className="MealDetails">
      <header>
        <div className="HeaderText">{meal.name}</div>
      </header>
      <div className="MealDetailsCalorieCounter"></div>
      {(meal.food }} []).map((meal: any) => ( // <-- provide fallback array
        <Food key={meal.id} />
      ))}
    </div>
  );
};

Typescript相关问答推荐

在Typescribe中,extends工作,但当指定派生给super时出错""

为什么TypeScript失go 了类型推断,默认为any?''

将对象属性转换为InstanceType或原样的强类型方法

我可以使用TypeScrip从字符串词典/记录中填充强类型的环境对象吗?

等待用户在Angular 函数中输入

已解决:如何使用值类型限制泛型键?

为什么我的动画状态在组件实例之间共享?

为什么Typescript只在调用方提供显式泛型类型参数时推断此函数的返回类型?

有没有可能创建一种类型,强制在TypeScrip中返回`tyPeof`语句?

如果判断空值,则基本类型Gaurd不起作用

如何从接口中省略接口

为什么我的函数arg得到类型为Never?

如何在try 运行独立的文字脚本Angular 项目时修复Visual Studio中的MODULE_NOT_FOUND

字符串文字联合的分布式条件类型

为什么类型脚本使用接口来声明函数?他的目的是什么.

通过函数传递确切的类型,但验证额外的字段

React-跨组件共享功能的最佳实践

Svelte+EsBuild+Deno-未捕获类型错误:无法读取未定义的属性(读取';$$';)

我可以在 Typescript 中重用函数声明吗?

req.files = 未定义(Multer、Express、Typescript)