React: 对于“受控输入”,除非用null或“”初始化,否则step不能按预期方式工作。

创建于 2018-03-06  ·  6评论  ·  资料来源: facebook/react

臭虫

目前的行为是什么?
对于输入类型=“ 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上)。

DOM Bug

最有用的评论

是。 实际上,我想知道我们是否应该为此制定时间表。

所有6条评论

我在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的受控输入!

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