您可以删除第二个
useEffect
这是不需要的。
useEffect(() => {
if (!open) {
setOptions([]);
}
}, [open]);
添加一个状态,显示何时加载(当API调用正在进行时),而不是当长度为
0
const [loading, setLoading] = useState(false);
// const loading = open && options.length === 0;
LIVE DEMO
export default function App() {
const [options, setOptions] = useState<Option[]>([]);
const [selected, setSelected] = useState<Option | null>(null);
const [open, setOpen] = useState<boolean>(false);
const [loading, setLoading] = useState(false);
// const loading = open && options.length === 0;
const fetchOptions = async (value: string) => {
try {
setLoading(true); // CHANGE
const response: Response = await fetch(
`https://dummyjson.com/products/search?q=${value}&limit=10`
);
const { products } = await response.json();
const formattedOptions = products.map(({ title, id }) => {
return { label: title, value: id };
});
console.log(formattedOptions);
setOptions(formattedOptions);
} catch (error) {
console.error(error);
} finally {
setLoading(false); // CHANGE
}
};
useEffect(() => {
fetchOptions("");
}, []);
// useEffect(() => {
// if (!open) {
// setOptions([]);
// }
// }, [open]);
return (
<Auto
selected={selected}
setSelected={setSelected}
options={options}
open={open}
loading={loading}
onOpen={() => setOpen(true)}
onClose={() => setOpen(false)}
fetchServerSideOptions={(value) => fetchOptions(value)}
/>
);
}