reactjs 在react js中显示隐藏多个密码

x33g5p2x  于 2023-03-29  发布在  React
关注(0)|答案(3)|浏览(135)

我目前正在学习React js。当我的代码有一个show hide密码时,我的代码可以工作。但是当我有多个密码时,我会很挣扎。这段代码可以工作,因为它只有一个密码。

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个输入类型的密码,每个输入都有显示隐藏密码。你能帮我实现吗?并向我解释为什么这工作?我很抱歉我的英语不好。谢谢

yhuiod9q

yhuiod9q1#

您可以创建一个控制隐藏或显示行为的组件。例如,您可以为孤立的显示隐藏行为创建一个通用组件。您传递输入名称,它将为您创建一个子组件。

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>
n53p2ov0

n53p2ov02#

当你为多个事物使用一个状态时,状态的改变会影响所有使用该状态的元素。最好的方法是创建一个可重用的输入组件,并将其导入到任何你想要的地方。通过这种方式,所有的改变都会发生在该组件内部,而不会影响其他组件。
如果你想访问输入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>

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

ny6fqffe

ny6fqffe3#

这里是可重复使用的密码隐藏显示组件。

import React from 'react'
import { useState,useEffect } from 'react';

const PasswordShowInput = ({name,disabled,value,setValue}) => {
    const [show, setShow] = useState(false);

    const onShow = (e)=>{
        e.preventDefault();
        setShow(!show)
    }

    useEffect(() => {
      setShow(false)
      return () => {
        setShow(false)
      };
    }, [disabled]);

  return (
 <div className='showpassword'>
        <input disabled={disabled}  name={name} type={show && !disabled?"text":"password"} value={value} onChange={e=>setValue(e.target.value)}/>
        {!disabled?<p onClick={onShow}><i class={!show?"fa-solid fa-eye":"fa-solid  fa-eye-slash"}></i></p>:null}
    </div>
  )
}

export default PasswordShowInput

用法

<PasswordShowInput disabled={false} name="password" value={password} setValue={setPassword}/>

相关问题