在第一次打开异步下拉菜单时加载选项
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/o51yw14l59
我使用了 react-select 存储库中的 Async options loaded externally
部分。
我们首先加载 Select 的 onFocus
上的选项,并将状态设置为 isLoading: true
。当我们收到选项时,我们将它们保存在状态中并在选项中呈现它们。
我还跟踪 optionsLoaded
以便仅在第一个 focus
时触发获取选项的调用。
在我们的用例中,我们在单个页面上有几个这样的 select 输入,都是异步的,因此对服务器的请求会堆积起来,并且在很多情况下完全没有必要(用户甚至不会打扰点击)。
我找到了解决此问题的方法,适用于我在 2.0.0-beta.6 上的用例:
- 包括
defaultOptions
- 向您的 class 添加 2 个成员,它们将存储承诺的
resolve
/reject
方法。
- 在您的
loadOptions
函数中,检查输入是否为 '',如果是,则创建一个新的承诺,并将 resolve
/reject
的值存储在您的 class 成员,return 承诺。否则,只需 return 承诺即可正常获得结果。
- 添加一个 onFocus 处理程序,并在其中调用函数来获取结果,还添加
.then
和 .catch
回调传递给 resolve
和 reject
函数您之前存储过。
本质上,这会让 react-select 认为您正在努力通过长期 运行 承诺获得结果,但实际上您甚至不会尝试加载值,直到字段是 selected.
我不是 100% 肯定没有任何负面影响,因为我刚刚写了这篇文章,但这似乎是一个很好的起点。
希望这对某人有所帮助。我可以为此提交功能请求。
谢谢 Alexei Darmin 的解决方案,我一直在努力解决这个问题......在测试它时我将解决方案转换为反应功能组件并添加了真正的 API 获取。
这里是working demo,希望对大家有所帮助
为了在用户第一次聚焦时加载选项,设置defaultOptions={true}
当我向 Async
控件提供 loadOptions
时,它会在安装时加载选项。
如果我通过 autoload={false}
那么它既不会在装载时也不会在打开时加载选项。但它会在第一次关闭时加载选项(或键入,或模糊)。
如果我通过 onCloseResetsInput={false}
,那么在我输入内容之前它不会加载选项。 (在菜单中显示 "Type to search")
Async
提供了 onOpen
处理程序,但我没有找到在这种情况下使用它的方法。 (而 react-select@2.0.0-alpha.2
没有)
所以用户需要输入一个字符,然后将其删除,才能看到完整的选项列表。
如何避免这种情况?
解决方案演示:https://codesandbox.io/s/o51yw14l59
我使用了 react-select 存储库中的 Async options loaded externally
部分。
我们首先加载 Select 的 onFocus
上的选项,并将状态设置为 isLoading: true
。当我们收到选项时,我们将它们保存在状态中并在选项中呈现它们。
我还跟踪 optionsLoaded
以便仅在第一个 focus
时触发获取选项的调用。
在我们的用例中,我们在单个页面上有几个这样的 select 输入,都是异步的,因此对服务器的请求会堆积起来,并且在很多情况下完全没有必要(用户甚至不会打扰点击)。
我找到了解决此问题的方法,适用于我在 2.0.0-beta.6 上的用例:
- 包括
defaultOptions
- 向您的 class 添加 2 个成员,它们将存储承诺的
resolve
/reject
方法。 - 在您的
loadOptions
函数中,检查输入是否为 '',如果是,则创建一个新的承诺,并将resolve
/reject
的值存储在您的 class 成员,return 承诺。否则,只需 return 承诺即可正常获得结果。 - 添加一个 onFocus 处理程序,并在其中调用函数来获取结果,还添加
.then
和.catch
回调传递给resolve
和reject
函数您之前存储过。
本质上,这会让 react-select 认为您正在努力通过长期 运行 承诺获得结果,但实际上您甚至不会尝试加载值,直到字段是 selected.
我不是 100% 肯定没有任何负面影响,因为我刚刚写了这篇文章,但这似乎是一个很好的起点。
希望这对某人有所帮助。我可以为此提交功能请求。
谢谢 Alexei Darmin 的解决方案,我一直在努力解决这个问题......在测试它时我将解决方案转换为反应功能组件并添加了真正的 API 获取。
这里是working demo,希望对大家有所帮助
为了在用户第一次聚焦时加载选项,设置defaultOptions={true}