Рисуем страницу по данным
Загруженные данные — это обычно массив объектов, и страница показывает их так, как вы знаете из урока о веб-страницах: функция очищает список и в цикле создаёт элементы для его пунктов. Новое здесь — откуда берётся массив. Храните его в переменной вне функций, чтобы страницу можно было перерисовать, когда пользователь что-то изменит, не обращаясь к серверу снова:
let books = [];
function showBooks() {
bookList.textContent = "";
const available = books.filter((book) => book.available);
for (const book of available) {
const item = document.createElement("li");
const title = document.createElement("h2");
title.textContent = book.title;
const author = document.createElement("p");
author.textContent = book.author;
item.append(title, author);
bookList.append(item);
}
}
async function loadBooks() {
const response = await fetch("books.json");
books = await response.json();
showBooks();
}
loadBooks();Несколько моментов, на которые стоит обратить внимание:
booksнаходится вне функций и создаётся черезletс пустым массивом.loadBooks()кладёт в неё загруженный массив, аshowBooks()рисует по нему страницу. Когда данные получены, ими может пользоваться любая другая функция.filter()возвращает новый массив и не трогаетbooks, поэтому при следующей отрисовке все книги снова на месте. Остальные методы массивов, такие какsort(),find()иmap(), работают с загруженными данными так же, как с любым другим массивом.- Внутри каждого пункта есть свои элементы: заголовок и абзац. Создавайте их тоже через
createElement()и вкладывайте в пункт черезappend(), который может принять сразу несколько элементов.
Когда пользователь что-то выбирает на странице, обработчик лишь снова вызывает showBooks(). Функция считывает выбранное и рисует список заново. К серверу повторно никто не обращается: данные уже лежат в массиве.
Задание
- 1
Допишите
showAnimals(): очиститеanimalListи для каждого животного изanimalsдобавьте в него элементliс двумя элементами внутри:h2с именем животного иpс текстом вродесобака, возраст: 3. Название вида по-русски возьмите из объекта speciesNames, который уже есть в коде. - 2
Сделайте так, чтобы работал выбор в
speciesSelect. ВshowAnimals()отберите с помощьюfilter()только тех животных, у которыхspeciesравно значениюspeciesSelect, а если значение —"all", то всех. И когда значение списка меняется (событиеchange), снова вызывайтеshowAnimals().