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

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

0 0 18

Người đăng: Semi Art

Theo Viblo Asia

Sau thanh điều hướng và phần hiển thị nội dung giới thiệu qua về trang web, thành phần tiếp theo mà chúng ta sẽ bổ sung vào trang chủ là phần hiển thị nội dung chính với các trích đoạn nội dung từ những bài viết mới nhất. Người dùng có thể đọc qua tiêu đề và những trích đoạn nội dung này để quyết định nhấn vào liên kết chuyển hướng tới trang đơn bài viết tương ứng.

Bổ sung component/main

Khu vực hiển thị nội dung chính dạng này còn được sử dụng trong các trang đơn danh mục để hiển thị tập trung chỉ các trích đoạn của những bài viết mới nhất thuộc danh mục đó. Vì vậy nên chúng ta sẽ tạo thêm một component mới với tên là main.ejs.

[view]
. |
. +-----[component]
. |
. +-----meta.ejs
. +-----topnav.ejs
. +-----header.ejs
. +-----script.ejs
. |
. +-----main.ejs

Nội dung của mỗi khối trích đoạn entry sẽ chỉ đơn giản là bao gồm tiêu đề, văn bản nội dung ngắn, và liên kết dẫn tới bài viết tương ứng.

<main id="main"> <div class="container"> <section class="entry"> <h2> Bài Viết Thứ 1001 </h2> <p> Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged... </p> <a href="#"> Đọc tiếp </a> </section> <section class="entry"> <h2> Bài Viết Thứ 1000 </h2> <p> Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years old. Richard McClintock, a Latin professor at Hampden-Sydney College in Virginia, looked up one of the more obscure Latin words, consectetur, from a Lorem Ipsum passage, and going through the cites of the word in classical literature, discovered the undoubtable source... </p> <a href="#"> Đọc tiếp </a> </section> <!-- copy/paste thêm một số .entry nữa ở đây --> </div><!-- .container -->
</main>

Bổ sung code CSS

Tiêu đề của các entry được hiển thị nhỏ hơn so với nội dung chính và chỉ cần đủ tương phản để nổi bật so với đoạn văn bản ngắn đi kèm. Ở đây mình vẫn sẽ sử dụng line-height với mật độ hiển thị khá kín kẽ so với đoạn văn bản thông thường. Liên kết điều hướng vẫn sẽ có một chút hiệu ứng hover nhẹ.

[public]
. |
. +-----[css]
. |
. +-----[component]
. | |
. | +-----base.css
. | +-----topnav.css
. | +-----header.css
. | |
. | +-----main.css
. |
. +-----style.css
#main { color: black; background: white; border-bottom: 1px solid lightgray;
} #main { padding: 45px 0;
} .entry { padding: 27px 0;
} .entry:not(:first-child) { border-top: 1px solid lightgray;
} .entry h2 { font-size: 1.618em; line-height: 1.2;
} .entry p { margin: 18px 0;
} .entry a { color: black; display: inline-block; height: 42px; line-height: 42px;
} .entry a:hover { text-decoration: none;
}
@import "./component/base.css";
@import "./component/topnav.css";
@import "./component/header.css";
@import "./component/main.css";

Chạy test để xem kết quả hiển thị mẫu.

npm test Server Started

Cung cấp tham số data

Dữ liệu mà component này cần sử dụng là một mảng các object chứa thông tin về tiêu đề, trích đoạn văn bản ngắn, và liên kết tới bài viết. Do đó chúng ta có thể tạo một khóa duy nhất cho mảng dữ liệu là entry-list và định nghĩa một type riêng cho các object trong mảng này là một class có tên Entry.

const Data = class extends Map { constructor() { super(); /* --- meta.ejs */ /* --- topnav.ejs */ /* --- header.ejs */ /* --- main.ejs */ this.set("entry-list", []); return this; }
}; // Data module.exports = Data;
const Entry = class extends Map { constructor() { super(); this.set("title", "Tiêu đề bài viết") .set("excerpt", "Đoạn văn bản nội dung ngắn...") .set("url", "#"); return this; }
}; // Entry

Thao tác lặp qua mảng dữ liệu được cung cấp và tạo ra các phần tử HTML thì chúng ta đã quá quen thuộc rồi.

<main id="main"> <div class="container"> <% for (var entry of data.get("entry-list")) { %> <section class="entry"> <h2> <%= entry.get("title") %> </h2> <p> <%= entry.get("excerpt") %> </p> <a href="<%= entry.get("url") %>"> Đọc tiếp </a> </section> <% } %> </div><!-- .container -->
</main>

Bây giờ thì chúng ta cần giả lập dữ liệu truy vấn được từ đâu đó và truyền vào view và chạy test để kiểm tra hoạt động của code template mới viết.

const Data = require("./view/type/Data");
const Category = require("./view/type/Category");
const Entry = require("./view/type/Entry"); var data = new Data() /* * * * * * * * * * * * * * * * * * * * * * * * * * * TopNav ...
*/ /* * * * * * * * * * * * * * * * * * * * * * * * * * * Main
*/ var entry1 = new Entry() .set("title", "Bài Viết Thứ 1001") .set("excerpt", "Nội dung trích đoạn mở đầu bài viết thứ 1001 ...") .set("url", "/article/view/1000"); var entry2 = new Entry() .set("title", "Bài Viết Thứ 1000") .set("excerpt", "Nội dung trích đoạn mở đầu bài viết thứ 1001 ...") .set("url", "/article/view/999"); data.set("entry-list", [ entry1, entry2
]); module.exports = data;
npm test Server Started

Như vậy là chúng ta đã thực hiện xong những thành phần chính trong trang chủ blog. Về phần chân trang web thì đây không hẳn là nội dung quá quan trọng và chúng ta sẽ để dành thời gian cho các layout khác. Bây giờ thì chúng ta sẽ quay lại với Sub-Series ExpressJS một chút để viết một route xử lý cho yêu cầu xem trang chủ và tản mạn về tổng quan kiến trúc của bộ code express-blog mà chúng ta đang viết.

(Sắp đăng tải) [ExpressJS] Bài 7 - Viết Code Điều Hành Blog Cá Nhân (Tiếp Theo)

Và trong bài viết tiếp theo của Sub-Series EJS, chúng ta sẽ bắt đầu thảo luận về nhóm layout hiển thị nội dung các trang bài viết là article.

(Sắp đăng tải) [EJS] Bài 6 - 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 525

- 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 433

- 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 153

- 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 145

- 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 110

- 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 245