Advertisement
Guest User

Untitled

a guest
Feb 21st, 2019
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.73 KB | None | 0 0
  1. input.jsx
  2. -------------
  3. import React, { Component } from 'react';
  4.  
  5. const Input = ({ name, label, error , ...rest }) => {
  6. return (
  7. <div className="form-group">
  8. <label htmlFor={name}>{label}</label>
  9. <input
  10. // value={value}
  11. // onChange={onChange}
  12. {...rest}
  13. id={name}
  14. name={name}
  15. className="form-control"
  16. />
  17.  
  18. {error && <div className="alert alert-danger">{error}</div>}
  19. </div>
  20. );
  21.  
  22. }
  23.  
  24. export default Input;
  25. ----------------------------------------------------------------------------------------------------
  26. Form.jsx
  27. ---------
  28. import React, { Component } from 'react';
  29. import Joi from 'joi-browser';
  30. import Input from './input';
  31.  
  32. class Form extends Component {
  33. state = {
  34. data: {},
  35. errors: {}
  36. };
  37.  
  38. validate = () => {
  39. const options = { abortEarly: false };
  40. const { error } = Joi.validate(this.state.data, this.schema, options);
  41.  
  42. if (!error) return null;
  43.  
  44. const errors = {};
  45. for (let item of error.details)
  46. errors[item.path[0]] = item.message;
  47.  
  48. return errors;
  49. };
  50.  
  51. validateProperty = ({ name, value }) => {
  52.  
  53. const obj = { [name]: value };
  54. const schema = { [name]: this.schema[name] };
  55. const { error } = Joi.validate(obj, schema);
  56. return error ? error.details[0].message : null;
  57. // if(!error) return null;
  58. // return error.details[0].message;
  59.  
  60. };
  61.  
  62. handleSubmit = e => {
  63. e.preventDefault();
  64.  
  65. const errors = this.validate();
  66. this.setState({ errors: errors || {} });
  67. if (errors) return;
  68.  
  69. this.doSubmit();
  70. };
  71.  
  72. handleChange = ({ currentTarget: input }) => {
  73.  
  74. const errors = { ...this.state.errors };
  75. const errorMessage = this.validateProperty(input);
  76. if (errorMessage) errors[input.name] = errorMessage;
  77. else
  78. delete errors[input.name];
  79.  
  80.  
  81. const data = { ...this.state.data };
  82. data[input.name] = input.value;
  83. this.setState({ data, errors });
  84. };
  85.  
  86. renderButton(label) {
  87. return (
  88. <button
  89. disabled={this.validate()} className="btn btn-primary">
  90. {label}
  91. </button>
  92. );
  93. }
  94.  
  95. renderInput(name,label,type){
  96. const { data, errors } = this.state;
  97. return(
  98.  
  99. <Input
  100. type={type}
  101. name={name}
  102. value={data[name]}
  103. label={label}
  104. onChange={this.handleChange}
  105. error={errors[name]}
  106. />
  107. );
  108. }
  109.  
  110. }
  111.  
  112. export default Form;
  113. --------------------------------------------------------------------------------------------------
  114. loginForm.jsx
  115. -------------
  116. import React, { Component } from 'react';
  117. import Joi from 'joi-browser';
  118. import Form from './common/form';
  119.  
  120. class LoginForm extends Form {
  121. state = {
  122. data: { username: '', password: '' },
  123. errors: {}
  124. };
  125.  
  126. schema = {
  127. username: Joi.string().required().label('Username'),
  128. password: Joi.string().required().label('Password')
  129.  
  130. };
  131.  
  132. doSubmit = () => {
  133. //Call the server
  134. console.log('Submitted');
  135. };
  136.  
  137. render() {
  138.  
  139. return (
  140. <div>
  141. <h1>Login</h1>
  142. <form onSubmit={this.handleSubmit} >
  143.  
  144. {this.renderInput('username', 'Username')}
  145. {this.renderInput('password', 'Password',"password")}
  146. {this.renderButton("Login")}
  147.  
  148. </form>
  149.  
  150. </div>
  151. );
  152. }
  153. }
  154.  
  155. export default LoginForm;
  156.  
  157. ---------------------------------------------------------------------------------------------
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement