Students Save 30%! Learn & create with unlimited courses & creative assets Students Save 30%! Save Now
Advertisement
  1. Code
  2. React Native
Code

Bố cục ứng dụng React Native phổ biến: Trang lịch

by
Difficulty:BeginnerLength:LongLanguages:
This post is part of a series called Common React Native App Layouts.
Common React Native App Layouts: Gallery Page

Vietnamese (Tiếng Việt) translation by Andrea Ho (you can also view the original English article)

Trong loạt bài này, bạn sẽ tìm hiểu cách sử dụng React Native để tạo bố cục trang thường được sử dụng trong các ứng dụng dành cho thiết bị di động. Các bố cục bạn sẽ tạo sẽ không hoạt động — thay vào đó, trọng tâm chính của loạt bài này là làm cho bàn tay của bạn bị bẩn khi đặt nội dung trong ứng dụng React Native của bạn.

Nếu bạn chưa từng bố trí ứng dụng React Native hoặc tạo kiểu nói chung, hãy xem bài hướng dẫn trước của tôi:

Để theo sát với loạt bài này, tôi mời bạn trước tiên thử tự mình tạo lại từng màn hình, trước khi đọc những chỉ chi tiết của tôi trong bài viết. Bạn sẽ thực sự không thu được nhiều lợi ích từ hướng dẫn này khi chỉ đọc nó! Hãy thử làm trước khi tìm câu trả lời ở đây. Nếu bạn thành công tạo ra nó giống như màn hình nguyên bản, thì hãy so sánh kết quả của bạn với tôi. Sau đó tự mình quyết định kết quả nào tốt hơn!

Trong phần thứ hai của loạt bài này, bạn sẽ tạo trang lịch (calendar page) sau đây:

calendar page

Những ứng dụng lịch được sử dụng để theo dõi các sự kiện và cuộc hẹn do người dùng bổ sung vào. Bạn sẽ tìm thấy các biến thể khác nhau đang được sử dụng, nhưng đa số ứng dụng lịch sẽ có các yếu tố giống nhau mà một bộ lịch cần có: tháng và năm hiện tại, các ngày trong tháng và các sự kiện hoặc cuộc hẹn do người dùng thêm vào.

Dưới đây là một vài ví dụ về kiểu bố cục này:

google calendar
android calendar

Thiết lập dự án

Bước đầu tiên, tất nhiên là thiết lập dự án React Native mới:

Khi dự án được thiết lập, hãy mở file index.android.js và thay thế code mặc định bằng code sau đây:

Tạo một thư mục src/pages và tạo một file Calendar.js bên trong thư mục đó.

Bạn cũng sẽ cần package react-native-vector-icons. Package này đặc biệt được sử dụng cho các biểu tượng điều hướng cũng như các biểu tượng khác cần có trong trang.

Mở file android/app/build.gradle và bổ sung một tham chiếu tới package đó:

Thao tác tương tự với file android/settings.gradle bằng cách thêm phần sau đây vào cuối file:

Mở android/app/src/main/java/com/react-native-common-screens/MainApplication.java và import package:

Sau cùng, khởi tạo package:

Tạo trang Calendar (lịch)

Được rồi, bây giờ bạn đã tự mình cố gắng viết code cho bố cục (không gian lận, phải không nào?), Tôi sẽ chỉ cho bạn cách tôi xây dựng triển khai của mình.

Lúc đầu, tôi nghĩ rằng đây sẽ là một trong những điều khó khăn nhất để thực hiện, nhưng tin tôi đi, khi bạn đã nắm những căn bản thì việc này không quá phức tạp đâu. Có thể sử dụng code JavaScript để hỗ trợ hiển thị.

Bắt đầu bằng việc kèm tất cả các component và package bạn sẽ cần:

Lần này có một package mới mà bạn chưa từng cài đặt và đó là lodash. Thực sự bạn sẽ không cần toàn bộ thư viện lodash, chỉ cần hàm range. Hàm này được sử dụng để tạo một mảng các con số dựa trên một phạm vi cụ thể. Bạn có thể cài đặt riêng chức năng này bằng cách xử lý lệnh npm install --save lodash.range trong terminal của bạn.

Thêm code mẫu có sẵn để tạo các trang:

Header có ba thành phần trong đó: nút quay lại trang trước, tiêu đề của trang hiện tại và văn bản hiển thị định dạng thân thiện với người xem của ngày đang được chọn.

calendar page initial look

header có một flexDirection của row vì thế mỗi header_item được xếp chồng lên nhau theo chiều ngang. Giá trị flex tương tự được gán cho mỗi header_item để chúng chiếm lĩnh một lượng không gian bằng nhau. text_centertext_right được sử dụng để căn chỉnh văn bản bên trong các header_items nằm ở trung tâm và bên phải. Điều đã hoàn tất bởi vì theo mặc định chúng được căn chỉnh ở phía bên trái của container chứa chúng.

Một khi các kiểu (styles) đã được thêm vào, nó sẽ trông giống như sau:

calendar page styled header

Tiếp theo là bộ lịch thực sự, được chia thành ba phần: tiêu đề, các ngày trong tuần và các ngày theo lịch:

Tiêu đề lịch cho phép người dùng thay đổi năm và tháng.

Có ít nhất hai cách để thực hiện việc này. Phương pháp đầu tiên là xem từng thành phần là một mục riêng lẻ và áp dụng justifyContent: 'space-between' cho container của nó. Phương pháp thứ hai là nhóm tất cả các phần tử liên quan đến năm và nhóm những phần tử liên quan đến tháng đó.

Phương pháp thứ hai là phương thức được áp dụng bên dưới. Phương pháp này dễ hiểu hơn nhiều vì nút điều hướng dùng để trở về một năm trước, chính năm đó, và nút để tiến lên một năm đều có liên quan, vậy bạn có thể xem chúng là một thành phần duy nhất bằng cách đặt chúng trong cùng container. Điều này cũng đúng với các điều khiển tháng.

calendar page added calendar header

Từ đó, bạn có thể áp dụng cùng một kỹ thuật cho hai nhóm các thành phần đó trong cùng một dòng. Để thêm dấu cách giữa hai nút back (lùi lại) và toward (tiến tới) và label (nhãn), chúng tôi sử dụng justifyContent: 'space-between'. Chúng tôi sử dụng alignItems: 'center' để dời tất cả các phần tử bên trong nó ra giữa. Cuối cùng, chúng tôi thêm padding (vùng đệm) bên trái và bên phải để tạo thêm không gian giữa hai nhóm.

calendar page added calendar header styles

Tiếp theo là các ngày trong tuần. Chúng tôi sử dụng một hàm để hiển thị chúng vì tốt nhất nên sử dụng code JavaScript để hiển thị tất cả các thành phần.

Vậy thay vì có bảy thành phần View hoặc Text sẽ hiển thị mỗi ngày trong tuần, bạn chỉ có thể có một mảng chứa các ngày trong tuần. Sau đó bạn có thể chạy vòng lặp qua những ngày đó bằng cách sử dụng hàm Array.map(). Đối với mỗi lần vòng lặp, hiển thị một thành phần Text để cho xem ngày.

Lưu ý rằng trong đoạn mã trên, hàm toUpperCase() được sử dụng để chuyển đổi sang chữ hoa cho các mẫu tự của mỗi ngày. React Native không đi có với thuộc tính CSS text-transform, vì vậy đây là cách duy nhất để có được chữ in hoa ngoài việc sử dụng các chữ hoa theo cách thủ công.

calendar page added calendar week days

Đây là style cho tiêu đề lịch:

calendar page styled calendar week days

Ngày trên lịch cũng sử dụng một hàm để hiển thị ngày:

Hàm renderWeeks() sử dụng hàm range() trong lodash để tạo một mảng chứa các ngày của tháng trước và các ngày của tháng hiện tại. Hai mảng này sau đó được hợp làm một.

Tuy nhiên, bạn không thể trực tiếp sử dụng kết quả của mảng này làm nguồn dữ liệu cho các ngày trong lịch. Bởi vì nếu bạn chỉ đơn giản chạy vòng lặp qua các phần tử và xuất ra một Text component cho mỗi ngày, thì giữa các tuần không có sự phân biệt nào. Bạn đã biết rằng để làm cho mỗi ngày lịch hiển thị inline, bạn cần phải áp kiểu flexDirection: 'row' vào container chứa nó. Vì vậy, áp dụng kiểu này vào một container sẽ dẫn đến kết quả là tất cả các ngày trong lịch hiển thị trong một dòng.

Điều này có nghĩa là bạn cần phải có container riêng biệt cho mỗi tuần. Câu hỏi là làm thế nào. Một lần nữa, có ít nhất hai cách để thực hiện điều này.

Phương pháp đầu tiên là có biến lưu lại bao nhiêu ngày được xuất ra hiện tại và sau đó bổ sung một câu lệnh có điều kiện sẽ hiển thị một thẻ <View> mỗi khi biến số chứa 0 và một thẻ </View> mỗi khi nó là 7. Khi nó là 7, thiết lập trở về 0. Đây là phương pháp đơn giản nhất.

Nhưng ta sẽ sử dụng một phương pháp khác ở đây. Dưới đây, hàm getWeeksArray() được sử dụng để thực hiện điều này. Hàm này nhận một mảng các ngày và nhóm chúng thành các mảng chứa bảy ngày trong mỗi mảng. Từ đó, bạn có thể lặp qua từng mảng đó để hiển thị container của tuần. Sau đó, đối với mỗi vòng lặp, bạn chạy vòng lặp qua các ngày trong tuần để hiển thị chúng. Đây là điều mà hàm renderDays() thực hiện.

Đây là hàm getWeeksArray():

Và đây là hàm renderDays():

calendar page added calendar days

Thêm kiểu dáng cho mỗi tuần (week_days) và ngày (dayday_text):

calendar page add calendar days styling

Tiếp theo là ghi chú được người dùng thêm vào cho ngày đang được chọn và ngày và giờ đã chọn. Một lần nữa, tốt hơn là nhóm các phần tử theo mục đích của chúng thay vì theo cách chúng được bố trí trong trang. Chắc chắn tất cả các thành phần này có liên quan, vì vậy chúng tôi sẽ đặt chúng trong cùng container. Nhưng quan sát kỹ hơn, bạn sẽ bắt đầu thấy rằng có thể nhóm chúng thêm nữa: ghi chú thực sự và ngày đã chọn. Với suy nghĩ đó, đây là markup mà bạn sẽ có được:

calendar page add notes

Ngày được chọn chiếm ít không gian hơn so với ghi chú, vì vậy bạn phải áp dụng giá trị flex lớn hơn cho ghi chú. flex: 3flex: 1 được sử dụng trong trường hợp này, có nghĩa là các ghi chú chiếm 3/4 không gian đang có và ngày chiếm 1/4. Bạn cũng có thể sử dụng số thập phân (0,750,25) nếu điều đó khiến bạn dễ hiểu hơn. Điều quan trọng là chọn một tiêu chuẩn và bám chặt vào nó: alignItems: 'flex-end' được sử dụng trên notes_selected_date vì vậy tất cả các thành phần con của nó sẽ được căn lề ở bên phải. Điều này là cần thiết vì theo mặc định chúng được căn lề bên trái.

calendar page added styling to logs

Cuối cùng, chúng tôi thêm các nhật ký, rất giống với các bản nhật ký trong bài viết trước, vì vậy tôi sẽ để cho bạn để tìm hiểu làm thế nào để hoàn thành bố cục!

Dưới đây là các kiểu (style):

Tổng kết

Thế đấy! Trong hướng dẫn này, bạn đã tạo một trang lịch. Chúng ta đã thực hiện một bố cục lịch đẹp cho ứng dụng và tôi đã chỉ cho bạn làm thế nào JavaScript có thể được sử dụng để bù đắp cho những hạn chế của Flexbox.

Như bạn thấy đấy, chúng ta cần một giải pháp để giới hạn số ngày trong một hàng dừng ở bảy ngày. Flexbox không có cách nào để xác định điều này, vì vậy chúng tôi đã sử dụng JavaScript để tạo lại mảng ban đầu của các ngày theo cách mà chúng được chia thành các nhóm vớ mỗi nhóm có bảy ngày. Từ đó, tất cả những gì chúng ta phải làm là gom từng nhóm vào trong View và sau đó áp kiểu flexDirection: 'row' để làm cho mỗi nhóm chỉ hiển thị trong hàng của nó.

Trong hướng dẫn kế tiếp, bạn sẽ tìm hiểu cách triển khai bố cục thường được sử dụng trong các trang gallery (thư viện). Trong khi chờ đợi, hãy xem qua một số hướng dẫn khác của chúng tôi về React Native và Flexbox.

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.