臭虫
目前的行为是什么?
对于输入类型=“ number”,如果设置了初始值,则步骤将无法按预期方式工作。 仅当初始值为“”或null时,step才会被兑现。
例:
https://codepen.io/anon/pen/MQMBmX
该示例使用受控的输入绑定值和步骤。 步长是值的1/10。 如果将文本框中的值编辑为50000并使用步进器递增,则它将递增至50100(即,以初始值而不是当前步)。
编辑代码,使初始值为“”或null。 将文本框编辑为50000并逐步增加-值将达到预期的55000。
预期的行为是什么?
应该有可能呈现一个遵循步骤的数字输入,而不必首先将输入组件的值初始化为null或“”。
似乎在提供初始值时,它将把value属性写入DOM(例如value =“ 100”)。 当初始值为“”或null时,则仅将value属性写入没有分配的DOM中。 例如(值)。
哪个版本的React,以及哪个浏览器/操作系统受此问题影响?
16.3.0-alpha.1(移植到此版本以确认是否仍然存在问题)
0.14.7(最初在此版本中找到)
似乎仅影响Chrome(已确认Windows和Mac,版本59和64)。 Bug没有出现在Safari中(至少在Mac上)。
我在Windows 10上的Chrome 64和Debian上的Firefox 52中看到这种提琴非常特殊的行为。 如果在输入中键入50000,然后立即单击向上箭头,则得到50100。如果在输入中键入50000,则单击文档中的其他位置,然后单击向上箭头,则得到55000。
您无需更改值,请多次单击向上箭头,它会开始更改为没有意义的数字。
感谢您的报告@andyboyne。 问题源于以下事实:在字段模糊之前,我们不会更新数字输入的value
属性。 我们这样做是为了避免一堆与浏览器验证相关的不良行为。 cc @nhunzaker。
一旦我们最终停止同步受控输入的value
属性https://github.com/facebook/react/issues/11896,就应该解决此问题
是。 实际上,我想知道我们是否应该为此制定时间表。
正如陈旧提到的,这是一个同步问题,当字段模糊时,该字段是同步的。
因此,我添加了一些console.log,我发现在字段不模糊的情况下e.target.value和e.target.getAttribute(“ value”)不同步。
因此,一种解决方法是添加e.target.setAttribute(“ value”,e.target.value); 强制更新此值,然后按预期工作。
onChange={e => {
console.log("target" , e.target.value);
console.log("getAttribute value", e.target.getAttribute("value"));
e.target.setAttribute("value",e.target.value);
this.setState({value: e.target.value, step: e.target.value / 10});
}}
不,这仍然是一个问题,这让我发疯,我们仍然没有简化v16的受控输入!
最有用的评论
是。 实际上,我想知道我们是否应该为此制定时间表。