【发布时间】:2021-05-15 21:55:30
【问题描述】:
我的功能组件如下:
const Scratch = () => {
const [isLoaded, setIsLoaded] = useState(false);
const colorSelectItems=[];
const [selectedColor, setSelectedColor] = useState("fffff");
useEffect(() => {
fetch(
`http://localhost:8765/fetchData?userId=1`
)
.then((response) => response.json())
.then((data) => {
createDropDown(data));
setIsLoaded(true);
});
}, []);
const createDropDown= (data) => {
data.map((color) => {
colorSelectItems.push({
label: color.colorName,
value: color.hexValue,
});
});
return (
<div className="commonMargin">
{!isLoaded&& <p>Loading..</p>}
{isLoaded&& (
<Dropdown
value={selectedColor}
optionLabel="label"
options={colorSelectItems}
onChange={(e) => setSelectedColor(e.target.value);}
/>
)}
</div>
);
};
export default Scratch;
问题是,它一直显示 Loading... 直到 API 调用完成,然后才呈现 DropDown。但是API调用完成后,DropDown还是空的!
我在这里错过了什么?
PS:如果我将从 API 获取数据替换为从本地 json 文件获取数据,则此 DropDown 可以完美运行
【问题讨论】:
-
您需要设置状态才能重新渲染组件。
-
@YashJoshi 我为 colorSelectItems 尝试了
useState([])。但它将bound dispatchAction渲染为选择项之一 -
您能否创建一个 CodeSandbox 应用程序来复制问题。只需转到react.new 来创建问题。
标签: reactjs fetch jsx use-effect primereact