- vừa được xem lúc

[EJS] Bài 3 - Viết Code Xây Dựng Giao Diện Blog (Tiếp Theo)

0 0 8

Người đăng: Semi Art

Theo Viblo Asia

Bây giờ chúng ta sẽ cùng bắt tay vào xây dựng những thành phần có mặt trong trang chủ của blog. Khởi đầu sẽ là thanh điều hướng chính với thiết kế đơn giản chỉ bao gồm các liên kết trỏ tới các danh mục bài viết. Tuy nhiên trước hết hãy nhìn lại tổng quan cấu trúc thư mục view mà chúng ta đang có.

[view]
. |
. +-----[component]
. | |
. | +-----meta.ejs
. | +-----script.ejs
. |
. +-----[layout]
. | |
. | +-----home.ejs
. | |
. | +-----oops.ejs
. | +-----admin.ejs
. | +-----[category]
. | +-----[article]
. |
. +-----index.ejs

Bổ sung component/topnav

Chúng ta mới chỉ có 2 component đầu tiên là:

  • meta.ejs - chứa tất cả các thông tin trong <head>.
  • script.ejs - chứa tất cả các thẻ <script> ở cuối <body>.

Và bởi vì một thanh điều hướng là thành phần hiển nhiên không thể thiếu trong các layout nói chung. Do đó nên chúng ta sẽ đặt ngay thành phần này vào tệp component thứ ba với tên gọi là topnav.ejsinclude vào home.ejs.

<nav id="topnav"> <a class="logo" href="/"> L O G O </a> <a class="nav-link" href="#"> Html </a> <a class="nav-link" href="#"> Css </a> <a class="nav-link" href="#"> Bootstrap </a> <a class="nav-link" href="#"> JavaScript </a> <a class="nav-link" href="#"> jQuery </a> <a class="nav-link" href="#"> NodeJS </a> <a class="nav-link" href="#"> ExpressJS </a> <a class="time" target="_blank" href="https://www.google.com/search?q=time"> <time id="time"> 10:01 A.M - May 1, 2022 </time> </a>
</nav><!-- #topnav -->
<!doctype html>
<html>
<head> <%- include("../component/meta.ejs", { data }) %>
</head>
<body> <%- include("../component/topnav.ejs", { data }) %> <%- include("../component/script.ejs") %>
</body>
</html>

Code CSS & Client-side JavaScript

Trong code của topnav.ejs thì chúng ta đang tạm đặt vào các liên kết giả mockup để theo dõi kết quả hiển thị trước khi viết code logic để tạo ra các liên kết từ dữ liệu do tham số data cung cấp. Và ở đây thì mình đã chuẩn bị sẵn code CSS và client-side JavaScript cho thanh điều hướng này. Bạn có thể thực hiện thao tác copy/paste đơn giản để dành thời gian thảo luận về các thành phần khác.

[express-blog]
. |
. +-----[public]
. | |
. | +-----[css]
. | | |
. | | +-----[component]
. | | | |
. | | | +-----base.css
. | | | +-----topnav.css
. | | |
. | | +-----style.css
. | |
. | +-----[js]
. | |
. | +-----main.js
. |
. +-----[view]
. +-----data.js
. +-----test.js
@import "./component/base.css";
@import "./component/topnav.css";

Chạy test để kiểm tra kết quả hiển thị.

npm test Server Started

Sử dụng tham số data

Mục đích của việc cung cấp các tham số cho code bên ngoài sử dụng đó là để phần mềm vẽ giao diện view của chúng ta có thể được sử dụng lại ở bất kỳ project blog cá nhân nào khác. Đó cũng là tiêu chí thiết kế chung của các node module hay các npm package, và cả ở những môi trường lập trình khác thì mọi người cũng đều hướng đến.

Trong code hiển thị tạm của topnav.ejs ở phía trên thì chúng ta có một vài thành phần sau cần tạo tham số đầu vào:

  • Đoạn chữ L O G O - Tên của mỗi blog sẽ khác nhau.
  • Các liên kết tới các trang đơn danh mục - Số lượng liên kết, tên hiển thị, đường dẫn trong href.

Nói riêng về các liên kết tới các trang đơn danh mục. Chúng ta sẽ cần dữ liệu đầu vào là một mảng các object mô tả danh mục với các trường dữ liệu là tên hiển thị name, và đường dẫn liên kết url sử dụng cho href. Lúc này bạn có thể thấy rõ ràng là chúng ta có rất nhiều thông tin cần cung cấp để hướng dẫn người viết code sử dụng view từ bên ngoài.

Thêm vào đó là chúng ta cần kiểm tra tính hợp lệ của các object dữ liệu một cách tương đối để thông báo lỗi khi cần thiết. Điều này sẽ giúp giảm thiểu nhầm lẫn khi viết code sử dụng view từ phía bên ngoài và đảm bảo hiệu quả sử dụng.

Nếu như bạn có theo dõi Sub-Series Database thì sẽ thấy có một thao tác rất quan trọng đó là việc định nghĩa các kiểu dữ liệu type để sử dụng cho chương trình đang xây dựng. Mặc dù các kiểu dữ liệu tự định nghĩa có thể không có nhiều tính năng bổ sung so với các kiểu dữ liệu mặc định mà ngôn ngữ lập trình cung cấp; Nhưng điều quan trọng nhất là chúng ta có thể biểu thị ý nghĩa của mỗi object dữ liệu rất rõ ràng và giảm bớt khả năng phát sinh nhầm lẫn khi viết code sử dụng.

Và bây giờ thì chúng ta sẽ tạo ra các kiểu dữ liệu sử dụng cho phần mềm view ở đây. Đầu tiên chúng ta sẽ di chuyển tệp data.js ở bên ngoài vào trong thư mục view. Sau đó tạo thêm một thư mục type bên cạnh hai thư mục componentlayout; Và các kiểu dữ liệu đầu tiên trong thư mục type là hai class có tên là DataCategory.

[view]
. |
. +-----[component]
. +-----[layout]
. +-----[type]
. | |
. | +-----Data.js
. | +-----Category.js
. |
. +-----index.ejs

Ở đây class Data được sử dụng để tạo ra object tham số data lớn nhất chứa tất cả dữ liệu cung cấp vào index.ejs và được truyền vào các layout rồi tới các component; Còn class Category là để chung chuyển dữ liệu đầu vào biểu thị cho các danh mục bài viết.

const Data = class extends Map { constructor() { super(); this.set("title" , "The Blog") .set("logo-text" , "L O G O" ) .set("category-list", [] ); return this; }
}; // Data module.exports = Data;
const Category = class extends Map { constructor() { super(); this.set("name", "") .set("url" , ""); return this; }
}; // Category module.exports = Category;

Và sửa lại phần chú thích ở đầu tệp view/index.ejs để mô tả tham số data là một object tạo ra bởi class Data.

<%# --- Các tham số --- layout: home | category | article | admin | oops action: view | edit data : Data { ... }
%>

Cuối cùng là sửa lại code trong tệp topnav.ejs để sử dụng các tham số dữ liệu đầu vào trong data. Ở đây chúng ta có một mảng chứa các object Category được lưu trong khóa category-list. Thao tác tạo các liên kết về cơ bản là lặp qua mảng này và tạo ra các phần tử <a> giống với ví dụ trong bài giới thiệu EJS.

<nav id="topnav"> <a class="logo" href="/"> <%= data.get("logo-text") %> </a> <% for (var category of data.get("category-list")) { %> <a class="nav-link" href="<%= category.get("url") %>"> <%= category.get("name") %> </a>
<% } %> <a class="time" target="_blank" href="https://www.google.com/search?q=time"> <time id="time"> 10:01 A.M - May 1, 2022 </time> </a>
</nav><!-- #topnav -->

Để chạy thử code template mới chúng ta cần viết lại code giả lập dữ liệu truy vấn được từ database trong tệp express-blog/data.js sử dụng các class dữ liệu trong view/type.

const Data = require("./view/type/Data");
const Category = require("./view/type/Category"); var category1 = new Category() .set("name", "Html") .set("url" , "/category/view/01"); var category2 = new Category() .set("name", "Css") .set("url" , "/category/view/02"); var category3 = new Category() .set("name", "Bootstrap") .set("url" , "/category/view/03"); var category4 = new Category() .set("name", "JavaScript") .set("url" , "/category/view/04"); var category5 = new Category() .set("name", "jQuery") .set("url" , "/category/view/05"); var category6 = new Category() .set("name", "NodeJS") .set("url" , "/category/view/06"); var category7 = new Category() .set("name", "ExpressJS") .set("url" , "/category/view/07"); var data = new Data() .set("category-list", [ category1, category2, category3, category4, category5, category6, category7 ]); module.exports = data;
npm test Server Started

Các liên kết tới các trang danh mục đã được gắn đường dẫn ở thuộc tính href. Và như vậy là chúng ta đã có code template của thanh điều hướng chính hoạt động tốt nếu dữ liệu truyền vào hợp lệ.

(Sắp đăng tải) [EJS] Bài 4 - Viết Code Xây Dựng Giao Diện Blog (Tiếp Theo)

Bình luận

Bài viết tương tự

- vừa được xem lúc

Giới thiệu Typescript - Sự khác nhau giữa Typescript và Javascript

Typescript là gì. TypeScript là một ngôn ngữ giúp cung cấp quy mô lớn hơn so với JavaScript.

0 0 500

- vừa được xem lúc

Bạn đã biết các tips này khi làm việc với chuỗi trong JavaScript chưa ?

Hi xin chào các bạn, tiếp tục chuỗi chủ đề về cái thằng JavaScript này, hôm nay mình sẽ giới thiệu cho các bạn một số thủ thuật hay ho khi làm việc với chuỗi trong JavaScript có thể bạn đã hoặc chưa từng dùng. Cụ thể như nào thì hãy cùng mình tìm hiểu trong bài viết này nhé (go).

0 0 414

- vừa được xem lúc

Một số phương thức với object trong Javascript

Trong Javascript có hỗ trợ các loại dữ liệu cơ bản là giống với hầu hết những ngôn ngữ lập trình khác. Bài viết này mình sẽ giới thiệu về Object và một số phương thức thường dùng với nó.

0 0 136

- vừa được xem lúc

Tìm hiểu về thư viện axios

Giới thiệu. Axios là gì? Axios là một thư viện HTTP Client dựa trên Promise.

0 0 117

- vừa được xem lúc

Imports và Exports trong JavaScript ES6

. Giới thiệu. ES6 cung cấp cho chúng ta import (nhập), export (xuất) các functions, biến từ module này sang module khác và sử dụng nó trong các file khác.

0 0 93

- vừa được xem lúc

Bài toán đọc số thành chữ (phần 2) - Hoàn chỉnh chương trình dưới 100 dòng code

Tiếp tục bài viết còn dang dở ở phần trước Phân tích bài toán đọc số thành chữ (phần 1) - Phân tích đề và những mảnh ghép đầu tiên. Bạn nào chưa đọc thì có thể xem ở link trên trước nhé.

0 0 229