xStore.articles
Bài viết (blog): danh sách, chi tiết theo slug, bài liên quan, chuyên mục và thẻ.
Phương thức
| Phương thức | Cú pháp | Mô tả | Từ phiên bản |
|---|---|---|---|
list |
xStore.articles.list({ limit, cursor, category, tag }): Promise<CursorPaginatedResponse<ArticleCard>> |
Bài viết đã xuất bản, mới nhất trước. Con trỏ keyset dạng "<published_at>| |
2.1 |
getBySlug |
xStore.articles.getBySlug(slug): Promise<ArticleDetail> |
Nội dung đầy đủ của bài viết, kèm HTML thân bài, chuyên mục và thẻ. | 2.1 |
related |
xStore.articles.related(articleId, { limit }): Promise<CursorPaginatedResponse<ArticleCard>> |
Bài viết liên quan — cùng chuyên mục. | 2.1 |
categories |
xStore.articles.categories(): Promise<CursorPaginatedResponse<ArticleCategory>> |
Chuyên mục bài viết. Dữ liệu tham chiếu có giới hạn: next_cursor null, has_more false. | 2.1 |
tags |
xStore.articles.tags(): Promise<CursorPaginatedResponse<string>> |
Mọi thẻ đang dùng. items là mảng CHUỖI trần, không phải đối tượng. | 2.1 |
Ví dụ đầy đủ
<script>
// Danh sách bài viết, mới nhất trước. Con trỏ là keyset thật
// ("<published_at>|<id>") nên vẫn đúng khi có bài mới xuất bản giữa chừng.
async function renderArticles(cursor = null) {
const trang = await xStore.articles.list({ limit: 10, cursor });
document.getElementById('posts').insertAdjacentHTML('beforeend', trang.items.map((bv) => `
<article>
<a href="${bv.url ?? '#'}"><img src="${bv.thumbnail_url ?? ''}" alt="${bv.title}"></a>
<h3><a href="${bv.url ?? '#'}">${bv.title}</a></h3>
<time>${xStore.utils.formatDate(bv.published_at ?? '')}</time>
<p>${bv.summary ?? ''}</p>
</article>
`).join(''));
return trang.has_more ? trang.next_cursor : null;
}
// Chuyên mục và thẻ là dữ liệu tham chiếu có giới hạn — gọi một lần.
async function renderSidebar() {
const cm = await xStore.articles.categories();
const th = await xStore.articles.tags();
document.getElementById('cats').innerHTML =
cm.items.map((c) => `<li>${c.title} (${c.article_count ?? 0})</li>`).join('');
// items của tags là CHUỖI trần, không phải đối tượng.
document.getElementById('tags').innerHTML =
th.items.map((t) => `<li>${t}</li>`).join('');
}
renderArticles();
renderSidebar();
</script>
Thư viện gọi tới /api/... trên chính tên miền cửa hàng, nên không cần khai báo địa chỉ máy chủ ở bất kỳ đâu.
Xem thêm Sự kiện để giao diện tự cập nhật sau mỗi thao tác.