validateProperty یک خاصیت را تعیین اعتبار میکند، اما برای تطابق پسوردها، نیاز به تعیین اعتبار دو خاصیت را با هم دارد. به همین جهت برای مثال میتوان پارامتر چهارمی را به نام correspond، در اینجا اضافه کرد تا فیلد متناظر با آنرا هم مشخص کند:
renderInput(name, label, type = "text", correspond) { const { data, errors } = this.state; return ( <Input name={name} type={type} label={label} value={data[name]} onChange={this.handleChange} error={errors[name]} correspond={correspond} /> ); }
<form onSubmit={this.handleSubmit}> {this.renderInput("username", "Username")} {this.renderInput("password", "Password", "password")} {this.renderInput( "confirmPassword", "Confirm Password", "password", "password" )} {this.renderInput("name", "Name")} {this.renderButton("Register")} </form>
state = { data: { username: "", password: "", name: "", confirmPassword: "" }, errors: {}, }; schema = { username: Joi.string() .required() .email({ minDomainSegments: 2, tlds: { allow: ["com", "net", "info"] } }) .label("Username"), password: Joi.string().required().min(5).label("Password"), name: Joi.string().required().label("Name"), confirmPassword: Joi.any().valid(Joi.ref("password")).required().messages({ "any.only": "با رمز عبور مطابقت ندارد", }), };
validateProperty = ({ name, value, attributes }) => { const userInputObject = { [name]: value }; const schemaMap = { [name]: this.schema[name] }; if (attributes.correspond) { const correspondFieldName = attributes.correspond.value; userInputObject[correspondFieldName] = this.state.data[ correspondFieldName ]; schemaMap[correspondFieldName] = this.schema[correspondFieldName]; } const propertySchema = Joi.object(schemaMap); const { error } = propertySchema.validate(userInputObject, { abortEarly: true, }); return error ? error.details[0].message : null; };