Thứ năm, 09/04/2020 | 00:00 GMT+7

Cách xác thực biểu mẫu đăng nhập bằng React và Formik

Để đảm bảo một phần tử biểu mẫu của ứng dụng web của bạn đang trả về dữ liệu hợp lệ, sẽ hữu ích khi xây dựng tính năng xác thực tự động vào mã của bạn. Điều này cũng đúng trong React, vì việc tạo xác thực biểu mẫu sớm thường có thể giúp bạn tránh gặp phải lỗi trong quá trình thực hiện.

Trong React, làm việc với và xác thực các biểu mẫu có thể hơi dài dòng. Để làm cho mã của bạn dễ quản lý hơn, bạn có thể sử dụng một gói như Formik để xây dựng biểu mẫu của bạn .

Trong hướng dẫn này, bạn sẽ tạo một dự án React, thêm gói Formik, tùy chỉnh thành phần Formik với lệnh gọi lại onSubmit và chức năng validate thông báo lỗi, sau đó hiển thị các thông báo lỗi đó cho user .

Đến cuối hướng dẫn này, bạn sẽ có một dự án giống như ví dụ trực tiếp này trên CodeSandbox .

Yêu cầu

Bước 1 - Cài đặt dự án

Sử dụng Create React App để tạo một dự án. Đối với mục đích của hướng dẫn, bạn có thể đặt tên cho biểu mẫu xác nhận-phản ứng-đăng nhập dự án của bạn .

  • npx create-react-app validate-react-login-form

Đến đây bạn có thể thay đổi folder dự án, khởi động server nút và xem nó trong trình duyệt web.

  • cd validate-react-login-form
  • npm start

Nếu bạn đã cài đặt yarn , thông báo của bạn có thể hướng dẫn bạn sử dụng yarn start thay vì npm start . Nếu bạn muốn có hướng dẫn npm , bạn có thể sử --use-npm cờ --use-npm khi tạo dự án của bạn . Bạn có thể sử dụng yarn hoặc npm cho hướng dẫn này.

Bạn cũng có thể mở folder dự án này trong trình soạn thảo yêu thích của bạn để tạo và sửa đổi file .

Tạo Ứng dụng React sẽ bao gồm một số file , nhưng với mục đích của hướng dẫn này, bạn sẽ chỉ trực tiếp tạo hoặc sửa đổi ba file : index.js , index.cssValidatedLoginForm.js .

Bước 2 - Cài đặt phụ thuộc

Bây giờ ta đã tạo xong dự án ban đầu, ta sẽ cài đặt ba gói: Formik , email-validatorYup .

Formik giúp việc xử lý xác thực, thông báo lỗi và gửi biểu mẫu dễ quản lý hơn.

Trong terminal của bạn, hãy cài đặt Formik:

  • npm install formik

email-validator là một gói nhỏ được sử dụng để xác thực email.

Nếu terminal của bạn, hãy cài đặt email-validator :

  • npm install email-validator

Yup là một trình xác thực schemas thường được sử dụng cùng với Formik.

Trong terminal của bạn, hãy cài đặt Yup:

  • npm install yup

Đến đây bạn đã cài đặt các gói cần thiết, bạn đã sẵn sàng để tạo thành phần biểu mẫu đã được xác thực.

Bước 3 - Tạo thành phần biểu mẫu được xác thực

Đến đây bạn đã cài đặt các phụ thuộc, bạn có thể bắt đầu viết ValidatedFormComponent của bạn . Hiện tại, bạn sẽ tạo những điều cơ bản và nhập nó vào file root trong ứng dụng để hiển thị nó.

Để làm điều này, bạn sẽ làm như sau:

  • Tạo một thành phần chức năng mới
  • Thêm nội dung hiển thị giả
  • Nhập nó vào index.js

Tạo một file mới trong folder src của bạn có tên là ValidatedLoginForm.js . Bên trong file đó, hãy thêm mã cơ bản cho một thành phần chức năng:

src / ValidatedLoginForm.js
import React from "react";  const ValidatedLoginForm = () => (   <div>     <h1>Validated Form Component</h1>   </div> );  export default ValidatedLoginForm; 

Sau đó, đưa nó vào index.js của bạn:

src / index.js
import ValidatedLoginForm from "./ValidatedLoginForm"; 

Tiếp theo, hãy tham khảo thành phần:

src / index.js
<ValidatedLoginForm /> 

Khi bạn đặt tất cả các phần đó lại với nhau, index.js sẽ trông như thế này:

src / index.js
import React from "react"; import ReactDOM from "react-dom";  import ValidatedLoginForm from "./ValidatedLoginForm";  function App() {   return (     <div className="App">       <h1>Validated Login Form</h1>       <ValidatedLoginForm />     </div>   ); }  const rootElement = document.getElementById("root"); ReactDOM.render(<App />, rootElement); 

Bạn sẽ thấy thành phần biểu mẫu được hiển thị:

Thành phần biểu mẫu được xác thực trong CodeSandbox

Bây giờ, hãy truy cập lại ValidatedLoginForm.js để triển khai Formik.

Đầu tiên, nhập Formik, email-validator và Yup trong thành phần mới của bạn:

src / ValidatedLoginForm.js
import { Formik } from "formik"; import * as EmailValidator from "email-validator"; // used when validating with a self-implemented approach import * as Yup from "yup"; // used when validating with a pre-built solution 

Bây giờ, hãy viết thẻ Formik với các giá trị ban đầu. Hãy nghĩ về các giá trị ban đầu như cài đặt trạng thái của bạn ban đầu.

Bạn cũng cần một cuộc gọi lại onSubmit . Lệnh gọi lại này sẽ nhận hai tham số, giá trị và một đối tượng, mà bạn có thể cấu trúc lại. Các giá trị đại diện cho các giá trị đầu vào từ biểu mẫu của bạn. Bạn sẽ thêm một số mã giả vào đây để mô phỏng cuộc gọi đăng nhập không đồng bộ, sau đó đăng xuất các giá trị là gì.

Trong lệnh gọi lại, hãy gọi hàm setSubmitting đã bị hủy từ các tham số thứ hai. Điều này sẽ cho phép bạn bật hoặc tắt nút Gửi trong khi cuộc gọi đăng nhập không đồng bộ đang diễn ra:

src / ValidatedLoginForm.js
  <Formik     initialValues={{ email: "", password: "" }}     onSubmit={(values, { setSubmitting }) => {       setTimeout(() => {         console.log("Logging in", values);         setSubmitting(false);       }, 500);     }}   >     <h1>Validated Login Form</h1>   </Formik> 

Kết xuất đạo cụ

Thành phần Formik sử dụng các đạo cụ kết xuất để cung cấp các biến và hàm nhất định cho biểu mẫu mà ta tạo.

Tóm lại, render props được sử dụng để truyền các thuộc tính cho các phần tử con của một thành phần. Trong trường hợp này, Formik sẽ chuyển các thuộc tính đến mã biểu mẫu của bạn, đó là mã con. Lưu ý bạn đang sử dụng hàm hủy để tham chiếu đến một số biến và hàm cụ thể.

src / ValidatedLoginForm.js
    {props => {       const {         values,         touched,         errors,         isSubmitting,         handleChange,         handleBlur,         handleSubmit       } = props;        return (         <div>           <h1>Validated Login Form</h1>         </div>       );     }} 

Đến đây, ValidatedLoginForm.js sẽ giống như sau:

import React from "react";  import { Formik } from "formik"; import * as EmailValidator from "email-validator"; import * as Yup from "yup";  const ValidatedLoginForm = () => (   <Formik     initialValues={{ email: "", password: "" }}     onSubmit={(values, { setSubmitting }) => {       setTimeout(() => {         console.log("Logging in", values);         setSubmitting(false);       }, 500);     }}   >     {props => {       const {         values,         touched,         errors,         isSubmitting,         handleChange,         handleBlur,         handleSubmit       } = props;        return (         <div>           <h1>Validated Login Form</h1>         </div>       );     }}   </Formik> );  export default ValidatedLoginForm; 

Bước 4 - Hiển thị Biểu mẫu

Đến đây bạn có thể bắt đầu viết mã để hiển thị biểu mẫu. Biểu mẫu sẽ có hai đầu vào (email và password ), nhãn cho mỗi đầu và nút gửi.

src / ValidatedLoginForm.js
    {props => {       const {         values,         touched,         errors,         isSubmitting,         handleChange,         handleBlur,         handleSubmit       } = props;        return (         <form onSubmit={handleSubmit}>            <label htmlFor="email">Email</label>           <input             id="email"             name="email"             type="text"             placeholder="Enter your email"           />            <label htmlFor="password">Password</label>           <input             id="password"             name="password"             type="password"             placeholder="Enter your password"           />            <button type="submit">             Login           </button>          </form>       );      }} 

Lưu ý onSubmit đang gọi handleSubmit từ props.

Trước đó, người ta đã đề cập rằng bạn có thể vô hiệu hóa nút gửi của bạn trong khi user đang cố đăng nhập. Bạn có thể thêm thay đổi đó ngay bây giờ bằng cách sử dụng thuộc tính isSubmitting mà bạn đã hủy từ các đạo cụ trước đó:

src / ValidatedLoginForm.js
<button type="submit" disabled={isSubmitting}>   Login </button> 

Bạn có thể sử dụng CSS sau cho file styles.css của bạn :

src / styles.css
.App {   font-family: sans-serif; }  h1 {   text-align: center; }  form {   max-width: 500px;   width: 100%;   margin: 0 auto; }  label, input {   display: block;   width: 100%; }  label {   margin-bottom: 5px;   height: 22px; }  input {   margin-bottom: 20px;   padding: 10px;   border-radius: 3px;   border: 1px solid #777; }  input.error {   border-color: red; }  .input-feedback {   color: rgb(235, 54, 54);   margin-top: -15px;   font-size: 14px;   margin-bottom: 20px; }  button {   padding: 10px 15px;   background-color: rgb(70, 153, 179);   color: white;   border: 1px solid rgb(70, 153, 179);   transition: ease-in-out background-color 250ms, ease-in-out color 250ms; }  button:hover {   cursor: pointer;   background-color: white;   color: rgb(70, 153, 179); } 

Ngoài ra, nhập styles.css trong index.js .

src / index.js
import "./styles.css"; 

Bước 5 - Thêm Logic tin nhắn xác thực

Bây giờ hãy xác thực đầu vào của ta . Bước đầu tiên là xác định những ràng buộc nào ta muốn có đối với đầu vào của bạn . Hãy bắt đầu với email. Đầu vào email phải:

  • Được yêu cầu.
  • Trông giống như một email thực sự.

Nhập password phải:

  • Được yêu cầu.
  • Dài ít nhất tám ký tự.
  • Chứa ít nhất một số.

Ta sẽ đề cập đến hai cách để tạo những tin nhắn này, một cách thủ công và một cách sử dụng Yup.

Viết giải pháp xác thực password của bạn

Tùy chọn đầu tiên là tự tạo chức năng xác thực của ta . Mục đích của hàm là lặp lại các giá trị trong biểu mẫu của ta , xác thực các giá trị này theo bất kỳ cách nào mà ta thấy phù hợp và trả về một đối tượng errors có các cặp giá trị chính là valuemessage .

Bên trong thẻ Formik, hãy bắt đầu bằng việc thêm mã sau. Điều này sẽ luôn thêm lỗi Invalid email cho email.

src / ValidatedLoginForm.js
  validate={values => {     let errors = {};     errors.email = "Invalid email";     return errors;   }} 

Bây giờ, bạn có thể đảm bảo user đã nhập nội dung nào đó cho email:

src / ValidatedLoginForm.js
  validate={values => {     let errors = {};     if (!values.email) {       errors.email = "Required";     }      return errors;   }} 

Sau đó, bạn có thể kiểm tra xem email có phải là email hợp lệ hay không bằng cách sử dụng gói xác thực email. Điều này sẽ trông gần giống như kiểm tra email tương đương:

src / ValidatedLoginForm.js
  validate={values => {     let errors = {};     if (!values.email) {       errors.email = "Required";     } else if (!EmailValidator.validate(values.email)) {       errors.email = "Invalid email address.";     }     return errors;   }} 

Điều đó sẽ chăm sóc email, vì vậy bạn sẽ làm việc trên biểu mẫu password . Trước tiên, bạn sẽ kiểm tra xem user nhập nội dung nào:

src / ValidatedLoginForm.js
  validate={values => {     let errors = {};     if (!values.password) {       errors.password = "Required";     }      return errors;   }} 

Đến đây bạn cần đảm bảo độ dài ít nhất là tám ký tự:

src / ValidatedLoginForm.js
  validate={values => {     const passwordRegex = /(?=.*[0-9])/;     if (!values.password) {       errors.password = "Required";     } else if (values.password.length < 8) {       errors.password = "Password must be 8 characters long.";     }       return errors;   }} 

Cuối cùng, hãy kiểm tra xem password có chứa ít nhất một số hay không. Đối với điều này, bạn có thể sử dụng regex:

src / ValidatedLoginForm.js
  validate={values => {     let errors = {};      const passwordRegex = /(?=.*[0-9])/;     if (!values.password) {       errors.password = "Required";     } else if (values.password.length < 8) {       errors.password = "Password must be 8 characters long.";     } else if (!passwordRegex.test(values.password)) {       errors.password = "Invalid password. Must contain one number.";     }      return errors;   }} 

Tệp đã hoàn thành sẽ giống như sau:

src / ValidatedLoginForm.js
  validate={values => {     let errors = {};     if (!values.email) {       errors.email = "Required";     } else if (!EmailValidator.validate(values.email)) {       errors.email = "Invalid email address.";     }      const passwordRegex = /(?=.*[0-9])/;     if (!values.password) {       errors.password = "Required";     } else if (values.password.length < 8) {       errors.password = "Password must be 8 characters long.";     } else if (!passwordRegex.test(values.password)) {       errors.password = "Invalid password. Must contain one number.";     }      return errors;   }} 

Sử dụng Giải pháp xác thực password của bên thứ ba

Bạn có thể nhận thấy rằng việc xử lý logic xác thực theo cách riêng của ta sẽ hơi dài dòng. Bạn phải thực hiện thủ công tất cả các kiểm tra. Yup có thể giúp bạn tiết kiệm một số công việc này. Khi sử dụng Yup, bạn sẽ không còn thấy thuộc tính Validate mà thay vào đó là dùng validationSchema .

Hãy bắt đầu với email. Đây là cách xác nhận tương đương bằng Yup:

src / ValidatedLoginForm.js
  validationSchema={Yup.object().shape({     email: Yup.string()       .email()       .required("Required")   })} 

Bây giờ, đối với password :

src / ValidatedLoginForm.js
  validationSchema={Yup.object().shape({     email: Yup.string()       .email()       .required("Required"),     password: Yup.string()       .required("No password provided.")       .min(8, "Password is too short - should be 8 chars minimum.")       .matches(/(?=.*[0-9])/, "Password must contain a number.")   })} 

Đến đây bạn đã khám phá hai phương pháp khác nhau để xác thực biểu mẫu. Tiếp theo bạn sẽ cập nhật mã để hiển thị thông báo lỗi.

Bước 6 - Hiển thị xác thực và thông báo lỗi

Bây giờ ta đã có logic để tạo thông báo lỗi, ta cần hiển thị chúng. Bạn cần cập nhật các đầu vào trong biểu mẫu của bạn để thực hiện việc này.

Ta cần cập nhật một số thuộc tính cho cả đầu vào email và password :

  • value
  • onChange
  • onBlur
  • className

Áp dụng các đạo cụ kết xuất cho trường email

Hãy bắt đầu bằng cách cập nhật value , onChangeonBlur . Mỗi trong số này sẽ sử dụng các thuộc tính từ các đạo cụ kết xuất:

src / ValidatedLoginForm.js
<input   id="email"   name="email"   type="text"   placeholder="Enter your email"   value={values.email}   onChange={handleChange}   onBlur={handleBlur} /> 

Sau đó, bạn có thể thêm một lớp "lỗi" có điều kiện trong trường hợp có bất kỳ lỗi nào. Bạn có thể kiểm tra lỗi bằng cách xem đối tượng errors .

Bạn cũng có thể kiểm tra thuộc tính đã chạm để xem liệu user đã tương tác với đầu vào email hay chưa trước khi hiển thị thông báo lỗi.

src / ValidatedLoginForm.js
<input   id="email"   name="email"   type="text"   placeholder="Enter your email"   value={values.email}   onChange={handleChange}   onBlur={handleBlur}   className={errors.email && touched.email && "error"} /> 

Cuối cùng, nếu có lỗi, bạn sẽ hiển thị chúng cho user .

Kết quả cuối cùng cho trường email sẽ như thế này:

src / ValidatedLoginForm.js
<label htmlFor="email">Email</label> <input   id="email"   name="email"   type="text"   placeholder="Enter your email"   value={values.email}   onChange={handleChange}   onBlur={handleBlur}   className={errors.email && touched.email && "error"} /> {errors.email && touched.email && (   <div className="input-feedback">{errors.email}</div> )} 

Áp dụng các đạo cụ kết xuất cho trường password

Đến đây bạn cần làm tương tự với password . Các bước này tương tự như email.

Kết quả cuối cùng cho trường password sẽ như thế này:

src / ValidatedLoginForm.js
<label htmlFor="password">Password</label> <input   id="password"   name="password"   type="password"   placeholder="Enter your password"   value={values.password}   onChange={handleChange}   onBlur={handleBlur}   className={errors.password && touched.password && "error"} /> {errors.password && touched.password && (   <div className="input-feedback">{errors.password}</div> )} 

Bước 7 - Kiểm tra xác thực

Bây giờ biểu mẫu của bạn đã hoàn tất, bạn đã sẵn sàng để kiểm tra nó. Bạn có thể bắt đầu bằng cách nhấp vào nút mà không cần nhập bất cứ thứ gì. Bạn sẽ thấy thông báo xác thực:

Thông báo xác thực trong biểu mẫu đăng nhập

Bây giờ, ta có thể nhận được thông báo cụ thể hơn để thử nghiệm Làm mới trang web để làm điều này. Nhấp vào bên trong của đầu vào email, nhưng không nhập bất kỳ thứ gì:

Tập trung trường email trong biểu mẫu đăng nhập

Sau đó, nhấp ra khỏi đầu vào. Bạn sẽ thấy thông báo Required bật lên. Lưu ý thông báo này không tự động bật lên khi tải trang. Bạn chỉ muốn hiển thị thông báo lỗi sau khi user đã tương tác với đầu vào.

Lỗi xác thực email trong biểu mẫu đăng nhập

Bây giờ, hãy bắt đầu nhập. Bạn sẽ nhận được một thông báo về email không hợp lệ.

Thông báo email không hợp lệ trong biểu mẫu đăng nhập

Nhập một email hợp lệ và xem thông báo lỗi của bạn biến mất.

Email hợp lệ trong biểu mẫu đăng nhập

Bây giờ, làm tương tự cho password . Nhấp vào đầu vào, sau đó nhấn đi, và bạn sẽ nhận được thông báo cần thiết.

Thông báo password  bắt buộc trong biểu mẫu đăng nhập

Sau đó, bắt đầu nhập và bạn sẽ thấy xác nhận độ dài.

Thông báo xác thực độ dài trong biểu mẫu đăng nhập

Sau đó, nhập tám hoặc nhiều ký tự không bao gồm số và bạn sẽ thấy thông báo must contain a number .

thông báo "phải chứa một số" trong biểu mẫu đăng nhập

Cuối cùng, thêm một số và thông báo lỗi sẽ không xuất hiện .

Mật khẩu hợp lệ trong biểu mẫu đăng nhập

Kết luận

Đến đây bạn đã tạo một biểu mẫu với xác thực tự động trong React, sử dụng Formik và Yum.

Để biết thêm các hướng dẫn về React, hãy xem trang Chủ đề React của ta .


Tags:

Các tin liên quan