Создание простой панели поиска
Приближался конец Фазы 1 во Флэтайроне; Я знал, что мне нужно будет создать SPA (одностраничное приложение). Это было и волнительно, и напряжно. Было бы очень весело попробовать создать что-то с нуля, но с чего начать и что делать? В конечном счете, я решил создать приложение для инвентаризации моей коллекции записей, очень простое приложение, отвечающее требованиям. Тем не менее, я хотел подтолкнуть себя и сделать что-то, чего я никогда не делал. Итак, я решил добавить панель поиска, чтобы можно было использовать различные критерии для сужения всей коллекции.
Большая часть приложения казалась несколько простой, потому что мы делали подобные вещи в лабораториях на протяжении всей фазы. Я знал, как получить доступ к базе данных с помощью JSON и выборки. Я знал, как создавать элементы и добавлять их в DOM, но я продолжал размещать панель поиска в нижней части списка дел, потому что раньше этого не делал.
Наконец я не мог больше откладывать это, и мне пришлось взяться за дело, и вот как я это сделал:
Сначала у меня была выборка, извлекающая мои альбомы из файла json и немедленно создающая карты, которые были добавлены в DOM. Посмотрев несколько видео и немного почитав, я решил, что будет проще получить альбомы и поместить их в отдельный массив, чтобы использовать их, когда они мне понадобятся. Итак, я реорганизовал свою первоначальную выборку, чтобы позволить мне использовать мои альбомные данные везде, где они мне могут понадобиться.
let gotAlbums = [];
fetch('http://localhost:3000/albums')
.then(response => response.json())
.then(albumData => {
gotAlbums = albumData})
};
Я уже настроил панель поиска в своем файле .html, которая будет доступна в моем «.collection» ‹div›, где мои карточки альбомов будут жить после того, как они будут переданы через мою функцию рендеринга. Я настроил прослушиватель событий на этой панели поиска, который будет прослушивать любой «вход».
searchBar.addEventListener("input", (e) => {
const searchString = e.target.value.toLowerCase();
Я назначил цель события константной переменной с именем searchString и применил метод toLowerCase(), потому что хотел, чтобы панель поиска возвращала все критерии поиска независимо от регистра, указанного внутри строки. панель поиска.
Отсюда я настроил еще одну константную переменную с именем filteredAlbums. Эта переменная будет использовать filter() для фильтрации моего массива gotAlbums, а метод includes() возвращает результат, если критерий включает переменную searchString. Я также устанавливаю возвраты toLowerCase(), чтобы предотвратить любые сбои, вызванные регистром здесь.
const filteredAlbums = gotAlbums.filter( album => {
return
album.artist.toLowerCase().includes(searchString)||
album.name.toLowerCase().includes(searchString)||
album.genre.toLowerCase().includes(searchString)||
album.release.includes(searchString)
})
Теперь, когда у меня были все отфильтрованные альбомы, я хотел отобразить их там, где была вся коллекция. Функция прослушивателя событий продолжает очищать элементы HTML в переменной albumContainer и передает результаты массива filteredAlbums через мою функцию renderAlbum, добавляя только те альбомы, которые соответствуют критериям поиска.
albumContainer.innerHTML="" filteredAlbums.forEach(renderAlbum) })
Теперь у меня была рабочая панель поиска, которая возвращала конкретные карточки альбомов, которые соответствовали тому, что я ввел в поле ввода.

Вот код вместе:
let gotAlbums = [];
function searchCollection() {
searchBar.addEventListener("input", (e) => {
const searchString = e.target.value.toLowerCase();
const filteredAlbums = gotAlbums.filter( album => {
return
album.artist.toLowerCase().includes(searchString) ||
album.name.toLowerCase().includes(searchString) ||
album.genre.toLowerCase().includes(searchString) ||
album.release.includes(searchString)
})
albumContainer.innerHTML=""
filteredAlbums.forEach(renderAlbum)
})
};
Это видео Джеймса К. Куика очень помогло в создании этой панели поиска.
Как и это видео от Web Dev Simplified.
Я, вероятно, добавил еще 20 просмотров к каждому видео во время этого процесса.