import React, { useState, useMemo, useCallback } from 'react'; import './PasswordInput.css'; function levelOf(v) { if (!v) return ''; let s = 0; if (v.length >= 8) s++; if (/[a-z]/.test(v) && /[A-Z]/.test(v)) s++; if (/\d/.test(v)) s++; if (/[^A-Za-z0-9]/.test(v)) s++; if (v.length >= 12) s++; if (s <= 2) return 'weak'; if (s <= 3) return 'mid'; return 'strong'; } export default function PasswordInput({ value = '', placeholder = '请输入密码', showStrength = true, onChange }) { const [visible, setVisible] = useState(false); const [focused, setFocused] = useState(false); const level = useMemo(() => levelOf(value), [value]); const tip = useMemo(() => { if (level === 'weak') return '弱:建议使用字母、数字与符号组合'; if (level === 'mid') return '中:再增加长度或符号更安全'; if (level === 'strong') return '强:密码强度良好'; return ''; }, [level]); const handle = useCallback( (e) => { if (onChange) onChange(e.target.value); }, [onChange] ); const barClass = (i) => { if (!showStrength || !level) return ''; const on = (level === 'weak' && i < 1) || (level === 'mid' && i < 2) || (level === 'strong' && i < 3); return on ? 'on ' + level : ''; }; return (