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

使用react-select AsyncSelect从API获取数据渲染下拉选项失败求助

React Select AsyncSelect 无法加载API数据问题解决

问题说明

使用react-select的AsyncSelect组件从API获取下拉选项数据,尝试将数据存入state后映射为选项格式,但无法显示汽车品牌及图片,出现错误。API返回格式如下:

[{"make":"KIA","link":"/images/image.jpg"},{"make":"BMW","link":"/images/image.jpg"}]

错误原因分析

  1. Fetch未解析JSON:调用fetch后未通过res.json()解析响应体,直接访问res.cars会导致错误。
  2. State赋值错误:API返回的是数组,无需提取make和link单独存入,直接将整个响应数组赋值给cars即可。
  3. AsyncSelect用法错误:AsyncSelect核心是通过loadOptions属性异步加载数据,而非直接传入options(普通Select的用法)。
  4. 函数未绑定this:类组件中handleChange未绑定this,导致setState无法正常调用。
  5. 拼写错误:cleareble应为clearable。
  6. Value属性错误:AsyncSelect的value应绑定选中的选项selectedOption,而非输入框值inputValue。

修正后的代码

import React, { Component } from 'react';
import AsyncSelect from 'react-select/async';
import './Search.css';

class Search extends Component {
  state = {
    selectedOption: null,
    clearable: false
  };

  // 异步加载选项的函数,AsyncSelect会自动调用
  loadOptions = () => {
    return fetch('你的API地址')
      .then(res => res.json()) // 解析JSON响应
      .then(data => {
        // 将API返回的数据映射为AsyncSelect需要的格式
        return data.map(car => ({
          value: car.make,
          label: car.make,
          image: car.link // 注意:如果是相对路径,需要拼接完整域名,比如`${window.location.origin}${car.link}`
        }));
      })
      .catch(err => {
        console.error('加载数据失败:', err);
        return [];
      });
  };

  handleChange = (selectedOption) => { // 用箭头函数自动绑定this
    this.setState({ selectedOption });
  };

  render() {
    return (
      <div>
        <AsyncSelect
          className='select-search'
          value={this.state.selectedOption}
          onChange={this.handleChange}
          clearable={this.state.clearable}
          loadOptions={this.loadOptions} // 传入异步加载函数
          formatOptionLabel={({ label, image }) => ( // 解构参数更清晰
            <div className="car-option">
              <img src={`${window.location.origin}${image}`} alt={label} />
              <span>{label}</span>
            </div>
          )}
        />
      </div>
    );
  }
}

export default Search;

额外说明

  • 如果API需要根据用户输入过滤数据,loadOptions可以接收inputValue参数,比如:
    loadOptions = (inputValue) => {
      return fetch(`你的API地址?keyword=${inputValue}`)
        .then(res => res.json())
        .then(data => data.map(...));
    };
    
  • 图片路径如果是相对路径,必须拼接完整域名,否则会以当前页面路径为基准导致图片加载失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 00:27:07