์ฆ๊ฑฐ์šด Hacktoberfest! ๐ŸŽƒ - ํŒŒํŠธ 4

3665 ๋‹จ์–ด hacktoberfestopensource

์†Œ๊ฐœ



์ž, 2021 Hacktoberfest ์—ฌํ–‰์˜ ๋งˆ์ง€๋ง‰ ์žฅ์ž…๋‹ˆ๋‹ค. ์‹œ๊ฐ„์ด ์–ผ๋งˆ ๋‚จ์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋กœ์ ํŠธ๋ฅผ ๋นจ๋ฆฌ ์™„๋ฃŒํ•  ์ˆ˜ ์žˆ์ง€ ์•Š์„๊นŒ ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๋†€๋ž๊ฒŒ๋„ ๋‚ด๊ฐ€ ํ‹€๋ ธ๋‹ค.

Hacktoberfest์˜ ๋งˆ์ง€๋ง‰ ์ฃผ ๋™์•ˆ ์ž‘์—…ํ•  ์ €์žฅ์†Œ๋ฅผ ์ฐพ๋Š” ๊ฒƒ์€ ์ƒ๋‹นํžˆ ์–ด๋ ค์› ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‹ค ๋ณด๋‹ˆ ๊ธ‰์šฐ๋“ค์˜ PR์— ์˜์ง€ํ•  ์ˆ˜๋ฐ–์— ์—†์—ˆ๋‹ค. ๊ทธ๋“ค ์ค‘ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด JavaScript ๋˜๋Š” React ๊ธฐ๋ฐ˜ ํ”„๋กœ์ ํŠธ์—์„œ ์ผํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•˜๋‚˜๋ฅผ ์ฐพ๋Š” ๋ฐ ๊ทธ๋ฆฌ ์˜ค๋ž˜ ๊ฑธ๋ฆฌ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ์ €๋Š” GreenstandTreetracker(๋†€๋ž๊ฒŒ๋„ ๋‚˜๋ฌด ์‹ฌ๊ธฐ์šฉ ์•ฑ)๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ฒซ ๋ฒˆ์งธ ๋ฌธ์ œ



์ฒซ ๋ฒˆ์งธissue๋Š” ํŽ˜์ด์ง€ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์„ธ๋กœ๋กœ ์Šคํฌ๋กค๋˜์ง€ ์•Š๋Š” CSS ๋™์ž‘์„ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ๋ฅผ ๋‚ด ๋กœ์ปฌ ์ปดํ“จํ„ฐ์— ๋ณต์ œํ•˜๋Š” ๋™์•ˆ Treetracker ์›น ์‚ฌ์ดํŠธ์— ๋กœ๊ทธ์ธํ•˜๋ ค๋ฉด ๊ด€๋ฆฌ์ž ์ž๊ฒฉ ์ฆ๋ช…์ด ํ•„์š”ํ•˜๋‹ค๋Š” ์‚ฌ์‹ค์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ˆ˜์„ ๊ฐœ๋ฐœ์ž ์ค‘ ํ•œ ๋ช…์—๊ฒŒ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๊ณ  ์ž๊ฒฉ ์ฆ๋ช…์„ ์š”์ฒญํ•œ ํ›„ Slack ์„œ๋ฒ„์— ์ถ”๊ฐ€๋˜์—ˆ๊ณ  ๊ทธ๊ณณ์—์„œ ๋‚ด๊ฐ€ ํ•„์š”ํ•œ ๊ฒƒ์„ ๊ฒ€์ƒ‰ํ•˜๊ณ  ์ž‘์—…์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์€ ๊ทธ๋ฆฌ ์–ด๋ ต์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์›์น˜ ์•Š๋Š” ๋™์ž‘์˜ ์›์ธ์€ overflow: hidden ๋ณด๊ธฐ์˜ Captures ์Šคํƒ€์ผ์ด์—ˆ๋Š”๋ฐ, ํŽ˜์ด์ง€๊ฐ€ ๋‹ค์‹œ ์Šคํฌ๋กค๋˜๊ธฐ ์‹œ์ž‘ํ•˜๋„๋ก ํ•˜๋ ค๋ฉด overflowY: scroll๋กœ ๋ณ€๊ฒฝํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. PR ์„ ์ƒ์„ฑํ•œ ํ›„ ์Šคํฌ๋กคํ•  ๋•Œ์—๋„ ๋‚ด๋น„๊ฒŒ์ด์…˜ ๋ฐ”๊ฐ€ ๋งจ ์œ„์— ๊ณ ์ •๋˜๋„๋ก ํ•˜๋Š” ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ๊ธฐ ์œ„ํ•ด ์ธํ„ฐ๋„ท ๊ฒ€์ƒ‰์„ ํ•˜๋‹ค๊ฐ€ overflowY ๋ณด๊ธฐ์—์„œ Captures ๊ตฌ์„ฑ ์š”์†Œ๋กœ CaptureTable ์ด๋™ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ๊ฐ€ navbar๊ฐ€ ํฌํ•จ๋œ ์œ„์น˜์˜€๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด ๋ฒ„๊ทธ ์ฐพ๊ธฐ



CSS ๋ณ€๊ฒฝ์„ ์œ„ํ•œ ๋งˆ๋ฌด๋ฆฌ ์ž‘์—…์„ ํ•˜๋Š” ๋™์•ˆ ๋˜ ๋‹ค๋ฅธ ๋ฒ„๊ทธ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ „ ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ๋„ ํŽ˜์ด์ง€ ๋งค๊น€์ด ๊ณ„์† ๋‹ค์Œ ํŽ˜์ด์ง€๋ฅผ ๋กœ๋“œํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.



๋ฒ”์ธ์€ CaptureTable๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ ํŽ˜์ด์ง€ ์ƒํƒœ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ค์ •๋˜์ง€ ์•Š์€ onPageChange ๊ตฌ์„ฑ ์š”์†Œ์— ์žˆ์Šต๋‹ˆ๋‹ค. React์— ๋Œ€ํ•œ ๋‚ด ์ง€์‹์„ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ๋ผ๋Š” ๊ฒƒ์„ ๊นจ๋‹ซ๊ณ  ๋ฌธ์ œ๋ฅผ ์ œ๊ธฐํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•˜๊ณ  ์ง์ ‘ ์‹œ๋„ํ•˜๊ณ  ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋ฌผ์—ˆ์Šต๋‹ˆ๋‹ค.

๋จผ์ € ๋ฆฌ๋“œ ๊ฐœ๋ฐœ ์ œ์•ˆ์— ๋”ฐ๋ผ Material UITablePaginationAPI๋ฅผ ์ฐพ๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์˜ˆ์ œ์™€ StackOverflow์—์„œ ์˜๊ฐ์„ ์–ป์–ด ์†”๋ฃจ์…˜์„ ๋งŒ๋“ค๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ณ„ํš์€ ๋กœ์ปฌ page ์ƒํƒœ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด์—ˆ๊ณ  onPageChange๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด page ๋Œ€์‹  page + 1 ์ƒํƒœ๋ฅผ ์ƒˆ ํŽ˜์ด์ง€์˜ ๊ฐ’์œผ๋กœ ์—…๋ฐ์ดํŠธํ–ˆ์Šต๋‹ˆ๋‹ค.

const [page, setPage] = useState(captureContext.page);

const handlePageChange = (e, newPage) => {
    loadCaptures({
      page: newPage,
      // ...
    });
  };


์ด ์†”๋ฃจ์…˜์€ ๊ดœ์ฐฎ์•˜์ง€๋งŒ ์ˆ˜์„ ๊ฐœ๋ฐœ์ž๋Š” ๋กœ์ปฌ ์ƒํƒœ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๊ณ  ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Š” ํŽ˜์ด์ง€ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋…ผ๋ฆฌ๋ฅผ ๋ณด์œ ํ•˜๋Š” capturesContext ์ปจํ…์ŠคํŠธ๋ฅผ ํ™œ์šฉํ•  ๊ฒƒ์„ ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ์˜ ์ œ์•ˆ์— ๋”ฐ๋ผ ๋‚˜๋Š” ์ฝ”๋“œ๋กœ ๋Œ์•„๊ฐ€์„œ ๋” ๋งŽ์€ ์กฐ์ •์„ ํ–ˆ๊ณ  ๊ฒฐ๊ตญ ์„ฑ๊ณต์ ์œผ๋กœ my PR ์„ ๋ณ‘ํ•ฉํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๋ก 



Hacktoberfest๋Š” ํฅ๋ฏธ๋กญ๊ณ  ์ƒˆ๋กœ์šด ๊ฒฝํ—˜์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ ํ”„๋กœ์ ํŠธ์—์„œ ๋‹ค์–‘ํ•œ ์ปค๋ฎค๋‹ˆํ‹ฐ์™€ ํ˜‘๋ ฅํ•˜๋ฉด์„œ ๋งŽ์€ ๊ฒƒ์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์—ˆ๊ณ  ๋ฐฐ์šด ๊ฒƒ๋ณด๋‹ค ์กฐ๊ธˆ ๋” ๋ฐœ์ „๋œ ์ž‘์—…์— ๋„์ „ํ–ˆ์Šต๋‹ˆ๋‹ค. ์•ž์œผ๋กœ ์–ด๋–ค ์˜คํ”ˆ ์†Œ์Šค ์ด๋ฒคํŠธ๊ฐ€ ์—ด๋ฆด์ง€ ๊ธฐ๋Œ€๋˜๋ฉฐ ์ด๋ณด๋‹ค ๋” ๋งŽ์€ ์ €์žฅ์†Œ์— ๊ธฐ์—ฌํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋‘ ์ฆ๊ฑฐ์šด ํ• ๋กœ์œˆ ๋ณด๋‚ด์„ธ์š”! ๐Ÿ‘ป

์ข‹์€ ์›นํŽ˜์ด์ง€ ์ฆ๊ฒจ์ฐพ๊ธฐ