反応の形態🚧 最も単純な
11942 ワード
Form validation can be a nightmare sometimes. After trying out some patterns of code, I came to a conclusion. That this can be an optimal solution without any plugins.
NOTE: Better ways are always welcome & I'm in search for it ⌛
Code Sandbox Link
入力フィールド
Let's get started. First things first. Let's create a component for input field.
- input field to accept user inputs and pass other common props
- handleInvalid method to do it's magic when it detects error
- onChange method to reset the error and pass on the control to the parent component
import React from "react";
/** We'll be using this only for username and password **/
export const InputField = props => {
const { message, ...rest } = props; // Filter what you need and transfer rest to input
let [error, setError] = React.useState(false); //display error message
const handleInvalid = e => {
e.preventDefault();
setError(true);
props.handleInvalid(e);
}; // Handle error
const onChange = e => {
setError(false);
props.handleChange(e);
}; // Reset error
// The Component
return (
<div className="input-container">
<input {...rest} onInvalid={handleInvalid} onChange={onChange} />
{error ? <span className="error-message">{message}</span> : ""}
</div>
);
};
フォームコンポーネント
Now let's create a Form Component that will wrap our input fields around a form and some methods to handle it.
- We have a state variable which will hold our form object
- handleChange method to handle specific updates in input fields according to name.
- handleSubmit method which would help us hitting API once all fields are filled properly
- action="javascript:void(0)" this was of my particular interest when I was trying to find out the best way to handle forms. It would prevent the form element from doing default work.
import React from "react";
import { InputField } from "./InputField";
export const Form = props => {
const [state, setState] = React.useState({ mail: "", password: "" });
const handleChange = e =>
setState({ ...state, [e.target.name]: e.target.value });
const handleSubmit = e => console.info("FORMDATA", state);
return (
<form
action="javascript:void(0)"
onChange={handleChange}
onSubmit={handleSubmit}
>
<InputField name="mail" type="email" message="We need a proper mail id" />
<InputField name="password" minLength="9" type="password" message="Not a valid password"
/>
<input type="submit" value="Login" />
</form>
);
};
アプリ。CSS
今すぐにいくつかのcssを追加してみましょう
.error-message {
color: darkred;
text-align: right;
font-size: 12px;
}
.input-container {
display: flex;
flex-direction: column;
width: 40%;
margin: auto;
}
.input-container > input {
border-top: none;
border-right: none;
border-left: none;
margin-bottom: 5px;
margin-top: 20px;
}
input:invalid {
border-color: darkred;
}
それで、私は、それが反応でフォームを取り扱うことがどれくらい簡単であることを望みます.それはすべてのパターンです.私はフォームでさらにベストプラクティスを探しているとして、批評家は大歓迎です.これより良い何かがあるならば、ちょっと知らせてください
Reference
この問題について(反応の形態🚧 最も単純な), 我々は、より多くの情報をここで見つけました https://dev.to/droidmakk/forms-in-react-the-simplest-39peテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol