在反应js中显示隐藏多个密码

Show hide multiple password in react js

我目前正在学习 React js。当它有一个显示隐藏密码时,我的代码工作。但是当我有不止一个时,我就会挣扎。此代码有效,因为它只有一个。

export default function App() {
  const [changePassword, setChangePassword] = useState(true);
  const changeIcon = changePassword === true ? false : true;

  return (
  <div className="wrapper-login">
     <div className="wrapper-form">
        <h2>Welcome Back!</h2>
        <form>
           <label>Email</label>
           <div>
              <input
                 type="email"
                 name="email"
                 required
              />
           </div>
           <label>Password</label>
           <div className="form-group">
              <input
                 type={changePassword ? "password" : "text"}
                 name="password"
                 required
              />
              <span className="icon"
                 onClick={() => {
                    setChangePassword(changeIcon);
                 }}
              >
                 {changeIcon ? <EyeOutlined /> : <EyeInvisibleOutlined />}
              </span>
           </div>
        </form>
     </div>
  </div>
);
}

codesandbox我有3个输入类型的密码,每个输入都有显示隐藏密码。你能帮我实现吗?并向我解释为什么这是有效的? .我很抱歉我的英语不好。谢谢

您可以创建一个组件来控制隐藏或显示行为。例如,您可以为独立的显示隐藏行为创建一个通用组件。您传递输入名称,它会为您创建一个 sub-component。

export default function ShowHidePassword({ name }) {
  const [isVisible, setVisible] = useState(false);

  const toggle = () => {
    setVisible(!isVisible);
  };

  return (
    <div className="form-group">
      <input type={!isVisible ? "password" : "text"} name={name} required />
      <span className="icon" onClick={toggle}>
        {isVisible ? <EyeOutlined /> : <EyeInvisibleOutlined />}
      </span>
    </div>
  );
}

用法:

<div>
  <ShowHidePassword name="name" />
  <ShowHidePassword name="password" />
</div>

当您对不止一件事使用一种状态时,状态更改将影响使用该状态的所有元素。 最好的方法是创建一个可重用的输入组件,并将其导入到任何地方,随心所欲。通过这种方式,所有更改都将仅在该组件内部发生,不会影响其他组件

如果您想访问输入 onChange、name 和 ....

,请不要忘记将 ...props 传递给您的输入
  export const PasswordInput = (props) => {
  const [hide, setHide] = useState(false);

  const toggle = () => {
    setHide((prev) => !prev);
  };

  return (
    <div>
      <input type={!isVisible ? "password" : "text"} {...props} required />

      <i className="icon" onClick={toggle}>
        {hide ? <EyeVisible /> : <EyeInvisible />}
      </i>
    </div>
  );
}

用法:

<div>
<PasswordInput />
<PasswordInput />
<PasswordInput />
</div>

现在每个切换只会影响点击的输入,没有副作用和重新渲染