πŸ“ 더이상 데이터λ₯Ό λ°›μ•„μ˜¬κ²ƒμ΄ μ—†λ‹€λ©΄?

10_2pangΒ·2023λ…„ 6μ›” 15일
0

βš½οΈνŠΈλŸ¬λΈ”μŠˆνŒ…

λͺ©λ‘ 보기
69/94
post-thumbnail

πŸ‘¨β€πŸ’»Β μ‚¬κ±΄


End Page 에 λ„λ‹¬ν•˜μ˜€μ„λ•Œλ₯Ό μ–΄λ–»κ²Œ ν™•μΈν•˜λŠ”μ§€, λ˜ν•œ λ§ˆμ§€λ§‰ νŽ˜μ΄μ§€μ— λ„λ‹¬ν–ˆμ„λ•Œ νŽ˜μ΄μ§€μˆ˜κ°€ μ˜¬λΌκ°€λŠ”κ²ƒμ„ μ–΄λ–»κ²Œ μ²˜λ¦¬ν•˜λŠ”μ§€ κ΅¬ν˜„ν•΄λ³΄κΈ°λ‘œ ν–ˆλ‹€. 그러고 λ§ˆμ§€λ§‰ νŽ˜μ΄μ§€μ— λ„λ‹¬ν•˜μ˜€μ„λ•ŒλŠ” 더이상 데이터 νŒ¨μΉ­μ„ 막도둝 ν•˜μ˜€λŠ”λ°, κ·ΈλŸ¬λ‹€λ³΄λ‹ˆ λ§ˆμ§€λ§‰ νŽ˜μ΄μ§€μ— λ„λ‹¬ν•˜λ©΄ μ „ νŽ˜μ΄μ§€λ‘œ λ„˜μ–΄κ°€λ„ 데이터 패칭이 μΌμ–΄λ‚˜μ§€ μ•Šμ•˜λ‹€.

βœ…Β ν•΄κ²°


  • End Page 도달을 ν™•μΈν•˜λŠ” 방법 : λ°μ΄ν„°νŒ¨μΉ­μ„ ν–ˆμ„λ•Œ μ•„λ¬΄λ‚΄μš©μ΄ μ—†λ‹€λ©΄, useState λ₯Ό ν†΅ν•˜μ—¬ true,false λ₯Ό μ„€μ •ν•΄ λ„λ‹¬ν–ˆλŠ”μ§€ μ•ˆν–ˆλŠ”μ§€λ₯Ό ν™•μΈν• μˆ˜μžˆλ„λ‘ ν•˜μ˜€λ‹€.
  • νŽ˜μ΄μ§€ μ˜¬λΌκ°€λŠ”κ²ƒμ„ μ²˜λ¦¬ν•˜λŠ” 방법 : 일단 데이터 νŒ¨μΉ­μ„ ν•˜λ €λ©΄ λ‹€μŒ νŽ˜μ΄μ§€μ˜ 데이터가 λ‚¨μ•„μžˆλŠ”μ§€λ₯Ό ν™•μΈν•˜κΈ°μœ„ν•΄ νŽ˜μ΄μ§€λ₯Ό ν•˜λ‚˜ μ˜¬λ¦¬λŠ”μˆ˜λ°–μ— μ—†λ‹€. κ·Έλž˜μ„œ λ§Œμ•½ λ§ˆμ§€λ§‰νŽ˜μ΄μ§€μ— λ„λ‹¬ν–ˆλ‹€λ©΄, νŽ˜μ΄μ§€μ˜ 수λ₯Ό ν•˜λ‚˜ λ‚΄λ¦¬λŠ” 방식을 νƒν•˜μ˜€λ‹€.
  • 데이터 νŒ¨μΉ­ν• λ•Œ 쑰건좔가 : useEffect λ₯Ό 톡해, μ˜μ‘΄μ„± λ°°μ—΄μ˜ 속성이 λ³€ν™”ν• κ²½μš° 데이터 패칭이 μΌμ–΄λ‚˜λ„λ‘ 기본으둜 μ„€μ •ν•˜μ˜€κ³ , pageκ°€ 초기의 νŽ˜μ΄μ§€(1) 보닀 ν¬κ±°λ‚˜ κ°™κ³ , endPage κ°€ μ‘΄μž¬ν•˜μ§€ μ•Šμ„λ•Œ 데이터 패칭이 μΌμ–΄λ‚˜λ„λ‘ ν•˜μ˜€λ‹€. (μ²˜μŒμ— μ΄λ ‡κ²Œ μ„€μ •ν•˜μ˜€μœΌλ‚˜, endPage 에 λ„λ‹¬ν•˜μ§€ μ•Šμ•˜μ„λ•Œ λ‹€μ‹œ μƒνƒœμ„€μ •μ„ λŒλ €λ†“μ•˜μ–΄μ•Ό ν–ˆλŠ”λ° 까먹고 ν•˜μ§€μ•Šμ•„ 계속 λ°μ΄ν„°νŒ¨μΉ­μ΄ μ—°μ†μ μœΌλ‘œ μΌμ–΄λ‚¬μ—ˆλ‹€.)

ν•΄κ²°ν•œ μ½”λ“œλŠ” μ•„λž˜μ™€ κ°™λ‹€.

export async function getServerSideProps(context) {
  const page = context.query.page ? context.query.page : 1
  const response = await axios.get(
    `http://localhost:3000/api/data?page=${page}`
  )

  return {
    props: {
      initialData: response.data,
      page,
    },
  }
}

export default function Search({ initialData, page: initialPage }) {
  const [players, setPlayers] = useState(initialData)
  const [page, setPage] = useState(initialPage)
  const [endPage, setEndPage] = useState(false)

  useEffect(() => {
    // 데이터 νŒ¨μΉ­ν• λ•Œ 쑰건좔가
    if (page >= initialPage && !endPage) {
      fetchPage(page)
    } else {
      // End Page 도달을 ν™•μΈν•˜λŠ” 방법
      setEndPage(false)
    }
  }, [page, initialPage, endPage])

  const fetchPage = async (pageNumber) => {
    const response = await axios.get(`/api/data?page=${pageNumber}`)
    const newData = response.data
	// End Page 도달을 ν™•μΈν•˜λŠ” 방법
    if (newData.length === 0) {
      setEndPage(true)
	  // νŽ˜μ΄μ§€ μ˜¬λΌκ°€λŠ”κ²ƒμ„ μ²˜λ¦¬ν•˜λŠ” 방법
      if (page > 1) {
        setPage(page - 1) // 이전 νŽ˜μ΄μ§€λ‘œ λŒμ•„κ°
      }

      alert('더 이상 쑰건을 λ§Œμ‘±ν•˜λŠ” μ„ μˆ˜λŠ” μ—†μŠ΅λ‹ˆλ‹€.')
      return
    }

    setPlayers(newData)
  }

  const handlePrevPage = () => {
    const prevPage = page > 1 ? page - 1 : 1
    setPage(prevPage)
  }

  const handleNextPage = () => {
    setPage(page + 1)
  }

  return (
    <div>
      <h1>Search</h1>
      {players.map((player, index) => (
        <div key={index}>
          <h2>{player.Name}</h2>
        </div>
      ))}
      <div>
        {page > 1 && <button onClick={handlePrevPage}>Prev</button>}
        <p>{page}</p>
        <button onClick={handleNextPage}>Next</button>
      </div>
    </div>
  )
}

πŸ’­Β κ°œμ„ 


  • μ΄λ²ˆμ—λŠ” MySQL μ—μ„œ μ§€λ‚˜μΉ˜κ²Œ λ§Žμ€ μš”μ²­μœΌλ‘œ μ„œλ²„μ˜ μ΅œλŒ€ μ—°κ²° 수 μ œν•œμ— λ„λ‹¬ν–ˆλ‹€κ³  μ—λŸ¬ μ½”λ“œκ°€ λ°œμƒν•˜μ˜€λ‹€...해결해봐야겠닀.
profile
μ£Όλ‹ˆμ–΄ ν”„λ‘ νŠΈμ—”λ“œ 개발자 이광렬 μž…λ‹ˆλ‹€ 🌸

0개의 λŒ“κΈ€