React nie wyłącza autouzupełniania

83

Jak sprawić, by zareagował, wyrenderuj to?

<input
    id={field.name}
    className="form-control"
    type="text"
    placeholder={field.name}
    autocomplete="off"
    {...field}/>
Jarosław
źródło

Odpowiedzi:

158

Wielkie „C” autoComplete. Jest to wspomniane w dokumentacji Reacta:

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

azium
źródło
16
Zawsze zgłaszaj wyjątek, a nie tylko po cichu ignoruj ​​błędy.
Jarosław
1
@Yaroslav Możliwe, że React rzuca ostrzeżenie, jeśli nie, to github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/…
azium
1
Ale też nie jest to błąd, ponieważ rekwizyty mogą być czymkolwiek ... skąd React wie, kiedy tworzysz własny rekwizyt lub używasz atrybutu HTML?
azium
Rekwizyty nie mogą być niczym w przypadku tagów HTML.
Jarosław
Rozumiem, dlaczego myślisz, że tak jest, ale pamiętaj, że tagi JSX są transponowane do wywołań funkcji za pomocą ciągu znaków reprezentującego typ tagu.
azium
67

Powinieneś umieścić:

autoComplete="new-password"

Spowoduje to usunięcie autouzupełniania

JpCrow
źródło
13
Naprawdę nie rozumiem, dlaczego to działa zamiast „wyłączyć”. Dziwne.
Ajay
@Pim Ma sens. Dzięki!
Ajay
1
Jesteś legendą, dzięki! Ma to również sens, chciałem, aby moje pole nowego hasła nie było automatycznie uzupełniane: D
Erik Kubica
Prawdopodobnie chrome rozpoznaje neww nazwie. Nazwałam to teraz, autoComplete="new-off"co ma dla mnie trochę więcej sensu, jeśli nie jest to pole hasła i działa dobrze: D
kenny
7

Zgodnie z dokumentacją Mozilli , musisz ustawić nieprawidłową wartość, aby naprawdę wyłączyć autouzupełnianie. W niektórych przeglądarkach sugestie autouzupełniania są nadal podawane, mimo że atrybut jest wyłączony.

To zadziałało dla mnie (reakcja-bootstrap):

<FormControl
  value={this.state.value}
  autoComplete="nope"
  {...props}
/>
Pim
źródło
Wow, to dziwne, ale to jedyna rzecz, która do tej pory działała dla mnie.
Wylliam Judd
1
@Pim Mmm czy to to samo autocompletei autofill? Ponieważ nie działa u mnie na Chrome. Wciąż automatycznie wypełnia formularz poprzednimi wartościami przesłanymi z tego samego formularza.
alexventuraio
6

Jeśli przeczytałeś poprawną odpowiedź i nadal masz ten problem (szczególnie w Chrome), witaj w klubie ... więc sprawdź, jak to zrobiłem:

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

Uwagi

  • forma niekoniecznie musi być bezpośrednim rodzicem elementu wejściowego
  • wejście wymaga atrybutu nazwy
  • działa również z <FormControl/>tagiem React-Bootstrap (zamiast <input/>)
w3jimmy
źródło
To nie działa. Próbuję z Chrome 67. Nic. Nadal potrzebuję fałszywego wejścia z wyświetlaczem: brak! Bardzo szalony!
dziękuję za informację zwrotną, ale czy w Twojej sprawie zaznaczono wszystkie 3 punktory?
w3jimmy
W niektórych przypadkach nadal otrzymywałem autosugestie. Zobacz moją odpowiedź, aby uzyskać bardziej kompletne rozwiązanie.
Pim
5

Żadne z tych rozwiązań tak naprawdę nie działało na Chrome 80.

Po godzinach prób i błędów ten bardzo dziwny hack zadziałał dla mnie:

  1. Dodaj autoComplete="none"do każdego<input> - Google pomija teraz autocomplete = "off"
  2. Owiń pola w kontenerze: <form>lub<div>
  3. Potrzebujesz co najmniej jednego prawidłowego pola wejściowego z autoComplete="on". Powinien to być ostatni element w kontenerze. Więc dodałem następujące pole wejściowe na dole mojego formularza:
<input 
  type="text" 
  autoComplete="on" 
  value="" 
  style={{display: 'none', opacity: 0, position: 'absolute', left: '-100000px'}} 
  readOnly={true}
/>
mscott2005
źródło
3

autoComplete = "none" - działa dla mnie.

Alexander Utrobin
źródło
2
Witaj Alex. Postaraj się odpowiedzieć bardziej szczegółowo. Ważne jest, aby zastanowić się, czy rozwiązanie działa ze względu na wielkość „autouzupełniania”.
Jennifer Goncalves,
1

Piekło autouzupełniania Chrome wyłącza się przez dodanie atrybutu nowego hasła.

autoComplete="new-password"

W akcji wygląda tak:

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

więcej dyskusji na temat:

Dyskusja dotycząca autouzupełniania Chrome

Saqy G
źródło
0

Oprócz odpowiedzi @ azium <input>należy umieścić w <form>tagu, a następnie autoCompletedziała

Monsoir
źródło
0

Rozwiązałem to za pomocą tylko jednej linii:

Jeśli używasz zalecanego sposobu z "changeHandler ()" i stanem komponentów, po prostu wstaw:

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

Więcej informacji o tej zmianieHandler () - Rzecz:
https://reactjs.org/docs/forms.html#controlled-components

Marcel Ennix
źródło
2
kiedy Google Chrome automatycznie wypełnia moje dane, e.isTrusted is true: D
IvanY
0

Wypróbowałem także wiele opcji, ale skończyło się na tym, że zastąpiłem <form>tag <div>tagiem i ręcznie zarządzałem każdym wejściem, które miałem w tej formie.

radu ghitescu
źródło
0

Oto komunikat „To działa na moim komputerze”

Chrome w wersji 83.0.4103.116 i React. Wygląda na to, że sztuczka, która zadziałała w moim przypadku, polega na umieszczeniu go w formularzu i dodaniu atrybutu autoComplete . Uwaga Jeśli spróbujesz tego w aplikacji niereagującej, będziesz musiał wykonać autouzupełnianie małą literą C

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

i

<form autoComplete="new-password">
  <input type="text" autoComplete="new-password" />
</form>
devpato
źródło
0

Tak, większość sugestii tutaj i gdzie indziej nie powiodła się w grudniu 2020 r.
Myślę, że wypróbowałem je wszystkie, opakowanie formularzy, ustawienie autouzupełniania na „wyłączone” z „nowego hasła” (żadne z nich nie działało), wybranie onFocus, upewnienie się, że używam autouzupełniania i nie autouzupełnianie (nie wielkie litery), ale żadne z nich nie pomogło.

W końcu podejście mscott2005 zadziałało (+1) dla mnie, ale poprawiłem je również, aby uzyskać bardziej minimalny przykład, który publikuję jako odpowiedź dla innych:

Nie był potrzebny żaden formularz, tylko dwa znaczniki wejściowe:

  • autocomplete = "off" na wybranym polu

    <input ... autoComplete="off" />

  • autocomplete = "on" na fałszywym ukrytym polu

    <input

    id="fake-hidden-input-to-stop-google-address-lookup"
    autoComplete="on"
    style={{ display: 'none'}}>
    

Identyfikator jest najlepszym, jaki mam, do dokumentowania tego, co naprawdę jest włamaniem, bez użycia komentarza.

Michael Durrant
źródło