描述、重现步骤和沙箱示例见#17022!
Firefox 的本机自动完成功能仍然无法正常工作。
这也会影响其他框架(antd、material UI):
如果 React 社区的某个人可以试一试,那就太好了,因为我认为本机自动完成是一个非常重要的 UX 功能。
我已经研究过这个,这似乎是因为 React 将输入 DOM 节点的defaultValue
设置为当前的value
以用于受控输入。 当您在 Firefox 中提交node.value === node.defaultValue
它不会将其保存为自动填充。 它没有记录在任何地方,我只是发现了测试(也没有 React)。
React 确实将defaultValue
分配给当前value
的原因是因为如果您有一个带有type="reset"
的输入并单击它,您将在您的控制中得到空白字段如果您删除了该行,则输入(尽管下一次重新渲染会修复它们)。 至少这是我通过浏览代码所理解的。
您可以通过让defaultValue
返回一个空字符串来使 Firefox 上的自动完成/自动填充在受控输入上工作:
function handleChange(event) {
Object.defineProperty(event.target, "defaultValue", {
configurable: true,
get() { return "" },
set() {},
});
setValue(event.target.value);
}
只要您没有type="reset"
。 否则,您会注意到所有字段都被重置为空白(不过,下次重新渲染会修复它们)。 不过我不推荐这个,它是一个“黑客”,我还没有在任何地方使用过它,可以说它是 100% 可靠的。
无论如何,这可能是 Firefox 中的一个错误 .. 或一个功能(错误?),但我没有在规范、MDN 或其他地方找到任何描述node.value === node.defaultValue
应该避免保存自动填充的内容🤷♀️
我正在/正在做一个 PR 来解决这个问题……但是,也许 Firefox 可以在他们这边解决它? 🙈(不清楚是不是bug)
很高兴知道 React 核心团队的任何人是否知道这个问题和/或我们可以做些什么。
编辑:这是一个演示 Firefox 中的问题的演示。 这是纯 HTML + 3 行 JS 代码:
https://codesandbox.io/s/naughty-feather-vwl6v?file=/index.html
所以这本身不是 React 问题🤔
如果有人感兴趣,我打开了这个:
https://bugzilla.mozilla.org/show_bug.cgi?id=1642570
😅
我相信这是#15739 的重复
最有用的评论
我已经研究过这个,这似乎是因为 React 将输入 DOM 节点的
defaultValue
设置为当前的value
以用于受控输入。 当您在 Firefox 中提交node.value === node.defaultValue
它不会将其保存为自动填充。 它没有记录在任何地方,我只是发现了测试(也没有 React)。删除这个“解决”问题:
https://github.com/facebook/react/blob/1d85bb3ce13401644a5e345f8bc84522c59a951c/packages/react-dom/src/client/ReactDOMInput.js#L420
React 确实将
defaultValue
分配给当前value
的原因是因为如果您有一个带有type="reset"
的输入并单击它,您将在您的控制中得到空白字段如果您删除了该行,则输入(尽管下一次重新渲染会修复它们)。 至少这是我通过浏览代码所理解的。您可以通过让
defaultValue
返回一个空字符串来使 Firefox 上的自动完成/自动填充在受控输入上工作:只要您没有
type="reset"
。 否则,您会注意到所有字段都被重置为空白(不过,下次重新渲染会修复它们)。 不过我不推荐这个,它是一个“黑客”,我还没有在任何地方使用过它,可以说它是 100% 可靠的。无论如何,这可能是 Firefox 中的一个错误 .. 或一个功能(错误?),但我没有在规范、MDN 或其他地方找到任何描述
node.value === node.defaultValue
应该避免保存自动填充的内容🤷♀️我正在/正在做一个 PR 来解决这个问题……但是,也许 Firefox 可以在他们这边解决它? 🙈(不清楚是不是bug)
很高兴知道 React 核心团队的任何人是否知道这个问题和/或我们可以做些什么。
编辑:这是一个演示 Firefox 中的问题的演示。 这是纯 HTML + 3 行 JS 代码:
https://codesandbox.io/s/naughty-feather-vwl6v?file=/index.html
所以这本身不是 React 问题🤔