I learn learning ReacJS and i come across custom Custom hooks and Dynamic Reusable Input components
Check this code
export default function Input({ label, id, error, ...props }) {
return (
<div className="control no-margin">
<label htmlFor={id}>{label}</label>
<input id={id} {...props} />
<div className="control-error">{error && <p>{error}</p>}</div>
</div>
);
}
How to use this component
- Import this component to use file.
import Input from "./Inputs";
2. Call this components and pass required arguments
<Input
label="Email"
id="email"
type="text"
name="email"
onBlur={handleEmailBlur}
onChange={handleEmailChange}
value={emailValue}
error={emailHasError && "Please ented a valid input"}
/>
Check this example in action.
Building Custom Hooks
I am pasting code i use in above code.
import { useState } from "react";
export function useInput(defaultValue, validationFn) {
const [enteredValue, setEnteredValue] = useState(defaultValue);
const [didEdit, setDidEdit] = useState(false);
const valueIsValid = validationFn(enteredValue);
function handleInputChange(event) {
setEnteredValue(event.target.value);
setDidEdit(false);
}
function handleInputBlur() {
setDidEdit(true);
}
return {
value: enteredValue,
handleInputChange,
handleInputBlur,
hasError: didEdit && !valueIsValid,
};
}
How to hook this hook, Check below code.
import Input from "./Inputs";
import { isEmail, isNotEmpty, hasMinLength } from "../util/validation.js";
import { useInput } from "../hooks/useInput";
export default function Login() {
const {
value: emailValue,
handleInputChange: handleEmailChange,
handleInputBlur: handleEmailBlur,
hasError: emailHasError,
} = useInput("", (value) => {
return isEmail(value) && isNotEmpty(value);
});
//rest of the code...
return (
//returning jsx code...
)
}