Перенос автозаполнения Chrome в разные формы

#javascript #reactjs #autofill #react-hooks

#javascript #reactjs #автозаполнение #реагирующие хуки

Вопрос:

Прежде всего, я собираюсь предположить, что я собираюсь отобразить формы неправильным способом. Я думаю, я просто хочу понять, где я здесь ошибся?

У меня есть две вкладки, которые передают обратно prop, чтобы определить, какая из них активна.

Затем этот реквизит отображает форму входа в систему или регистрации.

У меня есть CodeSandbox, в котором вам нужно будет ввести адрес электронной почты и пароль и нажать отправить в Chrome. Вам будет предложено сохранить пароль.

Если вы сделаете вышеописанное, входные данные должны быть автоматически заполнены, и когда вы переходите от входа к регистрации, автозаполнение электронной почты и пароля теперь переносится на регистрацию и заполняется теми же деталями, даже паролем в виде обычного текста.

Как мне убедиться, что этого не произойдет? Любая помощь была бы высоко оценена.

Ниже приведен мой компонент, вы можете просмотреть все приложение в CodeSandbox

 import React, { useState } from "react";
import { withRouter } from "react-router-dom";
import _ from "lodash";

import InputControl from "./InputControl";
import InputButton from "./InputButton";
import FormControl from "./FormControl";

const LoginCard = props => {
  const [hideContent, setHideContent] = useState(false);

  const [emailSignUpRef, setEmailSignUpRef] = useState("");
  const [firstNameSignUpRef, setFirstNameEmailSignUpRef] = useState("");
  const [surNameSignUpRef, setSurNameEmailSignUpRef] = useState("");

  let registerEmailInput = "";
  let firstNameInput = "";
  let surNameInput = "";
  let checkBoxSignUp = "";
  let signUpBtn = "";

  const scrollToEl = _.debounce(
    el =>
      window.scrollTo({
        top: el,
        behavior: "smooth"
      }),
    1000
  );

  const handleOnFocus = event => {
    scrollToEl(event.target);
    setEmailSignUpRef(registerEmailInput.value);
    setFirstNameEmailSignUpRef(firstNameInput.value);
    setHideContent(true);
  };

  const handleOnInput = () => {
    setEmailSignUpRef(registerEmailInput.value);
    setFirstNameEmailSignUpRef(firstNameInput.value);
  };

  const handleOnBlur = event => {
    const rl = event.relatedTarget;
    if (
      !(firstNameInput === rl) amp;amp;
      !(registerEmailInput === rl) amp;amp;
      !(checkBoxSignUp === rl) amp;amp;
      !(signUpBtn === rl)
    ) {
      setHideContent(
        !_.isEmpty(emailSignUpRef.trim()) ||
          !_.isEmpty(firstNameSignUpRef.trim())
      );
    }
  };

  const loginForm = (
    <FormControl>
      <InputControl
        autoComplete="off"
        type="text"
        name="emailAddress"
        placeholder="Email address"
        label="Email Address"
      />
      <InputControl
        autoComplete="off"
        type="password"
        name="password"
        placeholder="Password"
        label="Password"
      />
      <InputControl type="checkbox" name="email" label="Keep me logged in" />
      <InputButton buttonText="Login" type="submit" />
    </FormControl>
  );

  const registerForm = (
    <FormControl>
      <InputControl
        refProp={input => {
          registerEmailInput = input;
        }}
        onInput={handleOnInput}
        onFocus={handleOnFocus}
        onBlur={handleOnBlur}
        value={emailSignUpRef}
        autoComplete="off"
        type="text"
        name="emailAddressRegister"
        placeholder="Email address"
        label="Email Address"
      />
      <InputControl
        className={
          !hideContent ? "InputControl--hidden" : "InputControl--visible"
        }
        autoComplete="off"
        refProp={input => {
          firstNameInput = input;
        }}
        onInput={handleOnInput}
        onBlur={handleOnBlur}
        type="text"
        name="firstName"
        placeholder="First Name"
        label="First Name"
      />
      <InputControl
        className={
          !hideContent ? "InputControl--hidden" : "InputControl--visible"
        }
        autoComplete="off"
        refProp={input => {
          surNameInput = input;
        }}
        onInput={handleOnInput}
        onBlur={handleOnBlur}
        type="text"
        name="surName"
        placeholder="Surname"
        label="Surname"
      />
      <InputControl
        refProp={input => {
          checkBoxSignUp = input;
        }}
        type="checkbox"
        name="checkboxRegister"
        label={["I have read and agreed to the terms and conditions"]}
      />
      <InputButton
        refProp={input => {
          signUpBtn = input;
        }}
        buttonText="Sign Up"
        type="submit"
      />
    </FormControl>
  );

  return (
    <div className="LoginCard">
      <h2
        className={
          "LoginCard-title"   (hideContent ? " LoginCard-titleHidden" : "")
        }
      >
        {props.active === "login" ? "Login" : "Sign Up"}
      </h2>
      {props.active === "login" ? loginForm : registerForm}
    </div>
  );
};

export default withRouter(LoginCard);
  

Ответ №1:

Только что исправлена эта проблема. Это произошло из-за того, что не был передан key атрибут для FormControl компонента!

 <FormControl key={"loginForm"}