在antd的Progress的根底上封装
PwdStrength.tsx

import { Col, Progress, Row } from 'antd';import { FC } from 'react';import styles from './index.less';interface IPwdStrengthProps {  pwdStrength: 0 | 1 | 2 | 3;}const PwdStrength: FC<IPwdStrengthProps> = ({ pwdStrength }) => {  return (    <div className={styles.passwordStrongBox}>      <Row gutter={12}>        <span className={styles.passWord}>明码强度</span>        <Col span={3}>          <Progress className={styles.weak} percent={pwdStrength > 0 ? 100 : 0} showInfo={false} />        </Col>        <Col span={3}>          <Progress className={styles.middle} percent={pwdStrength > 1 ? 100 : 0} showInfo={false} />        </Col>        <Col span={3}>          <Progress className={styles.strong} percent={pwdStrength > 2 ? 100 : 0} showInfo={false} />        </Col>        <span className="passStrong">          {pwdStrength === 1 && '弱'}          {pwdStrength === 2 && '中'}          {pwdStrength === 3 && '强'}        </span>      </Row>    </div>  );};export default PwdStrength;

笼罩原有款式,依据强度各个进度显式不同色彩,款式献上
index.less

.passwordStrongBox {  margin-top: 4px;  .weak {    :global .ant-progress-bg {      background-color: #f50 !important;    }  }  .middle {    :global .ant-progress-bg {      background-color: #e4ce2b !important;    }  }  .strong {    :global .ant-progress-bg {      background-color: #87d068 !important;    }  }  .passWord {    display: inline-block;    margin: 3px 8px 0 6px;    color: rgba(140, 140, 140, 100);    font-size: 12px;  }  .passStrong {    display: inline-block;    margin: 3px 0 0 8px;    color: rgba(89, 89, 89, 100);    font-size: 11px;  }}

利用正则判断用户输出的明码的强度
useChangePassword.ts

const pattern_1 = /^.*([0-9])+.*$/i; //数字const pattern_2 = /[a-z]/; //小写字母const pattern_3 = /[A-Z]/; //大写字母const pattern_4 = /[`~!@#$%^&*()\-_+=\\|{}':;\",\[\].<>\/?~!@#¥%……&*()——+|{}【】‘;:”“’。,、?]/; //特殊字符export function useChangePassword() {  const getPwdStrength = (pwd: string): 0 | 1 | 2 | 3 => {    let level = 0;    if (pwd) {      pwd = pwd.trim();      if (pwd.length >= 6) {        if (pattern_1.test(pwd)) {          level++;        }        if (pwd.length > 10) {          level++;        }        if (pattern_2.test(pwd) || pattern_3.test(pwd)) {          level++;        }        if (pattern_4.test(pwd)) {          level++;        }        if (level > 3) {          level = 3;        }      }    }    return level as 0 | 1 | 2 | 3;  };  return {    getPwdStrength,  };}

数据管理
store.ts

import { reduxStore } from '@/createStore';export const store = reduxStore.defineLeaf({  namespace: 'personal',  initialState: {    pwdStrength: 0 as 0 | 1 | 2 | 3,  },  reducers: {    changePwdStrength(state, payload: 0 | 1 | 2 | 3) {      state.pwdStrength = payload;    },  },});

应用

import { store } from '../../store';import PwdStrength from '../PwdStrength'; const { pwdStrength } = store.useState();const { getPwdStrength } = useChangePassword();  <ProFormText.Password            placeholder="新密码"            rules={[              {                required: true,                message: '请输出新密码',              },            ]}            width="md"            name="newPassword"            label="新密码"            help={<PwdStrength pwdStrength={pwdStrength} />}            fieldProps={{ onChange: (e) => store.changePwdStrength(getPwdStrength(e.target.value)) }}          />