React: 选择多个-不滚动到所选项目(项目)

创建于 2018-07-17  ·  12评论  ·  资料来源: facebook/react

虫子
react @ 15中,我们可以设置“ value”或“ defaultValue”,然后将选定的元素滚动到视图中。
https://codesandbox.io/s/6vx637r10n

但是在react @ 16中这不起作用。
https://codesandbox.io/s/7jqqz3zmo1

DOM Bug good first issue (taken)

最有用的评论

下午好。 我认为我已经确定了导致这种不良行为的原因,但是,我需要更多时间来研究适当的修复方法。 因此,如果没有人介意,我想解决这个问题,并将我的第一个承诺投入到项目中。

所有12条评论

有趣! 我想知道所选项目在React 16.0中的分配方式是否有所变化。

我试图看一下这些文件:

-https://github.com/facebook/react/blob/v15.6.2/src/renderers/dom/client/wrappers/ReactDOMSelect.js

-https://github.com/facebook/react/blob/master/packages/react-dom/src/client/ReactDOMFiberSelect.js

可悲的是我找不到太大的区别。 (很抱歉,我没有帮助,但是我有兴趣了解如何解决此问题,或者我在找错地方了。)

别担心! 这些也是我首先要去的地方。 我看到的一个区别是React 16.x在selected之后分配defaultSelected selected

https://github.com/facebook/react/blob/master/packages/react-dom/src/client/ReactDOMFiberSelect.js#L95

我不知道这是否会影响React。 我目前无法自己进行测试,但是我想知道如果设置断点并逐步执行此循环,是否会看到滚动变化。

你好,内森,我已经研究这个问题了几个小时,我安装了react 15.6.2和16.3.2,我能够以一些断点跟踪程序的执行,就像函数一样:

updateOptions

会将其带有“选择”的选项属性之一设置为true(好),selectedIndex也设置为4(也好),但是从这里我看不到为什么元素没有按照应有的方式打印,因为它的参数似乎还可以。 我也看到在selected之前分配defaultSelected没有区别。

当我通过调试器运行此命令时, selecteddefaultSelected (取决于您使用的对象)都正确设置为适当的<option> DOM元素上的true属性。

在16.3.2示例中,它仍然选择传递的值,只是没有滚动到该值。 在渲染器中是否还有其他地方需要查看/检查该值属性,并且行为在那里发生变化? 我四处摸索,但有很多代码需要解析。

不确定这有多大帮助,但是我使用提供的链接@ kre0n进行了一次小测试,以发现首次出现问题的React版本。 为了进行测试,我使用codeandbox上的界面卸载并重新安装了每个版本的React。

根据我的观察,从16.0.0版本开始及之后的所有情况都导致发生此问题。 知道15.6.2正常工作后,我决定研究从16.0.0-alpha一直到该问题首次出现之前的所有预发行版本。

我发现选择停止滚动到版本16.0.0-alpha.3中提供给选择元素的'值'。

我没有测试它是否在以后的版本中修复,但是我认为失败的第一点可以有所帮助。

下午好。 我认为我已经确定了导致这种不良行为的原因,但是,我需要更多时间来研究适当的修复方法。 因此,如果没有人介意,我想解决这个问题,并将我的第一个承诺投入到项目中。

更新。 看来这个问题比我想象的要复杂。 我敢肯定,此行为是在React Fiber体系结构中引入的。 尽管我不知道要花多少时间,但我会继续尝试修复它。 由于我之前没有详细介绍实现细节,因此可能需要一些时间

抱歉。 我一直在旅行很多:)听起来这是一个非常棘手的问题。

@segoddnja我将把它分配给您,但没有压力自己花费很多时间。 让我们尝试找出一个假设,也许我们可以一起解决它。

我很好奇选择是否提前发生某些事情,可能会导致滚动停止。 我想知道是否存在可能更改的属性/属性分配顺序,从而导致滚动停止。

这是一个有趣的现象,可以说发生以下步骤:

https://codepen.io/nhunzaker/pen/vaZxvE

  1. 给出6个选择
  2. 您选择第一个选项
  3. 您选择第六个选项
  4. 您取消选择第一个选项

滚动仍然集中在第一个选项上,即使第6个选项是唯一选择的。

无论如何,Chrome似乎只会在_assigned_而不是_unassigned时滚动到第一个选定的值。

也许这是有关的。

@nhunzaker是的,谢谢,您认为方向正确。 浏览器滚动到第一个选项,该选项的选定属性为true。 任何进一步的更改都不会导致滚动。

所以,我现在发现的。 React创建了裸露的selest节点并将选项附加到其上。 由于裸select具有multipe=false ,第一个附加选项将自动获得selected=true 。 因此,进一步切换到多种模式并更新选项选择不会使它滚动。

我认为有必要在附加选项之前设置multiple属性值。

此页面是否有帮助?
0 / 5 - 0 等级