React不会渲染自动完成功能


81

我该如何使它渲染?

<input
    id={field.name}
    className="form-control"
    type="text"
    placeholder={field.name}
    autocomplete="off"
    {...field}/>

Answers:


154

大写字母“ C” autoComplete。在React文档中提到了这一点:

https://facebook.github.io/react/docs/tags-and-attributes.html


16
总是抛出异常,而不仅仅是默默地忽略错误。
雅罗斯拉夫

1
@Yaroslav React可能对此发出警告,否则,将引发
github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/…– azium

1
但是,这也不是错误,因为props可以是任何东西..当您制作自己的prop或使用html属性时,React如何知道?
2016年

对于html标签,道具不能是任何东西。
雅罗斯拉夫

我理解您为什么会认为是这种情况,但是请记住,这些JSX标记被转换为带有表示标记类型的字符串的函数调用。
2016年

64

您应该输入:

autoComplete="new-password"

这将删除自动完成功能


13
我真的不明白为什么这可以代替“关闭”。奇怪的。
阿贾伊(Ajay)


@Pim很有道理。谢谢!
Ajay

1
您是传奇人物,谢谢!这也很有意义,我希望我的新密码字段不要自动填写:D
Erik Ku​​bica

可能是chrome正在识别new名称中的。我现在给它命名,autoComplete="new-off"这对我来说更有意义,如果它不是密码字段并且可以正常使用:D
kenny

7

根据Mozilla文档,必须设置一个无效值才能真正关闭自动补全功能。在某些浏览器中,即使该属性设置为off,仍会给出自动完成建议。

这对我有用(react-bootstrap):

<FormControl
  value={this.state.value}
  autoComplete="nope"
  {...props}
/>

哇,这很奇怪,但这是迄今为止对我有用的唯一方法。
威廉·贾德

1
@Pim嗯是相同的autocompleteautofill?因为使用Chrome不适用于我。它将使用通过同一表单发送的先前值来自动填充表单。
alexventuraio

6

如果您已阅读正确答案,但仍然遇到此问题(尤其是在Chrome中),欢迎加入俱乐部...因此,请检查我是如何做到的:

<form autoComplete="new-password" ... >
        <input name="myInput" type="text" autoComplete="off" id="myInput" placeholder="Search field" />
</form>

笔记

  • 形式不一定是输入元素的直接父代
  • 输入需要名称属性
  • 它也可以与React-Bootstrap<FormControl/>标签一起使用(而不是<input/>

没用 我正在尝试使用Chrome 67。我仍然需要带有显示的虚假输入:无!太疯狂了!

感谢您的反馈,但是您的案例是否打勾了所有3个项目符号?
w3jimmy

在某些情况下,我仍然对此表示自动建议。请参阅我的答案以获得更完整的解决方案。
Pim


3

这些解决方案都无法在Chrome 80上真正起作用。

经过数小时的反复试验,这个非常奇怪的技巧对我有用:

  1. 添加autoComplete="none"到每个<input>-Google现在跳过autocomplete =“ off”
  2. 将您的字段包装在容器中:<form><div>
  3. 您需要至少一个有效的输入字段autoComplete="on"。这应该是容器中的最后一个元素。因此,我在表单底部添加了以下输入字段:
<input 
  type="text" 
  autoComplete="on" 
  value="" 
  style={{display: 'none', opacity: 0, position: 'absolute', left: '-100000px'}} 
  readOnly={true}
/>

1

Chrome自动完成功能会通过添加new-password属性来关闭。

autoComplete="new-password"

实际操作如下:

<input            
type="password"
autoComplete="new-password"
/>

有关以下内容的更多讨论:

Chrome自动完成讨论


0

除了@azium的答案外,<input>还应将其放在<form>标签中,然后autoComplete可以使用


0

我只用一行就解决了:

如果您对“ changeHandler()”和组件状态使用推荐的方式,只需插入:

changeHandler = (e) => {    
  if (!e.isTrusted) return;
  ... your code
}

有关该changeHandler()的更多信息-内容:https ://reactjs.org/docs/forms.html#受控组件


2
当谷歌浏览器自动填充我的输入内容时,e.isTrusted为true:D
IvanY

0

我还尝试了许多选项,但最终要做的是<form><div>标签替换标签,并手动管理该表单中的每个输入。


0

这是“它可以在我的机器上运行”

Chrome版本83.0.4103.116和React。看来对我有用的技巧是将其放入表单中并添加autoComplete属性。注意如果在非反应性应用程序上尝试此操作,则必须使用小写C来自动完成

 <form autoComplete="off">
      <input type="text" autoComplete="new-password" />
 </form>

<form autoComplete="new-password">
  <input type="text" autoComplete="new-password" />
</form>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.