0
0
Lập trình
Admin Team
Admin Teamtechmely

🔥 Ngừng Viết Boilerplate! Tối Ưu Hóa Form với Formik và React Hooks 🔥

Đăng vào 6 ngày trước

• 6 phút đọc

🔥 Ngừng Viết Boilerplate! Tối Ưu Hóa Form với Formik và React Hooks 🔥

Giới Thiệu

Xử lý form trong React có thể rất phức tạp. Khi các dự án phát triển, các lập trình viên thường bị chôn vùi trong hàng đống công việc như xác thực form, quản lý state và trải nghiệm người dùng không đồng nhất.

Có thể bạn đã nghe về Formik – thư viện form phổ biến cho React. Nhưng nếu tôi nói với bạn rằng nhiều lập trình viên vẫn đang sử dụng nó một cách chưa hiệu quả? Trong bài viết này, chúng ta sẽ khám phá một sự kết hợp mạnh mẽ và ít được biết đến: Formik + Custom React Hooks.

Chúng ta sẽ tìm hiểu cách kết hợp này có thể:

  • Loại bỏ mã boilerplate lặp đi lặp lại 🎯
  • Làm cho các component form của bạn sạch sẽ và dễ bảo trì hơn 💅
  • Cải thiện trải nghiệm xác thực mà không làm bạn đau đầu 🧠

Bạn đã sẵn sàng để tiết kiệm hàng tuần chỉnh sửa logic form trong năm 2024 chưa? Hãy bắt tay vào làm nào! 🛠️


💣 Nỗi Đau: Các Form Trước Khi Có Formik (và Tại Sao Chỉ Dùng Hooks Là Không Đủ)

Một form đăng nhập điển hình trong React có thể trông như sau:

javascript Copy
// LoginForm.jsx
import { useState } from 'react';

function LoginForm() {
  const [email, setEmail] = useState('');
  const [password, setPassword] = useState('');
  const [error, setError] = useState(null);

  const handleSubmit = e => {
    e.preventDefault();
    if (!email || !password) {
      setError('Tất cả các trường đều bắt buộc.');
      return;
    }
    // Gọi API hoặc xác thực...
  };

  return (
    <form onSubmit={handleSubmit}>
      <input type="email" value={email} onChange={e => setEmail(e.target.value)} />
      <input type="password" value={password} onChange={e => setPassword(e.target.value)} />
      {error && <p>{error}</p>}
      <button type="submit">Đăng Nhập</button>
    </form>
  );
}

export default LoginForm;

Không tệ, nhưng đây chỉ là một form đăng nhập. Nếu bạn phải thực hiện xác thực cơ bản trên năm form khác nhau? Bạn sẽ phải lặp lại logic như một robot.


🚀 Giới Thiệu Formik + Yup: Đội Ngũ Xác Thực Tuyệt Vời

Formik giúp đơn giản hóa việc quản lý state và xác thực form. Kết hợp nó với Yup, một thư viện xác thực schema, sẽ thêm vào khả năng xác thực khai báo và có thể kết hợp.

Hãy viết lại form đăng nhập của chúng ta theo cách của Formik:

javascript Copy
// LoginFormWithFormik.jsx
import { Formik, Form, Field, ErrorMessage } from 'formik';
import * as Yup from 'yup';

const LoginSchema = Yup.object().shape({
  email: Yup.string().email('Email không hợp lệ').required('Bắt buộc'),
  password: Yup.string().min(6, 'Quá ngắn').required('Bắt buộc'),
});

function LoginForm() {
  const handleSubmit = (values) => {
    console.log('Đã gửi:', values);
    // Gọi API
  };

  return (
    <Formik
      initialValues={{ email: '', password: '' }}
      validationSchema={LoginSchema}
      onSubmit={handleSubmit}
    >
      <Form>
        <Field name="email" type="email" />
        <ErrorMessage name="email" component="div" />

        <Field name="password" type="password" />
        <ErrorMessage name="password" component="div" />

        <button type="submit">Đăng Nhập</button>
      </Form>
    </Formik>
  );
}

export default LoginForm;

✅ Không cần quản lý useState thủ công

✅ Vô hiệu hóa gửi nếu có lỗi xác thực

✅ Mã sạch, khai báo rõ ràng


🧠 Kết Hợp Siêu Năng Lực: Custom Hooks + Formik Context

Nếu bạn cần sử dụng lại logic kinh doanh giữa các form? Hãy tạo một custom hook để bao bọc logic!

Tạo Hook useLoginForm

javascript Copy
// hooks/useLoginForm.js
import * as Yup from 'yup';

export const useLoginForm = () => {
  const initialValues = { email: '', password: '' };

  const validationSchema = Yup.object({
    email: Yup.string().email('Email không hợp lệ').required('Bắt buộc'),
    password: Yup.string().min(6, 'Tối thiểu 6 ký tự').required('Bắt buộc'),
  });

  const onSubmit = (values, { setSubmitting }) => {
    console.log('Đăng Nhập:', values);
    // ...Gọi API
    setSubmitting(false);
  };

  return { initialValues, validationSchema, onSubmit };
};

Bây giờ cập nhật form của bạn để sử dụng hook này:

javascript Copy
import { Formik, Form, Field, ErrorMessage } from 'formik';
import { useLoginForm } from './hooks/useLoginForm';

function LoginForm() {
  const form = useLoginForm();

  return (
    <Formik {...form}>
      <Form>
        <Field name="email" type="email" />
        <ErrorMessage name="email" component="div" />

        <Field name="password" type="password" />
        <ErrorMessage name="password" component="div" />

        <button type="submit">Đăng Nhập</button>
      </Form>
    </Formik>
  );
}

🧼 Sạch sẽ, không lặp lại (DRY), hoàn toàn có thể tái sử dụng.

Bạn có thể dễ dàng biến useLoginForm thành useFormBuilder(type) và xây dựng một hệ thống form động, thống nhất.


👀 Thưởng Thức: Cải Thiện UX Thực Thời với useField Hook

Formik cũng cho phép bạn truy cập state của field thông qua hooks:

javascript Copy
import { useField } from 'formik';

function FancyEmailInput() {
  const [field, meta] = useField('email');

  return (
    <div>
      <input {...field} type="email" placeholder="Email của bạn là gì?" />
      {meta.touched && meta.error && (
        <span className="error">{meta.error}</span>
      )}
    </div>
  );
}

Sử dụng mẫu này để xây dựng toàn bộ hệ thống thiết kế tương tác mượt mà với Formik.


✨ Những Điều Rút Ra: Sử Dụng Những Mẫu Này Ngày Hôm Nay

Có một vài điều có thể ngay lập tức cải thiện trải nghiệm lập trình viên (Developer Experience - DX) như việc có:

  • Một mẫu logic form nhất quán thông qua custom hooks
  • Xác thực khai báo có thể kiểm tra
  • Các component tách biệt rõ ràng giữa UX và logic

Trong các nhóm, điều này sẽ mang lại lợi ích ngay lập tức bằng cách giảm thời gian onboarding, xem xét PR và lỗi logic bên trong các form.


🧪 Tóm Tắt – Khóa Học Mã

Dưới đây là những gì chúng ta đã đề cập:

✅ Form Thông Thường → Boilerplate

✅ Formik + Yup → Mã sạch hơn, có thể xác thực

✅ Custom Hooks + Formik → Logic có thể mở rộng, tái sử dụng

✅ useField → Tăng cường các component tùy chỉnh


💡 Mẹo Chuyên Nghiệp: Thêm Công Cụ Gỡ Lỗi Formik

javascript Copy
<pre>{JSON.stringify(values, null, 2)}</pre>
<pre>{JSON.stringify(errors, null, 2)}</pre>

Thêm chúng dưới các form trong chế độ phát triển để gỡ lỗi nhanh chóng.


🧭 Nơi Để Tìm Hiểu Thêm

  • Tài liệu Formik
  • Tài liệu Yup
  • Các Thực Hành Tốt Nhất Về Form trong React

👋 Lời Kết

Các form không nhất thiết phải đau đầu. Với sự kết hợp giữa Formik + React Hooks, bạn sẽ viết ít mã hơn, ít lỗi hơn và ngừng kéo tóc của mình ra.

Hãy bắt đầu sử dụng những mẫu này ngay hôm nay và bạn có thể thu hồi khoảng 500 giờ trong năm nay — hoặc ít nhất là giữ được sự tỉnh táo trong lập trình front-end của bạn 😉.

💬 Bạn có một câu chuyện đau đầu nào về form không? Hãy chia sẻ nó trong phần bình luận bên dưới!


🛠️ Tags: react, formik, phát triển-web, năng suất

✨ Nếu bạn cần điều này – chúng tôi cung cấp dịch vụ phát triển frontend!

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào