ONETECH ASIA
ONETECH ASIA
Liên hệ ngay
ContactinsightScanX
Blog

Thư viện Validate dữ liệu hữu ích cho lập trình viên Web Frontend - YUP

Đỗ Trọng Hảo

12/01/2024

PROT0

Yup là một thư viện để validate form. Yup validate dữ liệu dựa trên schema được định nghĩa của form, là thư viện giúp lập trình viên web frontend dễ dàng hơn với validate dữ liệu, tập trung vào việc phát triển ứng dụng và tiết kiệm được thời gian làm việc cũng như hạn chế lỗi lập trình xảy ra.

Nó có hơn bốn triệu lượt tải hàng tuần với kích thước 243kb tại thời điểm viết blog.

Thư viện Validate dữ liệu hữu ích cho lập trình viên Web Frontend - YUP

Nó có hơn hai mươi nghìn sao trên github tại thời điểm viết blog.

Thư viện Validate dữ liệu hữu ích cho lập trình viên Web Frontend - YUP

Các dữ liệu trên đã chứng minh được tính mạnh mẽ, cộng đồng sử dụng lớn và mức độ tin tưởng để sử dụng thư viện này vào các dự án của mình.

PROT1

Chia thành 5 cấp độ làm việc với Yup từ sử dụng cơ bản đến nâng cao!

PROT2

Việc sử dụng Yup gồm 2 bước:

+ Bước: 1: Định nghĩa schema

Bạn định nghĩa schema bằng yup.object.shape(). Tham số truyền vào là một object chứa các field và các định nghĩa validate của field đó.

+ Bước 2: Truyền data vào để validate nó.

Thư viện Validate dữ liệu hữu ích cho lập trình viên Web Frontend - YUP

Trong ví dụ dưới đây, mình định nghĩa name là kiểu chuỗi, bắt buộc, age kiểu số và giá trị nhỏ nhất phải là 18.

PROT18

Khi mình truyền data với name là “test”, age là 11 thì mình sẽ nhận về một lỗi là một mảng dữ liệu với message: “age must be greater than or equal to 18”

Thư viện Validate dữ liệu hữu ích cho lập trình viên Web Frontend - YUP

Khi có lỗi, Yup sẽ trả về cho bạn một đối tượng lỗi ValidationError, bên dưới là định nghĩa ValidationError trên document của Yup.

Thư viện Validate dữ liệu hữu ích cho lập trình viên Web Frontend - YUP

 Đối tượng ValidationError gồm:

  • name với giá trị là “ValidationError”
  • type là loại lỗi
  • value là giá trị được test
  • params là các tham số như max value, regex
  • path là field lỗi
  • errors là một array message
  • inner: Khi abortEarlyfalse sẽ trả về một array với mỗi item là một ValidationError

Ở trên mình có nhắc đến abortEarly, vậy abortEarly là gì?

abortEarly sẽ có hai giá trị:

+ true: khi validate đến một field bị lỗi sẽ trả về lỗi luôn mà không validate tiếp những field khác.

+ false: sẽ validate toàn bộ schema và lấy tất cả các lỗi ra.

Hãy xem ví dụ sau:

PROT19

Khi chạy đoạn code trên, kết quả sẽ trả về một array gồm hai item ở dạng object ValidationError.

Thư viện Validate dữ liệu hữu ích cho lập trình viên Web Frontend - YUP
PROT20

Khi chạy đoạn code trên, kết quả sẽ trả về một array gồm một item là field validate lỗi đầu tiên.

Thư viện Validate dữ liệu hữu ích cho lập trình viên Web Frontend - YUP

Như bạn thấy, message trả về là message mặc định của Yup, vậy nếu muốn tùy chỉnh nội dung message thì làm thế nào?

Bạn chỉ cần truyền message tùy chỉnh vào function mà bạn validate. Như ví dụ bên dưới, mình đã tùy chỉnh hai message trả về của field name ở method required và field age ở method min.

PROT21
Thư viện Validate dữ liệu hữu ích cho lập trình viên Web Frontend - YUP

Yup cung cấp các kiểu dữ liệu sau:

  • String
  • Number
  • Boolean
  • Date
  • Array
  • Object
  • Mixed/Schema

Từng kiểu dữ liệu, Yup cũng đã cung cấp các method cho nó như kiểu String gồm: required, length, min, max …

Thư viện Validate dữ liệu hữu ích cho lập trình viên Web Frontend - YUP

Bạn có thể tham khảo thêm tại https://github.com/jquense/yup/tree/pre-v1#api

PROT5

Nếu bạn cần một logic mà không có method nào được Yup cung cấp sẵn, bạn sẽ cần tùy chỉnh logic xử lý. Hãy sử dụng method test, bên dưới là định nghĩa test trên document của Yup.

Thư viện Validate dữ liệu hữu ích cho lập trình viên Web Frontend - YUP

Method test gồm 3 tham số:

+ name: tên của tùy chỉnh logic

+ message: nội dung message sẽ được trả về nếu dữ liệu không khớp với logic xử lý.

+ function: hàm viết nội dung của logic xử lý. Hàm sẽ trả về true nếu hợp lệ và false nếu không hợp lệ.

Xét ví dụ bên dưới:

PROT22

Mình định nghĩa method tùy chỉnh logic với hàm test tên là “name-not-includes-spam”, message là “Name must not spam”. Dữ liệu truyền vào gồm chữ spam, khi chạy code trên sẽ nhận được message “Name must not spam”.

Thư viện Validate dữ liệu hữu ích cho lập trình viên Web Frontend - YUP

Method test bạn có thể sử dụng nhiều lần để validate nhiều logic được nhé!

PROT6

Ví dụ mình có một form set password, form gồm field password và confirm-password. Mình muốn validate là field confirm-pasword có giống với password hay không?

Thư viện Validate dữ liệu hữu ích cho lập trình viên Web Frontend - YUP

Mình sẽ sử dụng hai method là refoneOf mà Yup cung cấp, bên dưới là định nghĩa ref và oneOf trên document của Yup.

Thư viện Validate dữ liệu hữu ích cho lập trình viên Web Frontend - YUP
Thư viện Validate dữ liệu hữu ích cho lập trình viên Web Frontend - YUP

+ ref sẽ tham chiếu đến field trong schema

+ oneOf là field đó phải chứa giá trị nằm trong mảng được cung cấp trong param truyền vào oneOf.

Xét đoạn code bên dưới:

PROT23

Khi chạy đoạn code trên sẽ nhận về message lỗi “Password confirm not matching”

Thư viện Validate dữ liệu hữu ích cho lập trình viên Web Frontend - YUP

Tôi có thể sử dụng ref trong method test không?

Câu trả lời là không. Thay vào đó bạn có thể sử dụng this.parent.password như sau:

PROT24

PROT7

Ví dụ mình có một switch và một input. Mình muốn khi switch được bật lên thì sẽ kiểm tra input nhập vào có phải là url hay không? Nếu như switch không được bật, sẽ không validate input này.

Thư viện Validate dữ liệu hữu ích cho lập trình viên Web Frontend - YUP

Yup có cung cấp một method when, method gồm các tham số:

+ key: tên field cần xét điều kiện

+ object builder: là điều kiện xử lý gồm: is, thenotherwise. is chứa điều kiện field đó bằng với giá trị gì. Nếu istrue thì sẽ thực hiện then, ngược lại sẽ thực hiện otherwise. Thuộc tính otherwise là tùy chọn, có thể có hoặc không. Thuộc tính is có thể là một function.

Bên dưới là định nghĩa when trên document của Yup.

Thư viện Validate dữ liệu hữu ích cho lập trình viên Web Frontend - YUP

Xét ví dụ bên dưới:

PROT25

Mình đã gắn method when vào field url, nếu field active có giá trị true thì thì sẽ kiểm tra thêm requiredurl cho field url.

Khi chạy đoạn code trên sẽ trả về message “url must be a valid URL”

Thư viện Validate dữ liệu hữu ích cho lập trình viên Web Frontend - YUP

PROT8

Xét ví dụ bên dưới:

PROT26

Mình đã định nghĩa schema field view là kiểu number, nhưng dữ liệu mình truyền vào lại là kiểu string. Thì khi chạy đoạn code trên nó sẽ trả về lỗi mặc định như bên dưới.

Thư viện Validate dữ liệu hữu ích cho lập trình viên Web Frontend - YUP

Như bạn thấy, lỗi mặc định không thân thiện với người dùng. Mình muốn tùy chỉnh message như thế nào nhỉ?

Trước tiên, mình sẽ cung cấp cho các bạn cách mà Yup làm để xử lý lỗi kiểu dữ liệu này.

+ Với kiểu string, Yup sẽ sử dụng phương thức toString để ép kiểu dữ liệu cho dữ liệu mà người dùng truyền vào.

Thư viện Validate dữ liệu hữu ích cho lập trình viên Web Frontend - YUP

+ Với kiểu number, Yup sẽ sử dụng phương thức parseFloat để ép kiểu dữ liệu cho dữ liệu mà người dùng truyền vào. Nếu lỗi sẽ trả về NaN.

Thư viện Validate dữ liệu hữu ích cho lập trình viên Web Frontend - YUP

+ Với kiểu date, Yup sẽ sử dụng hàm dựng Date để ép kiểu dữ liệu cho dữ liệu mà người dùng truyền vào. Nếu lỗi sẽ trả về Date không hợp lệ.

Thư viện Validate dữ liệu hữu ích cho lập trình viên Web Frontend - YUP

Đến đây, bạn đã hiểu được vì sao gây ra lỗi kiểu dữ liệu. Yup cung cấp method typeError với tham số message là nội dung sẽ trả về khi lỗi về kiểu dữ liệu.

Thư viện Validate dữ liệu hữu ích cho lập trình viên Web Frontend - YUP

Xét ví dụ bên dưới:

PROT27

Khi chạy đoạn code trên sẽ nhận về message “View must number”.

Thư viện Validate dữ liệu hữu ích cho lập trình viên Web Frontend - YUP

PROT9

Trên đây là những chia sẻ của mình về sử dụng thư viện Yup cho việc validate dữ liệu phía frontend. Mong là bài viết này sẽ hữu ích cho các bạn khi tìm hiểu và ứng dụng thư viện Yup vào dự án.

お問い合わせ

AI・XR・建設DXに関するご相談、お見積もり、採用に関するご質問など、お気軽にお問い合わせください。