在第一次打开异步下拉菜单时加载选项

Load options on the first open of the Async drop down menu

当我向 Async 控件提供 loadOptions 时,它会在安装时加载选项。

如果我通过 autoload={false} 那么它既不会在装载时也不会在打开时加载选项。但它会在第一次关闭时加载选项(或键入,或模糊)。

如果我通过 onCloseResetsInput={false},那么在我输入内容之前它不会加载选项。 (在菜单中显示 "Type to search")

Async 提供了 onOpen 处理程序,但我没有找到在这种情况下使用它的方法。 (而 react-select@2.0.0-alpha.2 没有)

所以用户需要输入一个字符,然后将其删除,才能看到完整的选项列表。

如何避免这种情况?

示例沙箱https://codesandbox.io/s/mjkmowr91j

解决方案演示:https://codesandbox.io/s/o51yw14l59

我使用了 react-select 存储库中的 Async options loaded externally 部分。

我们首先加载 Select 的 onFocus 上的选项,并将状态设置为 isLoading: true。当我们收到选项时,我们将它们保存在状态中并在选项中呈现它们。

我还跟踪 optionsLoaded 以便仅在第一个 focus 时触发获取选项的调用。

在我们的用例中,我们在单个页面上有几个这样的 select 输入,都是异步的,因此对服务器的请求会堆积起来,并且在很多情况下完全没有必要(用户甚至不会打扰点击)。

我找到了解决此问题的方法,适用于我在 2.0.0-beta.6 上的用例:

  1. 包括defaultOptions
  2. 向您的 class 添加 2 个成员,它们将存储承诺的 resolve/reject 方法。
  3. 在您的 loadOptions 函数中,检查输入是否为 '',如果是,则创建一个新的承诺,并将 resolve/reject 的值存储在您的 class 成员,return 承诺。否则,只需 return 承诺即可正常获得结果。
  4. 添加一个 onFocus 处理程序,并在其中调用函数来获取结果,还添加 .then.catch 回调传递给 resolvereject 函数您之前存储过。

本质上,这会让 react-select 认为您正在努力通过长期 运行 承诺获得结果,但实际上您甚至不会尝试加载值,直到字段是 selected.

我不是 100% 肯定没有任何负面影响,因为我刚刚写了这篇文章,但这似乎是一个很好的起点。

希望这对某人有所帮助。我可以为此提交功能请求。

谢谢 Alexei Darmin 的解决方案,我一直在努力解决这个问题......在测试它时我将解决方案转换为反应功能组件并添加了真正的 API 获取。

这里是working demo,希望对大家有所帮助

为了在用户第一次聚焦时加载选项,设置defaultOptions={true}