使用 react-select 在 ajax 调用后显示 defaultValue

Display defaultValue after ajax call using react-select

我正在使用 react-select 包,在使用 Ajax 调用加载列表后,默认情况下我无法 select 一个值,这是我的整个组件:

import React, { useEffect, useState } from "react";
import axios from "../../custom/api/axios";
import Select from "react-select";

const UserForm = () => {
  const [managerList, setManagerList] = useState([]);
  const [formattedManagersList, setFormattedManagersList] = useState([]);
  const [selectIsLoading, setSelectIsLoading] = useState(true);
  const [selectedManager, setSelectedManager] = useState(null);

  useEffect(() => {
    getManagers();
    // data loaded:
    // [
    //   { id: 1, displayName: "Test 1" },
    //   { id: 2, displayName: "Test 2" },
    //   { id: 3, displayName: "Test 3" },
    // ];
  }, []);

  const getManagers = async () => {
    setSelectIsLoading(true);
    try {
      const response = await axios.get(
        `${process.env.REACT_APP_API_URL}/managers`
      );
      const formattedList = response.data.data.map((item) => ({
        value: item.id,
        label: item.displayName,
      }));
      setManagerList(response.data.data);
      setFormattedManagersList(formattedList);
      setSelectedManager({ value: 3, label: "Test 3" });
    } catch (err) {
      console.log(err);
    }
    setSelectIsLoading(false);
  };

  return (
    <Select
      options={formattedManagersList}
      isLoading={selectIsLoading}
      placeholder="Select a Manager..."
      onChange={(item) => {
        setSelectedManager(managerList.find((m) => m.id === item.value));
      }}
      selectedValue={selectedManager}
    />
  );
};

export default UserForm;

我正在尝试在组件加载后手动 select a manager,方法是使用 setSelectedManager({ value: 3, label: "Manager Test" }); 将其添加到状态,然后使用 react-select selectedValue 属性 selectedValue={selectedManager},但没有任何显示。

选项 { value: 3, label: "Test 3" } 确实存在于 formattedManagersList 中,但在加载列表后默认不显示和 selected。

当我使用 value 而不是 selectedValue value={selectedManager} 时,该选项显示在 select 中,但是当我单击并更改 selection 时,没有任何显示作为 selected.

我已经创建 stackblitz link 并解决了您的问题。 我已经删除了 axios 而不是使用 delay 函数来模拟您的请求需要时间。我处理了加载时间,最后,我同时使用了 value 和 defaultValue 属性。

希望您觉得它有用。 link to stackblitz example of your issue response.