42_Live User Filter
๐ป ์ฃผ์ : Me API๋ฅผ ์ด์ฉํ์ฌ ์ฌ์ฉ์ ํํฐ ๋ง๋ค๊ธฐ
๐๐ป https://randomuser.me/
const result = document.getElementById('result')
const filter = document.getElementById('filter')
const listItems = []
getData()
filter.addEventListener('input', (e) => filterData(e.target.value))
async function getData() {
const res = await fetch('https://randomuser.me/api?results=50')
const { results } = await res.json()
// Clear result
result.innerHTML = ''
results.forEach(user => {
const li = document.createElement('li')
listItems.push(li)
li.innerHTML = `
<img src="${user.picture.large}" alt="${user.name.first}">
<div class="user-info">
<h4>${user.name.first} ${user.name.last}</h4>
<p>${user.location.city}, ${user.location.country}</p>
</div>
`
result.appendChild(li)
})
}
function filterData(searchTerm) {
listItems.forEach(item => {
if(item.innerText.toLowerCase().includes(searchTerm.toLowerCase())) {
item.classList.remove('hide')
} else {
item.classList.add('hide')
}
})
}
getData() ํจ์๋ async ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋๋ก ํ๋ค.
fetch() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ "RandomUser.me" API๋ก HTTP ์์ฒญ์ ๋ณด๋ธ๋ค. API๋ 50๊ฐ์ ๋๋ค ์ฌ์ฉ์ ๋ ์ฝ๋๋ฅผ ๋ฐํํ๋ค.
API ์๋ต์ ๋ฐ์ ํ, res.json() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์๋ต ๋ฐ๋์ JSON ๋ฐ์ดํฐ๋ฅผ ํ์ฑํ๋ค. ์ฌ๊ธฐ์ await ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ JSON ํ์ฑ์ด ์๋ฃ๋ ๋๊น์ง ๋๊ธฐํ๋ค.
{ results }๋ฅผ ์ฌ์ฉํ์ฌ ํ์ฑ๋ JSON ๊ฐ์ฒด์์ results ์์ฑ์ ์ถ์ถํ๋ค. ์ด ์์ฑ์๋ ์ฌ์ฉ์ ์ ๋ณด ๊ฐ์ฒด๋ค์ ๋ฐฐ์ด์ด ๋ค์ด ์๋ค.
result ๋ณ์๋ฅผ ๋น์์ ์ด์ ์ปจํ
์ธ ๋ฅผ ์ ๊ฑฐํ๋ค.
์ฝ๋๋ results ๋ฐฐ์ด์ ๊ฐ ์ฌ์ฉ์ ๊ฐ์ฒด๋ฅผ forEach ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ๋ณตํ๋ค.
๊ฐ ์ฌ์ฉ์๋ง๋ค ์๋ก์ด ๋ชฉ๋ก ํญ๋ชฉ (<li>
) ์์๋ฅผ document.createElement('li')๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑํ๋ค.
์์ฑ๋ <li>
์์๋ฅผ listItems ๋ฐฐ์ด์ ์ถ๊ฐํ๋ค.
<li>
์์ ๋ด๋ถ์๋ ํ
ํ๋ฆฟ ๋ฆฌํฐ๋ด (๋ฐฑํฑ)์ ์ฌ์ฉํ์ฌ HTML ๊ตฌ์กฐ๊ฐ ์์ฑ๋๋ค. ์ด ๊ตฌ์กฐ์๋ ์ฌ์ฉ์์ ํฐ ํ๋กํ ์ฌ์ง์ ๋ณด์ฌ์ฃผ๋ ์ด๋ฏธ์ง ํ๊ทธ์ ์ฌ์ฉ์์ ์ด๋ฆ ๋ฐ ์์น๋ฅผ ๋ํ๋ด๋ user-info ํด๋์ค๊ฐ ์ง์ ๋ <div>
์์๊ฐ ํฌํจ๋์ด์๋ค.
์์ฑ๋ HTML ๋ด์ฉ์ด result ์์์ result.appendChild(li)๋ฅผ ์ฌ์ฉํ์ฌ ์ถ๊ฐ๋๋ค.
searchTerm์ด๋ผ๋ ํ๋์ ๋งค๊ฐ๋ณ์๋ฅผ ๋ฐ๋๋ค. ์ด ๋งค๊ฐ๋ณ์๋ ์ฌ์ฉ์๊ฐ ๊ฒ์ํ๋ ํ ์คํธ๋ฅผ ๋ํ๋ธ๋ค.
ํจ์ ๋ด๋ถ์์ listItems ๋ฐฐ์ด์ ๊ฐ ํญ๋ชฉ์ ๋ํด forEach ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ๋ณตํ๋ค.
๋ฐ๋ณต๋ฌธ ๋ด๋ถ์์ item์ listItems ๋ฐฐ์ด์ ๊ฐ ํญ๋ชฉ์ ๋ํ๋ธ๋ค.
item.innerText๋ฅผ ์ฌ์ฉํ์ฌ ํ์ฌ ํญ๋ชฉ์ ํ ์คํธ ์ฝํ ์ธ ๋ฅผ ๊ฐ์ ธ์จ๋ค.
toLowerCase()๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒ์์ด์ ํญ๋ชฉ์ ํ ์คํธ๋ฅผ ๋ชจ๋ ์๋ฌธ์๋ก ๋ณํํ๋ค.(๋์๋ฌธ์ ๊ตฌ๋ถ ์์ด ๊ฒ์ํ๊ธฐ ์ํด)
includes() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ํญ๋ชฉ์ ํ
์คํธ๊ฐ ๊ฒ์์ด๋ฅผ ํฌํจํ๋์ง ํ์ธํ๋ค.
๋ง์ฝ ํฌํจ๋๋ค๋ฉด, ํด๋น ํญ๋ชฉ์ ๊ฒ์ ๊ฒฐ๊ณผ์ ํด๋นํ๋ฏ๋ก item.classList.remove('hide')๋ฅผ ํตํด hide ํด๋์ค๋ฅผ ์ ๊ฑฐํ๋ค.
๊ฒ์์ด๊ฐ ํญ๋ชฉ์ ํ ์คํธ์ ํฌํจ๋์ง ์๋๋ค๋ฉด item.classList.add('hide')๋ฅผ ํตํด hide ํด๋์ค๋ฅผ ์ถ๊ฐํ๋ค. ์ด๋ก ์ธํด ํด๋น ํญ๋ชฉ์ด ์จ๊ฒจ์ง๊ฒ ๋๋ค.
์ ๋ฆฌ๊ฐ ์ ๋ ๊ธ์ด๋ค์. ๋์์ด ๋์ต๋๋ค.