Infinite Scroll
Question
1. μ΅μ΄μλ 20κ°μ λͺ©λ‘μ λΆλ¬μ¨λ€.
2. μ€ν¬λ‘€μ μ΅νλ¨μΌλ‘ μ΄λμ 'loading' μν νμκ° λνλλ©°, μ΄νμ 20κ° λͺ©λ‘μ λ κ°μ Έμ¨λ€.
3. λ‘λ© μλ£μ 'loading'νμκ° μ¬λΌμ§λ©°, κ°μ Έμ¨ λͺ©λ‘μ΄ νλ¨μ μΆκ°λλ€. (무ν λ°λ³΅)
Solution
const loadMore = async () => {
const target = page ? fetchMoreTrigger : app;
target.classList.add("loading");
await renderList(page++);
target.classList.remove("loading");
};
const onScroll = async e => {
const {scrollTop, scrollHeight, clientHeight} = e.target.scrollingElement;
if(scrollHeight - scrollTop === clientHeight) {
const target = page ? fetchMoreTrigger : app;
target.classList.add("loading");
await renderList(page++);
target.classList.remove("loading");
}
};
Issue
1. μ€ν¬λ‘€ μ΄λ²€νΈλ₯Ό νλ©΄ μ΄λ²€νΈ νκ²μ scrollingElement νλ‘νΌν°κ° μλλ° μ΄κ²μ ν΅ν΄ νμ¬ μ€ν¬λ‘€ μνμ κ΄λ ¨λ μ 보λ₯Ό μ»μ μ μλ€. ν΄λΉ scrollingElement λ΄μ λ€μκ³Ό κ°μ 3κ°μ§ νλ‘νΌν°λ€μ λμ€νΈλμ³λ§ ν λΉνλ€.
- clientHeight: μΉ λΈλΌμ°μ μ°½(λ΄μ©μ΄ 보μ¬μ§λ μμ)μ λμ΄
- scrollTop: νμ¬ μ€ν¬λ‘€λ λΆλΆμ 맨 μμ λμ΄(=νμ¬ μ€ν¬λ‘€μ μμΉ)
- scrollHeight: λ¬Έμμ μ΄ λμ΄(=μ€ν¬λ‘€ λμμ μ΄ λμ΄)
2. '(μ 체 μ€ν¬λ‘€ μμ) - (νμ¬ μ€ν¬λ‘€μ μμΉ)'μ κ°μ΄ (νμ¬ μ€ν¬λ‘€ λ μνμμμ 보μ¬μ§λ μμ)κ³Ό κ°λ€λ©΄ λ μ΄μ μ€ν¬λ‘€μ
ν 곡κ°μ΄ μλ€λ μλ―Έμ΄λ©° μ΄ μμ 쑰건문 λ΄μ μ¬μ©νλ€.
3. μ΄κΈ° μνμ μ΄ν μ λ°μ΄νΈ λ λμ νμ΄μ§λ λ³λλ‘ κ΅¬μ±ν΄μΌ νκΈ° λλ¬Έμ μΌνμ°μ°μλ₯Ό ν΅ν΄ 쑰건μ λ§κ² taget λ³μλ₯Ό
κ°κΈ° λ€λ₯΄κ² ν λΉν΄ μ€λ€. (μ΄κΈ° page λ³μ κ°μ 0μ΄κΈ° λλ¬Έμ false)
Refactoring
const loadMore = async () => {
const target = page ? fetchMoreTrigger : app;
target.classList.add("loading");
await renderList(page++);
target.classList.remove("loading");
};
const onScroll = e => {
const {scrollTop, scrollHeight, clientHeight} = e.target.scrollingElement;
if(scrollHeight - scrollTop === clientHeight) {
loadMore();
}
};