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

ReactJS:如何用API数据填充下拉框并解决空选项与NaN问题

解决React下拉框空选项与NaN汇率问题

看起来你已经成功拿到了API数据(控制台能打印出货币代码就说明这步没问题👍),问题出在下拉选项的渲染逻辑和汇率计算的取值上,咱们一步步来修复:

1. 修复下拉选项的渲染

你提到下拉框填充了但选项为空,大概率是渲染<option>时没正确设置显示文本和value属性。假设你的JSX里有类似这样的下拉框,按下面的方式调整:

<select 
  value={this.state.convertTo} 
  onChange={e => this.setState({ convertTo: e.target.value })}
>
  {this.state.currencies.map(currency => (
    // 必须设置key、value和显示文本
    <option key={currency} value={currency}>
      {currency}
    </option>
  ))}
</select>

关键点:

  • 每个<option>要加key(React列表渲染的强制要求)
  • value属性绑定货币代码,确保选中后convertTo能拿到正确值
  • <option>内部要写{currency}作为显示文本,否则选项会是空的

另外,API返回的rates里不包含基准货币(比如你的默认USD),可以把它也加到货币列表里:

// 在setState时补充基准货币
this.setState({ currencies: [data.base, ...Object.keys(data.rates)] });

2. 修复汇率计算的NaN问题

选择后显示NaN,说明你计算汇率时没正确获取到对应汇率值。建议把完整的rates数据也存在state里,而不只是货币代码:

state = {
  currencies: [],
  base: "USD",
  amount: "",
  convertTo: "EUR",
  result: "",
  rates: {} // 新增存储汇率的字段
};

componentDidMount() {
  fetch("https://api.exchangeratesapi.io/latest")
    .then(response => response.json())
    .then(data => {
      // 同时存储汇率和货币列表
      this.setState({
        rates: data.rates,
        currencies: [data.base, ...Object.keys(data.rates)]
      });
    })
    .catch(error => console.log(error));
}

然后写一个专门的计算方法,在金额或目标货币变化时触发:

calculateResult = () => {
  const { amount, base, convertTo, rates } = this.state;
  const numAmount = parseFloat(amount);

  // 处理无效输入或基准货币转自身的情况
  if (isNaN(numAmount)) {
    this.setState({ result: "" });
    return;
  }
  if (base === convertTo) {
    this.setState({ result: numAmount.toFixed(2) });
    return;
  }

  // 从rates中获取对应货币的汇率并计算
  const rate = rates[convertTo];
  if (rate) {
    const result = (numAmount * rate).toFixed(2);
    this.setState({ result });
  } else {
    this.setState({ result: "" });
  }
};

最后在输入框和下拉框的onChange里调用这个方法:

<input
  type="number"
  value={this.state.amount}
  onChange={e => {
    this.setState({ amount: e.target.value }, this.calculateResult);
  }}
/>

<select
  value={this.state.convertTo}
  onChange={e => {
    this.setState({ convertTo: e.target.value }, this.calculateResult);
  }}
>
  {/* 选项渲染代码同上 */}
</select>

3. 额外优化:初始化默认结果

可以在componentDidMount的setState回调里调用calculateResult,让页面加载时就显示默认的USD转EUR结果:

this.setState(
  {
    rates: data.rates,
    currencies: [data.base, ...Object.keys(data.rates)]
  },
  this.calculateResult // 组件更新后自动计算初始结果
);

这样调整后,下拉框应该能正常显示货币代码,选择后也能算出正确的汇率结果啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:49:34