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

React无需react-select,页面加载时用API数据填充下拉框

问题描述

页面加载时通过API调用获取数据,填充原生React的select下拉框选项,目前下拉框为空无法填充。不使用react-select包,需将数据库中的_id作为选项值、batchName作为选项文本。

代码问题分析

你的代码存在几个关键错误导致下拉框无法填充:

  1. 异步逻辑顺序错误:fetch是异步操作,你在then外部处理data并设置options,此时data还没被API返回的结果更新,仍是初始空值。
  2. 数据库字段匹配错误:数据库中的ID字段是_id.$oid,但你代码里用了value.id,无法正确获取ID值。
  3. 数组嵌套错误:setOptions([results])把results数组又包了一层,导致options变成二维数组,后续map遍历会出错。
  4. 选项渲染不完整:渲染部分缺少<option>标签,无法生成有效的下拉选项。
修复后的完整代码

1. 修正后的useEffect代码

useEffect(() => {
  fetch("http://localhost:4000/add-batch")
    .then(response => response.json())
    .then((res) => {
      const { data } = res;
      // 处理数据,将_id作为选项值,batchName作为显示文本
      const results = data.map((value) => ({
        key: value._id.$oid, // 若后端返回的_id是字符串,直接用value._id即可
        value: value.batchName
      }));
      setOptions(results); // 直接传入处理后的数组,不要嵌套
    })
    .catch(err => console.error("API请求失败:", err));
}, []);

2. 修正后的select渲染代码

<select>
  {/* 默认提示选项 */}
  <option value="" disabled selected>请选择批次</option>
  {/* 遍历options生成下拉选项 */}
  {options && options.map((option) => (
    <option key={option.key} value={option.key}>
      {option.value}
    </option>
  ))}
</select>
说明
  • 如果你的后端接口返回的_id已经是字符串格式(比如Mongoose自动转换后的),直接用value._id替换value._id.$oid即可。
  • 增加了catch捕获API请求错误,方便排查问题。
  • 增加了默认的禁用选项,提升用户体验。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 22:05:59