Hàm useEffect trong React được sử dụng để chạy các tác dụng phụ như fetching dữ liệu, cập nhật trạng thái ứng dụng, hoặc thực hiện các hành động khác ngoài vòng đời của một thành phần. Nó cho phép bạn thực hiện các hành động này sau khi render thành phần một lần. Ví dụ, bạn có thể sử dụng useEffect để fetch dữ liệu từ API và cập nhật trạng thái ứng dụng khi dữ liệu được nhận về. Ngoài ra, bạn cũng có thể sử dụng nó để hủy các tác dụng phụ khi thành phần bị loại bỏ khỏi DOM.
Tất cả câu hỏi
Ngân hàng câu hỏi trắc nghiệm có đáp án và giải thích chi tiết.
Trong React, phương pháp được sử dụng để truyền dữ liệu từ con sang cha là sử dụng props. Props là một tính chất độc lập của React, cho phép các thành phần con nhận dữ liệu từ thành phần cha mà không cần phải thay đổi trạng thái của thành phần cha. Tuy nhiên, trong một số trường hợp, chúng ta cần truyền dữ liệu từ con sang cha, và phương pháp này được gọi là sử dụng callbacks. Callbacks là các hàm được gọi khi một sự kiện xảy ra, và chúng ta có thể sử dụng chúng để truyền dữ liệu từ con sang cha. Ví dụ, khi một thành phần con được cập nhật, chúng ta có thể gọi một hàm callback được truyền từ thành phần cha để cập nhật dữ liệu của thành phần cha.
Virtual DOM (DOM ảo) trong React là một khái niệm quan trọng giúp cải thiện hiệu suất của ứng dụng. Nó là một bản sao nhẹ nhàng của DOM thực tế, được sử dụng để tối ưu hóa quá trình render và cập nhật nội dung trên trang web. Khi dữ liệu thay đổi, React sẽ tạo ra một bản sao mới của DOM ảo, sau đó so sánh nó với bản sao cũ để xác định những phần cần được cập nhật. Điều này giúp giảm thiểu số lượng lần render và cập nhật DOM thực tế, từ đó cải thiện hiệu suất và tăng tốc độ tải trang. Ngoài ra, Virtual DOM cũng giúp bảo vệ ứng dụng khỏi những thay đổi không mong muốn trong DOM thực tế.
Trong React, Fragment (<></>) được sử dụng để chứa một nhóm các thành phần hoặc phần tử mà không cần thêm các nút DOM bổ sung. Điều này giúp giảm thiểu số lượng nút DOM trong ứng dụng, từ đó cải thiện hiệu suất và dễ dàng quản lý hơn. Fragment không có bất kỳ thuộc tính nào và không thể được sử dụng như một thành phần độc lập. Thay vào đó, nó được sử dụng để nhóm các thành phần khác nhau lại với nhau mà không cần thêm bất kỳ nút DOM nào. Ví dụ, nếu bạn muốn hiển thị một số thông tin trên cùng một dòng, bạn có thể sử dụng Fragment để nhóm các phần tử lại với nhau.
Trong React, các khóa (key) được sử dụng để xác định và theo dõi các phần tử trong danh sách. Khi danh sách được cập nhật, React sử dụng khóa để xác định phần tử nào đã thay đổi, thêm hoặc xóa. Điều này giúp React tối ưu hóa hiệu suất và đảm bảo rằng danh sách được cập nhật chính xác. Khóa không phải là một phần của dữ liệu thực tế mà là một giá trị duy nhất được gán cho mỗi phần tử trong danh sách. Nó không phải là một số ngẫu nhiên, cũng không phải là một thuộc tính (prop) của phần tử. Khóa giúp React xác định và theo dõi các phần tử trong danh sách, từ đó giúp tối ưu hóa hiệu suất và đảm bảo rằng danh sách được cập nhật chính xác.
JSX là một phần mở rộng ngữ nghĩa cho JavaScript trong framework React. Nó cho phép bạn viết mã HTML và JavaScript trong cùng một tệp, tạo nên một giao diện người dùng động và dễ dàng quản lý. JSX được sử dụng để tạo ra các thành phần UI trong ứng dụng React, giúp bạn có thể tái sử dụng mã và tăng hiệu suất phát triển. Khi bạn sử dụng JSX, bạn có thể viết mã như một tệp HTML thông thường, nhưng với các thuộc tính và phương thức đặc biệt của JavaScript. Điều này giúp bạn có thể dễ dàng tạo ra các giao diện người dùng phức tạp và tương tác mà không cần phải viết mã JavaScript thủ công.
Trong React, để truyền props từ cha sang con, chúng ta sử dụng cú pháp đặc biệt. Câu trả lời đúng là <Child prop=value />, trong đó prop là tên của thuộc tính và value là giá trị mà chúng ta muốn truyền. Ví dụ, nếu chúng ta muốn truyền một chuỗi 'Xin chào' sang một thành phần con, chúng ta sẽ sử dụng cú pháp <Child message='Xin chào' />. Khi đó, thành phần con có thể sử dụng props để truy cập vào giá trị 'Xin chào'. Điều này giúp chúng ta dễ dàng chia sẻ dữ liệu giữa các thành phần trong ứng dụng React.
Các ứng dụng một trang (SPAs) thường giảm tải cho máy chủ bằng cách chuyển giao các chức năng định tuyến và hiển thị sang máy khách. Điều này có nghĩa là máy khách sẽ xử lý các yêu cầu của người dùng và không cần phải gửi yêu cầu đến máy chủ. Điều này giúp giảm tải cho máy chủ và cải thiện hiệu suất của ứng dụng. Ngoài ra, các SPAs cũng thường sử dụng các kỹ thuật như lưu trữ dữ liệu trong bộ nhớ đệm của máy khách để giảm thiểu số lần truy cập máy chủ. Điều này giúp giảm tải cho máy chủ và cải thiện hiệu suất của ứng dụng.
Các ứng dụng một trang (SPAs) được coi là lý tưởng để xây dựng các ứng dụng web phản hồi vì chúng cung cấp nội dung cập nhật nhanh chóng và động. Điều này đạt được thông qua việc sử dụng JavaScript để tải dữ liệu từ máy chủ và cập nhật nội dung trên trang web mà không cần tải lại trang. Điều này giúp cải thiện trải nghiệm người dùng và tăng tốc độ tải trang. Ngoài ra, các ứng dụng một trang thường được xây dựng trên cơ sở dữ liệu và có thể được truy cập từ bất kỳ thiết bị nào có kết nối internet, bao gồm cả máy tính để bàn và thiết bị di động. Điều này giúp tạo ra một ứng dụng web phản hồi linh hoạt và dễ sử dụng.
Các ứng dụng đơn trang (SPAs) có một nhược điểm quan trọng liên quan đến lịch sử và điều hướng của trình duyệt. Khi bạn sử dụng một SPA, trình duyệt không thể lưu lại lịch sử trang web như một trang web truyền thống. Điều này có nghĩa là nếu bạn muốn quay lại trang trước đó, bạn không thể sử dụng tính năng quay lại (back) của trình duyệt. Thay vào đó, bạn phải sử dụng các tính năng riêng của ứng dụng để điều hướng. Một nhược điểm khác là bạn cần cấu hình thủ công để quản lý lịch sử trình duyệt một cách chính xác. Điều này có thể gây khó khăn cho người dùng khi họ muốn quay lại trang trước đó.
Để viết các bài kiểm tra tích hợp trong ứng dụng Spring Boot, bạn cần sử dụng một số module đặc biệt. Module nào trong các lựa chọn dưới đây cung cấp hỗ trợ cho việc viết các bài kiểm tra tích hợp?
Bước thứ hai trong việc triển khai JWT trong Spring REST là cấu hình bảo mật Spring. Để thực hiện bước này, bạn cần thêm các lớp bảo mật vào ứng dụng của mình. Điều này bao gồm việc tạo một lớp bảo mật dựa trên JWT và thêm nó vào ứng dụng. Lớp bảo mật này sẽ chịu trách nhiệm kiểm tra và xác thực các token JWT. Ngoài ra, bạn cũng cần cấu hình các tham số bảo mật như thời gian tồn tại của token, cách thức tạo token và cách thức xác thực token.
JWT (JSON Web Token) là một loại token được sử dụng để xác thực và truyền thông tin giữa các ứng dụng. Header của JWT chứa thông tin về thuật toán ký và loại token. Nó được sử dụng để xác định cách thức ký token và loại token được sử dụng. Ví dụ, nếu header chứa thông tin về thuật toán HMAC SHA256 và loại token là JWT, thì ứng dụng nhận được token có thể xác định được cách thức ký token và loại token được sử dụng. Điều này giúp ứng dụng nhận được token có thể xác thực và giải mã token một cách chính xác. Ngoài ra, header còn chứa thông tin về phiên bản của JWT, giúp ứng dụng nhận được token có thể xác định được phiên bản của token và xử lý token một cách phù hợp.
Mục đích chính của Spring Boot Security là cung cấp tính năng xác thực và ủy quyền cho ứng dụng. Nó cho phép bạn kiểm soát truy cập vào các tài nguyên của ứng dụng, đảm bảo rằng chỉ những người dùng được phép mới có thể truy cập vào chúng. Spring Boot Security cung cấp các tính năng như xác thực người dùng, ủy quyền, bảo vệ chống lại các cuộc tấn công như SQL injection và cross-site scripting (XSS). Nó cũng cho phép bạn cấu hình các chính sách bảo mật tùy chỉnh để đáp ứng nhu cầu của ứng dụng. Ngoài ra, Spring Boot Security cũng hỗ trợ các phương thức xác thực như xác thực dựa trên username và password, xác thực dựa trên token, và xác thực dựa trên OAuth.
Trong tài liệu REST của Spring, các yếu tố quan trọng thường được tìm thấy bao gồm phương thức HTTP (ví dụ: GET, POST), URL endpoint, và dữ liệu yêu cầu và phản hồi. Tuy nhiên, cấu trúc cơ sở dữ liệu ẩn dưới (the underlying database schema) không phải là một phần quan trọng trong tài liệu REST của Spring. Điều này là vì tài liệu REST thường tập trung vào giao diện và hành vi của API, chứ không phải là chi tiết về cơ sở dữ liệu.
Để ghi chép các phản hồi khả năng xảy ra khác nhau cho một điểm cuối, chẳng hạn như 200 OK hoặc 404 Not Found, bạn có thể sử dụng các annotation @ApiResponses và @ApiResponse trên phương thức controller. Các annotation này cho phép bạn mô tả các phản hồi khả năng xảy ra khác nhau cho một điểm cuối, bao gồm cả mã trạng thái HTTP và mô tả của phản hồi. Điều này giúp cho việc sử dụng và hiểu rõ về điểm cuối trở nên dễ dàng hơn.
MongoTemplate là một công cụ mạnh mẽ trong Spring Data MongoDB, cung cấp nhiều lợi ích khi sử dụng. Một trong những lợi ích chính của MongoTemplate là tính linh hoạt trong việc thực hiện các truy vấn phức tạp và các hoạt động khác. Với MongoTemplate, bạn có thể dễ dàng tạo ra các truy vấn phức tạp bằng cách sử dụng các phương thức như find, update, remove và nhiều hơn nữa. Điều này giúp bạn có thể thực hiện các truy vấn và các hoạt động phức tạp mà không cần phải viết mã thủ công. Ngoài ra, MongoTemplate cũng cung cấp các tính năng như hỗ trợ các loại dữ liệu phức tạp, hỗ trợ các loại dữ liệu không xác định và hỗ trợ các tính năng khác của MongoDB. Tính linh hoạt của MongoTemplate giúp bạn có thể dễ dàng thích nghi với các yêu cầu phức tạp của dự án và tăng hiệu suất của ứng dụng.
Trong Spring Data MongoDB, có một số cách để tương tác với MongoDB. Tuy nhiên, nếu bạn muốn thực hiện các hoạt động cơ bản của MongoDB như insert, update, delete, thì bạn cần sử dụng một lớp mẫu (template) để thực hiện các hoạt động này. Lớp mẫu này được gọi là MongoTemplate. MongoTemplate cung cấp các phương thức để thực hiện các hoạt động cơ bản của MongoDB và cung cấp sự linh hoạt để tùy chỉnh các hoạt động này.
Khi cấu hình chuỗi kết nối cho MongoDB Atlas trong Spring Boot, mục đích bao gồm tên đăng nhập và mật khẩu là để xác thực ứng dụng với cụm MongoDB Atlas. Điều này giúp đảm bảo rằng ứng dụng có quyền truy cập vào dữ liệu trong cụm MongoDB Atlas. Khi bạn bao gồm tên đăng nhập và mật khẩu trong chuỗi kết nối, ứng dụng sẽ sử dụng chúng để xác thực với MongoDB Atlas và truy cập vào dữ liệu. Điều này là rất quan trọng để bảo vệ dữ liệu của bạn khỏi truy cập không hợp lệ.
Để lấy dữ liệu từ một collection trong MongoDB, bạn cần sử dụng lệnh find(). Lệnh này cho phép bạn tìm kiếm và trả về các tài liệu (documents) dựa trên các điều kiện cụ thể. Ví dụ, bạn có thể tìm kiếm các tài liệu có tên là 'John' hoặc các tài liệu có tuổi lớn hơn 18. Ngoài ra, lệnh find() còn cho phép bạn thực hiện các phép toán toán học, so sánh và các hàm khác để lọc dữ liệu.