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

如何在React中将API返回的JSON数据渲染为可响应下拉列表

没问题,我帮你梳理下实现这个可响应下拉列表的具体步骤,结合React的状态管理和事件处理就能轻松搞定需求:

核心思路

我们要把API返回的JSON数据映射为下拉选项,让选项显示name字段,选中时获取对应的id作为标识,同时保证组件是受控组件(状态与UI同步)。

第一步:先明确数据格式(假设你的JSON结构如下)

先模拟符合你需求的API返回数据,方便后续示例:

[
  { "id": 1, "name": "前端开发" },
  { "id": 2, "name": "后端开发" },
  { "id": 3, "name": "产品设计" }
]

第二步:实现组件逻辑(函数组件版本,最常用)

下面是完整的可复用DropDown组件示例,包含数据请求、状态管理、事件处理:

import { useState, useEffect } from 'react';

const DropDown = ({ onSelect }) => {
  // 管理选中项的id
  const [selectedId, setSelectedId] = useState('');
  // 存储API获取的选项数据
  const [options, setOptions] = useState([]);
  // 加载状态,提升用户体验
  const [isLoading, setIsLoading] = useState(true);

  // 从API拉取数据
  useEffect(() => {
    const fetchOptions = async () => {
      try {
        const res = await fetch('你的API接口地址');
        const data = await res.json();
        setOptions(data);
      } catch (err) {
        console.error('加载选项失败:', err);
      } finally {
        setIsLoading(false);
      }
    };

    fetchOptions();
  }, []);

  // 处理下拉选择事件
  const handleChange = (e) => {
    const id = e.target.value;
    setSelectedId(id);
    // 如果需要把选中的id传递给父组件,调用传入的回调
    if (onSelect) {
      onSelect(id);
    }
    // 这里可以添加你自己的业务逻辑,比如根据id请求详情等
    console.log('当前选中的id:', id);
  };

  // 加载中状态
  if (isLoading) {
    return (
      <select disabled>
        <option>加载中...</option>
      </select>
    );
  }

  return (
    <select value={selectedId} onChange={handleChange}>
      {/* 默认占位选项 */}
      <option value="" disabled>请选择选项</option>
      {/* 遍历渲染所有选项 */}
      {options.map(item => (
        <option key={item.id} value={item.id}>
          {item.name}
        </option>
      ))}
    </select>
  );
};

export default DropDown;

关键细节说明

  • 受控组件:通过value={selectedId}绑定选中状态,确保UI始终和组件状态一致
  • 选项映射:用map遍历数据,每个option的key必须是唯一值(这里用item.id),value设为item.id,显示文本用item.name
  • 事件处理:handleChange中通过e.target.value直接拿到选中的id,既可以更新本地状态,也能通过onSelect回调把id传递给父组件
  • 加载状态:数据未返回时禁用下拉并显示提示,避免用户看到空下拉

如果你用类组件的话(补充方案)

如果你的项目还在用类组件,核心逻辑类似,只是状态管理换成this.state:

import React, { Component } from 'react';

class DropDown extends Component {
  state = {
    selectedId: '',
    options: [],
    isLoading: true
  };

  componentDidMount() {
    this.fetchOptions();
  }

  fetchOptions = async () => {
    try {
      const res = await fetch('你的API接口地址');
      const data = await res.json();
      this.setState({ options: data });
    } catch (err) {
      console.error('加载选项失败:', err);
    } finally {
      this.setState({ isLoading: false });
    }
  };

  handleChange = (e) => {
    const id = e.target.value;
    this.setState({ selectedId: id });
    if (this.props.onSelect) {
      this.props.onSelect(id);
    }
  };

  render() {
    const { selectedId, options, isLoading } = this.state;
    if (isLoading) {
      return (
        <select disabled>
          <option>加载中...</option>
        </select>
      );
    }
    return (
      <select value={selectedId} onChange={this.handleChange}>
        <option value="" disabled>请选择选项</option>
        {options.map(item => (
          <option key={item.id} value={item.id}>
            {item.name}
          </option>
        ))}
      </select>
    );
  }
}

export default DropDown;

这样就能完美实现你要的需求:下拉显示name,选中时获取id,并且组件是可响应的~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:45:37