import React, { Component } from 'react'; import { connect } from 'dva'; import { routerRedux, Link } from 'dva/router'; import { Form, Input, Button, Select, Row, Col, Popover, Progress } from 'antd'; import styles from './Register.less'; const FormItem = Form.Item; const { Option } = Select; const InputGroup = Input.Group; const passwordStatusMap = { ok:
强度:强
, pass:
强度:中
, poor:
强度:太短
, }; const passwordProgressMap = { ok: 'success', pass: 'normal', poor: 'exception', }; @connect(({ register, loading }) => ({ register, submitting: loading.effects['register/submit'], })) @Form.create() export default class Register extends Component { state = { count: 0, confirmDirty: false, visible: false, help: '', prefix: '86', }; componentDidUpdate() { const { form, register, dispatch } = this.props; const account = form.getFieldValue('mail'); if (register.status === 'ok') { dispatch( routerRedux.push({ pathname: '/user/register-result', state: { account, }, }) ); } } componentWillUnmount() { clearInterval(this.interval); } onGetCaptcha = () => { let count = 59; this.setState({ count }); this.interval = setInterval(() => { count -= 1; this.setState({ count }); if (count === 0) { clearInterval(this.interval); } }, 1000); }; getPasswordStatus = () => { const { form } = this.props; const value = form.getFieldValue('password'); if (value && value.length > 9) { return 'ok'; } if (value && value.length > 5) { return 'pass'; } return 'poor'; }; handleSubmit = e => { e.preventDefault(); const { form, dispatch } = this.props; form.validateFields({ force: true }, (err, values) => { if (!err) { const { prefix } = this.state; dispatch({ type: 'register/submit', payload: { ...values, prefix, }, }); } }); }; handleConfirmBlur = e => { const { value } = e.target; const { confirmDirty } = this.state; this.setState({ confirmDirty: confirmDirty || !!value }); }; checkConfirm = (rule, value, callback) => { const { form } = this.props; if (value && value !== form.getFieldValue('password')) { callback('两次输入的密码不匹配!'); } else { callback(); } }; checkPassword = (rule, value, callback) => { const { visible, confirmDirty } = this.state; if (!value) { this.setState({ help: '请输入密码!', visible: !!value, }); callback('error'); } else { this.setState({ help: '', }); if (!visible) { this.setState({ visible: !!value, }); } if (value.length < 6) { callback('error'); } else { const { form } = this.props; if (value && confirmDirty) { form.validateFields(['confirm'], { force: true }); } callback(); } } }; changePrefix = value => { this.setState({ prefix: value, }); }; renderPasswordProgress = () => { const { form } = this.props; const value = form.getFieldValue('password'); const passwordStatus = this.getPasswordStatus(); return value && value.length ? (
100 ? 100 : value.length * 10} showInfo={false} />
) : null; }; render() { const { form, submitting } = this.props; const { getFieldDecorator } = form; const { count, prefix, help, visible } = this.state; return (

注册

{getFieldDecorator('mail', { rules: [ { required: true, message: '请输入邮箱地址!', }, { type: 'email', message: '邮箱地址格式错误!', }, ], })()} {passwordStatusMap[this.getPasswordStatus()]} {this.renderPasswordProgress()}
请至少输入 6 个字符。请不要使用容易被猜到的密码。
} overlayStyle={{ width: 240 }} placement="right" visible={visible} > {getFieldDecorator('password', { rules: [ { validator: this.checkPassword, }, ], })()} {getFieldDecorator('confirm', { rules: [ { required: true, message: '请确认密码!', }, { validator: this.checkConfirm, }, ], })()} {getFieldDecorator('mobile', { rules: [ { required: true, message: '请输入手机号!', }, { pattern: /^1\d{10}$/, message: '手机号格式错误!', }, ], })()} {getFieldDecorator('captcha', { rules: [ { required: true, message: '请输入验证码!', }, ], })()} 使用已有账户登录 ); } }