虫子
在react @ 15中,我们可以设置“ value”或“ defaultValue”,然后将选定的元素滚动到视图中。
https://codesandbox.io/s/6vx637r10n
有趣! 我想知道所选项目在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
:
我不知道这是否会影响React。 我目前无法自己进行测试,但是我想知道如果设置断点并逐步执行此循环,是否会看到滚动变化。
你好,内森,我已经研究这个问题了几个小时,我安装了react 15.6.2和16.3.2,我能够以一些断点跟踪程序的执行,就像函数一样:
updateOptions
会将其带有“选择”的选项属性之一设置为true(好),selectedIndex也设置为4(也好),但是从这里我看不到为什么元素没有按照应有的方式打印,因为它的参数似乎还可以。 我也看到在selected
之前分配defaultSelected
没有区别。
当我通过调试器运行此命令时, selected
和defaultSelected
(取决于您使用的对象)都正确设置为适当的<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
滚动仍然集中在第一个选项上,即使第6个选项是唯一选择的。
无论如何,Chrome似乎只会在_assigned_而不是_unassigned时滚动到第一个选定的值。
也许这是有关的。
@nhunzaker是的,谢谢,您认为方向正确。 浏览器滚动到第一个选项,该选项的选定属性为true。 任何进一步的更改都不会导致滚动。
所以,我现在发现的。 React创建了裸露的selest
节点并将选项附加到其上。 由于裸select
具有multipe=false
,第一个附加选项将自动获得selected=true
。 因此,进一步切换到多种模式并更新选项选择不会使它滚动。
我认为有必要在附加选项之前设置multiple
属性值。
最有用的评论
下午好。 我认为我已经确定了导致这种不良行为的原因,但是,我需要更多时间来研究适当的修复方法。 因此,如果没有人介意,我想解决这个问题,并将我的第一个承诺投入到项目中。