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
相关产品推荐
相关产品推荐

