You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React.js中点击密码显示/隐藏图标时输入内容丢失的解决方法

解决密码显示/隐藏切换时内容丢失的问题

问题根源:切换input的type属性时,React会重新创建该DOM节点,导致已输入的密码内容被重置。

解决方案一:添加固定key属性(推荐)

给input元素添加一个稳定的key,让React识别这是同一个元素,避免重新创建DOM节点,从而保留输入内容:

const Login = () => {
  const [isRevealPassword, setIsRevealPassword] = useState(false);
  const togglePassword = () => {
    setIsRevealPassword((prevState) => !prevState);
  };

  return (
    // ...其余组件内容
    <input
      key="password-input" // 添加固定key
      placeholder='Old Password'
      className='form-control update_password_form'
      type={isRevealPassword ? 'text' : 'password'}
      {...register('password', { required: true })}
    />
    <span onClick={togglePassword} role="presentation" className="password_reveal">
      {isRevealPassword ? <FontAwesomeIcon icon={faEye} /> : <FontAwesomeIcon icon={faEyeSlash} />}
    </span>
    // ...其余组件内容
  );
};

解决方案二:手动绑定输入框值

通过react-hook-form的watch和setValue手动同步输入框值,确保切换type时内容不丢失:

const Login = () => {
  const [isRevealPassword, setIsRevealPassword] = useState(false);
  const { register, watch, setValue } = useForm();
  const passwordValue = watch('password');

  const togglePassword = () => {
    setIsRevealPassword((prevState) => !prevState);
    setValue('password', passwordValue);
  };

  return (
    // ...其余组件内容
    <input
      placeholder='Old Password'
      className='form-control update_password_form'
      type={isRevealPassword ? 'text' : 'password'}
      {...register('password', { required: true })}
      value={passwordValue}
    />
    <span onClick={togglePassword} role="presentation" className="password_reveal">
      {isRevealPassword ? <FontAwesomeIcon icon={faEye} /> : <FontAwesomeIcon icon={faEyeSlash} />}
    </span>
    // ...其余组件内容
  );
};

两种方案中,添加key的方式更简洁高效,是首选方案。

内容的提问来源于stack exchange,提问作者user20271619

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 08:50:36