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

React列表首次选中不渲染、状态更新后才正常显示问题排查

如有需要,可前往Github查看项目的完整代码。

问题现象
现有实现逻辑

项目对接TheCocktailDB免费API拉取全量鸡尾酒数据,存入名为data的状态。用户点击选中某款饮品时,对应饮品数据存入drink状态,触发模态弹窗渲染,展示饮品的图片、配料、配方、制作步骤。

选中饮品触发的副作用逻辑写在useEffect中,依赖项为drink状态,触发时依次执行配料解析、用量解析两个函数:

useEffect(() => {
  getIngredients(drink);
  getMeasurements(drink); 
}, [drink]);

配料解析函数getIngredients

饮品对象包含strIngredient1到strIngredient15共15个配料字段,函数遍历所有字段,校验字段值为非空字符串后存入临时数组,最终同步到ingredients状态:

const getIngredients = (drink: IDrinkProps) => {
  /*
  逐个校验15个配料属性是否为非空字符串,符合条件的值推入filteredIngredients数组,最终在选中饮品的模态弹窗中展示
  */
  for (let i = 0; i <= 14; i++) {
    // 校验当前配料是否为字符串类型,不符合则输出控制台日志
    if (typeof drink[`strIngredient${i}`] !== "string") {
      console.log(typeof drink[`strIngredient${i}`], "Detected");
    // 校验当前配料是否为空字符串,符合则输出控制台日志
    } else if (drink[`strIngredient${i}`] === "") {
      console.log("Empty string detected");
    } else {
      // 校验通过的配料推入临时数组
      filteredIngredients.push(drink[`strIngredient${i}`]);
    }
    // 循环执行过程中同步配料状态到视图
    setIngredients(filteredIngredients);
  }
};

用量解析函数getMeasurements

逻辑与配料解析一致,遍历strMeasure1到strMeasure15共15个用量字段,校验通过后存入临时数组同步到measurements状态,执行完成后调用配方组合函数:

const getMeasurements = (drink: IDrinkProps) => {
  for (let i = 0; i <= 14; i++) {
    // 校验当前用量是否为字符串类型,不符合则输出控制台日志
    if (typeof drink[`strMeasure${i}`] !== "string") {
      console.log(typeof drink[`strMeasure${i}`], "Detected");
    // 校验当前用量是否为空字符串,符合则输出控制台日志
    } else if (drink[`strMeasure${i}`] === "") {
      console.log("Empty string detected");
    } else {
      // 校验通过的用量推入临时数组
      filteredMeasurements.push(drink[`strMeasure${i}`]);
    }
  }
  setMeasurements(filteredMeasurements);
  getExactRecipe(ingredients, measurements); 
};

配方组合函数getExactRecipe

将解析出的配料和对应位置的用量拼接为完整配方项,存入exactRecipe状态供弹窗渲染:

const getExactRecipe = (
  ingredients: (string | undefined)[],
  measurements: (string | undefined)[]
) => {
  let exactArray: string[] = [];
  if (ingredients.length > 0) {
    for (let i = 0; i < filteredIngredients.length; i++) {
      if (
        `${filteredIngredients[i]}` === "undefined" ||
        `${measurements[i]}` === "undefined"
      ) {
        // 无有效内容跳过处理
      } else {
        exactArray.push(`${filteredIngredients[i]} ${measurements[i]}`);
        setExactRecipe(exactArray);
      }
    }
  }
};

目前无法确定问题根因,不确定是useEffect执行逻辑、getExactRecipe函数实现,还是其他未覆盖到的代码点导致异常,求可行的排查思路。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 06:42:36