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

useEffect传数据给react-select下拉选项正常显示但默认值不生效问题

问题根因
  • react-select的defaultValue属于非受控属性,仅在组件首次挂载渲染时生效:首次渲染时接口请求尚未返回,此时传入的defaultValue是初始值'initial'字符串,和后续接口返回的{label: 文本, value: 值}格式的选项结构完全不匹配,后续更新dropDownValue也不会触发defaultValue重新生效。
  • 初始dropDownValue的类型和react-select要求的选项格式不一致,也是默认值不生效的直接原因。
解决方案

提供两种可直接落地的修改方式:

方式1:使用受控模式(推荐,后续扩展选中逻辑更方便)

将Select改为受控组件,用value属性替代defaultValue,同时补充onChange回调处理值变更,修改后完整代码如下:

import React, { useEffect, useState } from "react";
import Select from 'react-select';

function BiteroInfoPage() {
  const [dropDownOptions, setDropDownOptions] = useState([]);
  // 初始值改为null,和后续返回的选项格式匹配
  const [dropDownValue, setDropDownValue] = useState(null);

  useEffect(() => {
    fetch("/list_initialized")
      .then((response) => response.json())
      .then(({list_helado}) => {
        const dropDownOptions = list_helado.map(x => ({
          label: x.studyName,
          value: x.studyName
        }));
        setDropDownOptions(dropDownOptions);
        setDropDownValue(dropDownOptions.at(-1));
      });
  }, []);

  // 补充选中变更回调
  const handleDropDown = (newValue) => {
    setDropDownValue(newValue);
  }

  return (
    <div>
      <Select
        value={dropDownValue}
        options={dropDownOptions}
        onChange={handleDropDown}
      />
    </div>
  );
};

export default BiteroInfoPage;

方式2:延迟渲染Select组件

等接口返回选项数据后再渲染Select,保证defaultValue在首次渲染时就是正确的最后一项值,仅需修改return部分代码即可:

return (
  <div>
    {dropDownOptions.length > 0 && (
      <Select
        defaultValue={dropDownValue}
        options={dropDownOptions}
      />
    )}
  </div>
);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 18:57:03