Chuyển đến nội dung chính

React: Yup - Day 10

Yup là một thư viện JavaScript cho việc kiểm tra dữ liệu và xác thực dữ liệu trong ứng dụng React. Bạn có thể dùng Yup để thay thế cho propTypes

Cài đặt

npm install yup

Validation

Validate object đơn giản

Trong ví dụ này, chúng ta đang xác thực rằng giá trị phải là một chuỗi và không được phép rỗng.
import * as Yup from 'yup';

const schema = Yup.string().required();
const value = 'abc';

schema.validate(value).then(() => {
	console.log("Validate " + value + ' successfully');
});
Validate các giá trị phức tạp
import * as yup from 'yup';
//...

const schema = yup.object({
	name: yup.string().required(),
	age: yup.number().min(18).max(60),
});

const value = {
	name: 'John Doe',
	age: 16,
};


schema.validate(value).then(() => {
	console.log("Validate " + value + ' successfully');
}).catch((validationErrors) => {
validationErrors.errors.forEach((error: string) => {
	console.error(error);
});
});;
Validate các ràng buộc phức tạp
import * as yup from 'yup';
//...

const schema = yup.object({
	name: yup.string().required(),
	age: yup.number().min(18).max(60),
	email: yup.string().email(),
});

const value = {
	name: 'An Binh Trong',
	age: 30,
	email: 'anbinhtrong@',
};

schema.validate(value).then(() => {
		console.log("Validate " + value + ' successfully');
	}).catch((validationErrors) => {
validationErrors.errors.forEach((error: string) => {
		console.error(error);
	});
});
Kết quả:
email must be a valid email

Pass data từ Parent Component sang Child Component

Định nghĩa parent component (component cha) để truyền dữ liệu sang child component (component con).

import * as Yup from 'yup';
import ChildComponent from './ChildComponent';

const ParentComponent = () => {
  const data = {
    name: 'John',
    age: 30,
  };

  const schema = Yup.object().shape({
    name: Yup.string().required('Name is required'),
    age: Yup.number().required('Age is required').positive().integer(),
  });

  return (
    <div>
      <h1>Parent Component</h1>
      <ChildComponent data={data} validationSchema={schema} />
    </div>
  );
};

export default ParentComponent;
Định nghĩa Child component
import React, { useState } from 'react';
import * as Yup from 'yup';
import { ValidationError } from 'yup';

interface Errors {
    [key: string]: string | undefined;
  }
  
interface FormData {
    name: string;
    age: number;
}

interface ChildComponentProps {
    data: FormData;
    validationSchema: Yup.ObjectSchema<FormData>;
}

const ChildComponent: React.FC<ChildComponentProps> = ({ data, validationSchema }) => {
    const [formData, setFormData] = useState(data);
    const [errors, setErrors] = useState<Errors>({});

    const handleInputChange = (e: any) => {
        const { name, value } = e.target;
        setFormData({
            ...formData,
            [name]: value,
        });
    };

    const handleSubmit = () => {
        validationSchema.validate(formData, { abortEarly: false })
            .then(() => {
                alert('Form submitted successfully');
                setErrors({});
            })
            .catch((validationErrors) => {
                const newErrors : Errors = {};
                validationErrors.inner.forEach((error: ValidationError) => {
                    const path = error.path || 'defaultPath'; //

                    newErrors[path] = error.message;
                });
                setErrors(newErrors);
            });
    };

    return (
        <div>
            <h2>Child Component</h2>
            <div>
                <label>Name:</label>
                <input
                    type="text"
                    name="name"
                    value={formData.name}
                    onChange={handleInputChange}
                />
                {errors.name && <div>{errors.name}</div>}
            </div>
            <div>
                <label>Age:</label>
                <input
                    type="number"
                    name="age"
                    value={formData.age}
                    onChange={handleInputChange}
                />
                {errors.age && <div>{errors.age}</div>}
            </div>
            <button onClick={handleSubmit}>Submit</button>
        </div>
    );
};

export default ChildComponent;

Chúng ta đã định nghĩa một parent component (ParentComponent) để truyền dữ liệu vào child component (ChildComponent) thông qua prop data. ChildComponent sử dụng local state để quản lý dữ liệu và xử lý sự kiện khi người dùng thay đổi giá trị của các trường input. Khi người dùng nhấn nút "Submit", chúng ta sử dụng Yup để kiểm tra dữ liệu dựa trên schema đã định nghĩa và hiển thị thông báo lỗi nếu có lỗi kiểm tra.

import * as Yup from 'yup'

Import toàn bộ thư viện yup và assign vào biến Yup

const { name, value } = e.target;

Destructuring Assignment là một cú pháp cho phép tách dữ liệu được lưu trữ bên trong (nested) Objects hoặc Arrays (tổng quát hơn là các iterable values) và gán chúng cho các biến riêng biệt. Trong trường hợp này name là tên của input và value là giá trị của input

setFormData({ ...formData, [name]: value })

hàm setFormData() để thay đổi giá trị của formData. Câu lệnh {...formData} sẽ tạo ra object dựa trên formData. Sử dụng ngoặc vuông [name] cho phép bạn sử dụng giá trị của biến name như một biến động để tạo tên thuộc tính trong đối tượng. Câu lệnh này dùng để update form-data thành giá trị mới

Kết luận

Hi vọng qua bài viết này, bạn sẽ nắm vững được cách sử dụng Yup để validate data. Trong phần tiếp theo, chúng ta sẽ tìm hiểu về react-axiosreact-hook-form

Nhận xét

Bài đăng phổ biến từ blog này

[ASP.NET MVC] Authentication và Authorize

Một trong những vấn đề bảo mật cơ bản nhất là đảm bảo những người dùng hợp lệ truy cập vào hệ thống. ASP.NET đưa ra 2 khái niệm: Authentication và Authorize Authentication xác nhận bạn là ai. Ví dụ: Bạn có thể đăng nhập vào hệ thống bằng username và password hoặc bằng ssh. Authorization xác nhận những gì bạn có thể làm. Ví dụ: Bạn được phép truy cập vào website, đăng thông tin lên diễn đàn nhưng bạn không được phép truy cập vào trang mod và admin.

ASP.NET MVC: Cơ bản về Validation

Validation (chứng thực) là một tính năng quan trọng trong ASP.NET MVC và được phát triển trong một thời gian dài. Validation vắng mặt trong phiên bản đầu tiên của asp.net mvc và thật khó để tích hợp 1 framework validation của một bên thứ 3 vì không có khả năng mở rộng. ASP.NET MVC2 đã hỗ trợ framework validation do Microsoft phát triển, tên là Data Annotations. Và trong phiên bản 3, framework validation đã hỗ trợ tốt hơn việc xác thực phía máy khách, và đây là một xu hướng của việc phát triển ứng dụng web ngày nay.

Tổng hợp một số kiến thức lập trình về Amibroker

Giới thiệu về Amibroker Amibroker theo developer Tomasz Janeczko được xây dựng dựa trên ngôn ngữ C. Vì vậy bộ code Amibroker Formula Language sử dụng có syntax khá tương đồng với C, ví dụ như câu lệnh #include để import hay cách gói các object, hàm trong các block {} và kết thúc câu lệnh bằng dấu “;”. AFL trong Amibroker là ngôn ngữ xử lý mảng (an array processing language). Nó hoạt động dựa trên các mảng (các dòng/vector) số liệu, khá giống với cách hoạt động của spreadsheet trên excel.