使用您猜對的set_password.js
組件,可讓用戶設置其密碼。它讓他們輸入兩次以確保它們匹配。密碼應該具有至少8個字符長度,一個大寫字母,一個數字,一個特殊字符的標準。沒有什麼突破。驗證字符串長度並確保它包含React Redux表單中的某些字符
我知道如何驗證這個東西的服務器端,但寧願驗證它的客戶端,所以用戶不必等待服務器響應。我正在努力如何去做。
我有一個validate
函數,它從字段中取值並驗證它們。
function validate(values) {
const errors = {};
if (!values.password1) {
errors.password1 = 'This field cannot be empty.'
}
if (!values.password2) {
errors.password2 = 'This field cannot be empty.'
}
if (values.password1.length < 8) {
errors.password1 = 'The password provided is not long enough.'
}
if (values.password2.length < 8) {
errors.password2 = 'The password provided is not long enough.'
}
return errors
}
這是我到目前爲止,我得到一個錯誤Cannot read property 'length' of undefined
,所以我顯然把這個邏輯在錯誤的區域。
我開始認爲我應該把它放在動作中,所以只有在用戶確認onSubmit
之後才能進行驗證。我想這將是這個樣子:
onSubmit(values) {
this.props.setPassword(values, this.props.match.params);
}
export function setPassword({ password1, password2 }, { id, key }) {
return function(dispatch) {
if (password1.length < 8 && password2.length < 8) {
axios
.post(
`${ROOT_URL}/api/auth/set_password/`,
{ password1, password2, id, key }
)
.then(response => {
console.log('Password changed')
})
.catch(error => {
dispatch(authError(error.response.data.non_field_errors[0]));
});
}
}
}
不管怎樣,那麼什麼是實現這一目標的正確方法是什麼?檢查字符串的長度,是否至少有一個大寫字母,即有一個特殊字符和一個數字?
編輯:
相關表格數據:
// This renders errors regarding the form inputs
renderField(field) {
const {
label,
type,
name,
meta: {
touched,
error
}
} = field;
return (
<div className='form-group'>
<label>{label}</label>
<input
className='form-control'
type={type}
placeholder={label}
{...field.input}
/>
<div className='text-danger'>
{touched ? error : ""}
</div>
</div>
);
}
// The main body to be rendered
render() {
if (this.props.permitRender) {
const { handleSubmit } = this.props;
return (
<div>
<h3>Set New Password</h3>
<p>Type your new password twice. </p>
<p>It must be a minimum of 8 characters in length and contain at least:</p>
<ol>
<li>One uppercase character</li>
<li>One special character</li>
<li>One number</li>
</ol>
<form onSubmit={handleSubmit(this.onSubmit.bind(this))}>
{this.renderAlert()}
<Field
label='Enter New Password'
name='password1'
type='password'
component={this.renderField}
/>
<Field
label='Confirm New Password'
name='password2'
type='password'
component={this.renderField}
/>
<button type="submit" className="btn btn-primary">Submit</button>
</form>
</div>
);
} else if (!this.props.permitRender) {
return (
<div> { this.renderAlert() } </div>
);
}
}
我強烈建議使用[jQuery Validation Plugin。](https://jqueryvalidation.org/) –
您可以發佈表單的相關部分的密碼字段嗎? – Dario
確定添加了表單數據。 – sockpuppet