ํ”„๋กœ์ ํŠธ ํ‚ค๋…ธํŠธ ๐ŸŒผ

https://www.canva.com/design/DAFliNTrCd4/RHXx6U4dx9AxCbEiw04JCA/edit?utm_content=DAFliNTrCd4&utm_campaign=designshare&utm_medium=link2&utm_source=sharebutton

1. Nav animation

.line {
    z-index: 1000;
    width: 30px;
    height: 3px;
    margin: 7px 0px;
    transition-duration: 0.5s;
    background-color: #000;
  }
  
  .hamTopLine {
    transform: translateY(10px) rotate(45deg);
    transform-origin: center;
  }
  
  .hamMidLine {
    opacity: 0;
  }
  
  .hamBtmLine {
    transform: translateY(-10px) rotate(-45deg);
    transform-origin: center;
  }
}

ham ๋ฒ„ํŠผ์ด ๋‹จ์ˆœํžˆ ์œ„์น˜ํ•ด ์žˆ๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ ์œ ์ €์˜ ์•ก์…˜์— ๋ฐ˜์‘ํ•˜์—ฌ ์›€์ง์ด๋„๋ก ํ•˜๊ณ  ์‹ถ์—ˆ๋‹ค !
3๊ฐœ์˜ ๋ผ์ธ ์ค‘ ๊ฐ€์šด๋ฐ ๋ผ์ธ์€ opacity๋ฅผ ์ฃผ์–ด ์•ˆ๋ณด์ด๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ณ  ์ตœ์ƒ๋‹จ, ์ตœํ•˜๋‹จ์˜ ๋ผ์ธ์€ transform-origin: center ๋ฅผ ์ฃผ์–ด ๊ฐ€์šด๋ฐ๋ฅผ ๊ธฐ์ ์œผ๋กœ ์›€์ง์ด๊ฒŒ ํ•ด์„œ X๋ฒ„ํŠผ์„ ๋งŒ๋“ค๋„๋ก ํ–ˆ๋‹ค.

2. Nav @keyframes

animation: modalShowRight 0.3s;
@keyframes modalShowRight {
  from {
    opacity: 0;
    margin-right: -50px;
  }
  
  to {
    opacity: 1;
    margin-right: 0;
  }
}

animation ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ modalShowRight ์• ๋‹ˆ๋ฉ”์ด์…˜์˜ ์ง€์†์‹œ๊ฐ„์„ 0.3์ดˆ๋กœ ์ง€์ •ํ•ด ๋ถ€๋“œ๋Ÿฌ์šด ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์—ฐ์ถœํ•˜๊ณ 
keyframe ( from๊ณผ to )๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜ค๋ฅธ์ชฝ์—์„œ ์™ผ์ชฝ์œผ๋กœ ๋‚˜์˜ค๋Š” ํ˜•ํƒœ์˜ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์—ฐ์ถœํ–ˆ๋‹ค.

โœ… ์• ๋‹ˆ๋ฉ”์ด์…˜ ์—†์ด ๋ชจ๋‹ฌ์ฐฝ์ด ๊ทธ๋ƒฅ ๋–ด์„ ๋•Œ์™€ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๋ถ€์—ฌํ•ด์„œ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ๋ชจ๋‹ฌ์ฐฝ์ด ๋–ด์„ ๋•Œ ์™„์„ฑ๋„ ์ฐจ์ด๊ฐ€ ๋งŽ์ด ๋‚˜ ๋ณด์˜€๋‹ค ! ๊ด€๋ จ css๋ฅผ ์ข€ ๋” ๊ณต๋ถ€ํ•ด๋ด์•ผ ํ•  ๊ฒƒ ๊ฐ™๋‹ค.

3. let token = localStorage.getItem('TOKEN')

localStorage์— TOKEN์˜ ์œ ๋ฌด๋ฅผ ํ™•์ธํ•˜์—ฌ useNavigate hook์œผ๋กœ ๊ฒฐ๊ณผ์— ๋งž๋Š” ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•œ๋‹ค.

4. config.js

export const BASE_URL = 'http://10.58.52.229:3000'

export const APIS = {
  product: `${BASE_URL}/products`,
}

useEffect(() => {
    fetch(`${APIS.product}/details/${productId}`)
      .then(response => response.json())
      .then(result => {
        console.log(result)
        setProductData(result.data)
      })
  }, [])

API ์ฃผ์†Œ๊ฐ€ ์ž์ฃผ ๋ณ€๊ฒฝ๋˜๋‹ค ๋ณด๋‹ˆ ๊ทธ ๋•Œ๋งˆ๋‹ค ๊ฐ ํŽ˜์ด์ง€์˜ fetch๋ฅผ ์ฐพ์•„ ์‚ญ์ œํ•˜๋ ค๋‹ˆ ๋„ˆ๋ฌด ๋ฒˆ๊ฑฐ๋กœ์› ๋‹ค.
config.jsํŒŒ์ผ์„ src ํด๋” ๋‚ด์— ๋งŒ๋“ค์–ด์„œ URL ์„ ์„ค์ •ํ•˜๊ณ  ๊ฐ ์—”๋“œํฌ์ธํŠธ๋งˆ๋‹ค ๋ฏธ๋ฆฌ ์ž‘์„ฑํ•ด๋‘์—ˆ๊ณ ,
์ดํ›„ ๋ณ€๋™์ด ์ƒ๊ธธ ์‹œ config.js ํŒŒ์ผ ๋‚ด์˜ URL๋งŒ ์ˆ˜์ •ํ•˜๋ฉด ๋˜๋„๋ก ํ–ˆ๋‹ค.

5. if (!productData?. productPrice ) return null

useEffect ๋‚ด๋ถ€์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ์ „์—
UI ๋‚ด๋ถ€์˜ map ์ด๋‚˜ reduce ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋‚˜๋ฉด ๋ Œ๋”๋ง์ด ์ค‘์ง€๋˜๊ณ  ์—๋Ÿฌ๋ฉ”์„ธ์ง€๊ฐ€ ๋–ด๋‹ค.

useEffect๋กœ ๋ฐ์ดํ„ฐ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ๊ฐ€ ๋ Œ๋”๋ง ๋’ค๋กœ ๋ฐ€๋ ค๋‚˜์„œ
์•„์ง map์ด๋‚˜ redudce๋ฅผ ์‹คํ–‰ํ•  ๋ฐฐ์—ด์ด ๋ถˆ๋Ÿฌ์™€์ง€์ง€ ์•Š์•„์„œ์˜€๋Š”๋ฐ,

์ฒ˜์Œ์—๋Š”

if (!productData) return null

๋งŒ ์ž‘์„ฑํ–ˆ์—ˆ๋‹ค. ๊ทธ๋žฌ๋”๋‹ˆ ์–ด๋–ค ๋ถ€๋ถ„์€ ํ•ด๊ฒฐ์ด ๋˜๊ณ  ํ•ด๊ฒฐ์ด ๋˜์ง€ ์•Š๊ณ  ์—๋Ÿฌ๋ฉ”์„ธ์ง€๋ฅผ ๋„์šฐ๋Š” ์ผ๋ถ€๊ฐ€ ๋‚จ์•˜๋‹ค.
๊ทธ๋ž˜์„œ ?. (์˜ต์…”๋„ ์ฒด์ด๋‹ ์—ฐ์‚ฐ์ž) ๋ฅผ ํ™œ์šฉํ•ด productData ๊ฐ์ฒด์™€ productPrice ํ”„๋กœํผํ‹ฐ์˜
์กด์žฌ ์—ฌ๋ถ€๋ฅผ ํ•œ๋ฒˆ ๋” ์ฒดํฌํ•˜๋„๋ก ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์„œ ํ•ด๊ฒฐํ–ˆ๋‹ค.

  • ?. ์˜ต์…”๋„ ์ฒด์ด๋‹ ์—ฐ์‚ฐ์ž
    ?. ์•ž์˜ ํ‰๊ฐ€ ๋Œ€์ƒ์ด undefined๋‚˜ null์ด๋ฉด ํ‰๊ฐ€๋ฅผ ๋ฉˆ์ถ”๊ณ  undefined๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

6. toLocaleString( )

product detail ํŽ˜์ด์ง€์™€ purchase ํŽ˜์ด์ง€์—์„œ ์ƒํ’ˆ ๊ฐ€๊ฒฉ์ด๋‚˜ ์ด๊ณ„ ๋“ฑ์„ ๋ช…์‹œํ•  ๋•Œ
number type์œผ๋กœ ๊ณ„์‚ฐ์„ ํ•˜๊ณ  ๊ณ„์‚ฐ์„ ๋งˆ์นœ ๋’ค toLocaleString() ๋กœ ์‚ฌ์šฉ ์–ธ์–ด์— ๋งž๋Š” ํ‘œํ˜„์„ ํฌํ•จํ•ด์ฃผ์—ˆ๋‹ค.

  • number์— ์‚ฌ์šฉ ์‹œ 1,000 ์ฒ˜๋Ÿผ ํ•„์š”ํ•œ ๊ณณ์— ์‰ผํ‘œ๋ฅผ ์ฐ์–ด์ค€๋‹ค.
    date์— ์‚ฌ์šฉ ์‹œ ๋ฌธํ™”๊ถŒ์— ๋งž๋Š” ์‹œ๊ฐ„ํ‘œ๊ธฐ๋ฒ•์œผ๋กœ ๋…„, ์›”, ์ผ, ์‹œ๊ฐ„์„ ๋ฆฌํ„ดํ•ด์ค€๋‹ค.
    array์— ์‚ฌ์šฉ์‹œ array์˜ ๋‚ด์šฉ์„ ๋ชจ๋‘ ๋ฌธ์ž๋กœ ๋ฐ˜ํ™˜ํ•ด์„œ ๋ณด๋‚ด์ค€๋‹ค.

7. window.scrollTo(x์ขŒํ‘œ, y์ขŒํ‘œ)

 onClick={() => {
            const element = document.querySelector('.detailInformationBox')
            if (element) {
              const y = element.getBoundingClientRect().top - 100
              window.scrollTo({ top: y, behavior: 'smooth' })
            }
          }}

์ƒํ’ˆ ์ •๋ณด๋‚˜ ๋ฆฌ๋ทฐ๋ฅผ ํด๋ฆญํ–ˆ์„ ๋•Œ ์›ํ•˜๋Š” ์œ„์น˜๋กœ ์Šคํฌ๋กค์ด ์ด๋™ํ•˜๋„๋ก ๊ตฌํ˜„ํ•˜๊ณ  ์‹ถ์—ˆ๋‹ค !
window. scrollTo() ๋กœ๋งŒ ์ž‘์„ฑํ•˜๋ฉด ๊ณ ์ •๋œ y๊ฐ’์„ ์ง€์ •ํ•˜๊ธฐ ๋•Œ๋ฌธ์—
์ปจํ…์ธ  ์–‘์— ๋ณ€๋™์ด ์žˆ์„ ๋•Œ ๋งˆ๋‹ค ์ƒˆ๋กœ ์ง€์ •ํ•ด์ค˜์•ผ ํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์ด ์žˆ์—ˆ๋‹ค.
๊ทธ๋ž˜์„œ ํŠน์ • ์š”์†Œ์˜ ๊ฐ’์„ ์ง€์ •ํ•˜๊ธฐ ์œ„ํ•ด querySelector๋กœ ํŠน์ • ํด๋ž˜์Šค์— ํ•ด๋‹นํ•˜๋Š” ์š”์†Œ๋ฅผ ์ฐพ์•„ element์— ๋‹ด์•„ ์„ ์–ธํ•˜๊ณ 
element.getBoundingClientRect().top ์„ ์ด์šฉํ•ด querySelector๋กœ ์ฐพ์€ ์š”์†Œ์˜ ์ƒ๋‹จ ๊ฒฝ๊ณ„๊ฐ€
๋ทฐํฌํŠธ์˜ ์ƒ๋‹จ๊ณผ ์–ผ๋งˆ๋‚˜ ๋–จ์–ด์งˆ ๊ฒƒ์ธ์ง€๋ฅผ ์ง€์ •ํ–ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ window.scrollTo()์— ์œ„์—์„œ ์ •ํ•œ ๊ฐ’์„ top์— ์ง€์ •ํ•˜๊ณ 
behavior: 'smooth'๋ฅผ ํ†ตํ•ด ์Šคํฌ๋กค์ด ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ์ด๋™ํ•˜๋„๋ก ํ–ˆ๋‹ค.

      <div className={`imgBox ${isCarousel ? '' : 'carousel'}`}>
        <img
          className="mainImg"
          src={productData.mainThumbnailImage}
          alt="productImage"
        />
        <img
          className="mainImg"
          src={productData.mainThumbnailImage}
          alt="productImage"
        />
      </div>

//scss
  .imgBox {
    display: flex;

    transform: translate(0px);
    transition: 1s;
    img {
      width: 100%;
    }
  }

  .carousel {
    transform: translate(-500px);
  }

.mainImg {
  width: 500px;
  flex: none;
  object-fit: contain;
}

๋จผ์ € imgBox div ์•ˆ์— carousel ๊ธฐ๋Šฅ์œผ๋กœ ๋Œ์•„๊ฐ€๊ฒŒ ํ•  ์ด๋ฏธ์ง€๋ฅผ 2๊ฐœ ๋‚˜์—ดํ–ˆ๋‹ค.
mockdata๋กœ ์ž‘์—…ํ•  ๋•Œ๋Š” ๋ฐฐ์—ด๋กœ ๊ด€๋ฆฌํ•ด์„œ index๋กœ 2๊ฐœ์˜ ์ด๋ฏธ์ง€๋ฅผ ์ž‘์—…ํ–ˆ์—ˆ๋Š”๋ฐ,
๋ฐฑ์—”๋“œ์™€ ํ†ต์‹ ์„ ํ•˜๊ฒŒ ๋˜๋ฉด์„œ ์ˆ˜์ •๋˜์—ˆ๋‹ค.

๊ธฐ๋ณธ imgBox ์— transform : translate(0px);์„ ์ฃผ์–ด ๊ธฐ๋ณธ๊ฐ’์„ ์ฃผ๊ณ  ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ
state ๋ณ€๊ฒฝ์— ๋”ฐ๋ฅธ carousel์ด๋ผ๋Š” className์„ ์ถ”๊ฐ€ํ•˜์—ฌ translate๋ฅผ ์ƒˆ๋กœ ๋ถ€์—ฌํ•ด x์ถ•์œผ๋กœ ๋ฐ€์–ด์ฃผ์—ˆ๋‹ค.
๊ธฐ๋ณธ class style์— transition์„ ์ฃผ์–ด ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ์ด๋ฏธ์ง€๊ฐ€ ๋„˜์–ด๊ฐˆ ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ๋‹ค.

์‚ฌ์‹ค ์ฒ˜์Œ์—๋Š” ์ด๋ฏธ์ง€ ๋‚˜์—ด์„ ๋ฐฐ์—ด๋กœ ๊ด€๋ฆฌํ•ด๋ณด๊ณ  ์‹ถ์—ˆ๋Š”๋ฐ, ๋‹ค์Œ์—๋Š” ์ข€ ๋” ๋ฐฐ์—ด๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์•„๋ณด๊ณ  ์‹ถ๋‹ค.

9. TOKEN์„ ๋ถ€์—ฌ๋ฐ›์€ ํšŒ์›์˜ ๋ฐฐ์†ก์ง€ ์ •๋ณด ๋“ฑ๋ก(POST), input value ๊ด€๋ฆฌ

// purchase page
const [inputValue, setInputValue] = useState({
    name: '',
    phone: '',
    address1: '',
    address2: '',
    memo: '',
  
// purchase ๋‚ด address component
const Address = ({
  inputValue,
  setInputValue,
}) => {
  const { name, phone, address1, address2 } = inputValue
  
  const handleUserInput = e => {
    const { name, value } = e.target
    setInputValue({ ...inputValue, [name]: value })
  }
  

๋จผ์ € purchase ํŽ˜์ด์ง€์— address ๋ชจ๋‹ฌ์—์„œ ๋ฐ›์€ input value๋ฅผ ์ถœ๋ ฅํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์—
purchase ํŽ˜์ด์ง€์— inputValue์™€ setInputValue state๋ฅผ address์—์„œ ๋ฐ›์•„์„œ ์‚ฌ์šฉํ–ˆ๋‹ค.

address ๋‚ด๋ถ€์—์„œ๋Š” inputValue๋ฅผ ๋น„๊ตฌ์กฐํ™” ํ• ๋‹น์„ ํ†ตํ•ด name, phone, address1, address2 ๋กœ ๋ถ„ํ•ดํ•˜๊ณ  ์ด๋ฅผ ํ†ตํ•ด ๊ฐ๊ฐ์˜ ๊ฐ’์„ ์ €์žฅํ•˜๊ณ  ์ถ”์ ํ•˜๋„๋ก ํ–ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ handleUserInput ํ•จ์ˆ˜๋Š” input์˜ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•จ์ˆ˜์ธ๋ฐ,
e๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์•„ e.target์˜ name๊ณผ value๋ฅผ ๊ตฌ์กฐ๋ถ„ํ•ดํ• ๋‹น์„ ์ด์šฉํ•ด ์ถ”์ถœํ•œ๋‹ค.

๊ทธ ํ›„ ์ถ”์ถœํ•œ ๊ฐ’์„ ๋‹ค์‹œ setInputValue ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ inputValue์˜ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š”๋ฐ
์ด ๋•Œ ์Šคํ”„๋ ˆ๋“œ ๋ฌธ๋ฒ•(์ „๊ฐœ์—ฐ์‚ฐ์ž) ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณต์‚ฌํ›„ [name]: value๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ์ž…๋ ฅ ์š”์†Œ์˜ ๊ฐ’์„ ์—…๋ฐ์ดํŠธ ํ•˜๋„๋ก ํ–ˆ๋‹ค.

10. ๊ตฌ์กฐ๋ถ„ํ•ด ํ• ๋‹น ๋ฐ ์ „์ฒด ๋™์˜ state ๊ด€๋ฆฌ

const [agreeList, setAgreeList] = useState({
    isInfoAgree: false,
    isUseAgree: false,
  })

  const { isInfoAgree, isUseAgree } = agreeList

  const isAllChecked = Object.values(agreeList).every(list => list === true)
  
  const handleAgree = name => {
    setAgreeList(prev => ({ ...prev, [name]: !prev[name] }))
  }

  const handleAllCheck = () => {
    if (isAllChecked) {
      setAgreeList(prev => ({ ...prev, isInfoAgree: false, isUseAgree: false }))
    } else {
      setAgreeList(prev => ({ ...prev, isInfoAgree: true, isUseAgree: true }))
    }
  }

๋™์ผํ•œ ์•ฝ๊ด€์— ๋Œ€ํ•œ ๋™์˜๊ฐ€ ์ขŒ์ธก ํ•˜๋‹จ๊ณผ ์šฐ์ธก ์ƒ๋‹จ ๋‘๋ฒˆ์— ๊ฑธ์ณ ์ถœ๋ ฅ๋˜์–ด์žˆ๋‹ค.
๋”ฐ๋ผ์„œ ์ขŒ์ธก์˜ ๋™์˜์™€ ์šฐ์ธก์˜ ๋™์˜๊ฐ€ ์—ฐ๋™๋˜์–ด ๊ด€๋ฆฌ๋˜๋„๋ก ํ•˜๋ฉด์„œ, ๊ฒฐ๊ณผ์ ์œผ๋กœ 4๊ฐœ์˜ ๋™์˜๊ฐ€ ๋ชจ๋‘ ์ฒดํฌ๋˜์—ˆ์„ ๋•Œ
์ „์ฒด ๋™์˜ ์ฒดํฌ๋ฐ•์Šค์— ์ฒดํฌ๊ฐ€ ์ž๋™์œผ๋กœ ๋“ค์–ด์˜ค๊ฒŒ ํ•˜๊ณ ,
์ „์ฒด ๋™์˜ ์ฒดํฌ๋ฐ•์Šค๋ฅผ ๋ˆ„๋ฅด๋ฉด ๋ชจ๋‘์— ์ฒดํฌ๊ฐ€ ๋“ค์–ด์˜ค๊ฑฐ๋‚˜ ๋ชจ๋‘ ์‚ฌ๋ผ์ง€๊ฒŒ ํ•˜๊ณ  ์‹ถ์—ˆ๋‹ค.

๋จผ์ € agreeList state๋ฅผ isInfoAgree ์™€ isUseAgree ๋กœ ๊ฐ์ฒด ํ˜•ํƒœ๋กœ ๊ตฌ์„ฑํ–ˆ๋‹ค.
๊ทธ๋Ÿฐ ๋’ค agreeList๋ฅผ isInfoAgree์™€ isUseAgree๋กœ ๊ตฌ์กฐ๋ถ„ํ•ด ํ• ๋‹น์„ ํ•ด ์‚ฌ์šฉํ•˜๊ธฐ ํŽธํ•˜๊ฒŒ ๋งŒ๋“ค์—ˆ๋‹ค.

isAllChecked๋Š” Object.values(agreeList) ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ์ฒด๊ฐ’์„ ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ํ•˜๊ณ 
every ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ list ๋‚ด์˜ ๋ชจ๋“  ๊ฐ’์„ ์ฃผ์–ด์ง„ ์กฐ๊ฑด์ธ true์— ๋ถ€ํ•ฉํ•˜๋Š” ์ง€ ์ฒดํฌํ•˜์—ฌ ์ €์žฅํ•˜๋„๋ก ํ–ˆ๋‹ค.

handleAgree๋Š” name์„ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ agreeList ๊ฐ์ฒด ๋‚ด์˜ ๊ฐ๊ฐ์˜ ์†์„ฑ์„ ์ถ”์ ํ•˜์—ฌ ์ฒดํฌ๋ฐ•์Šค์˜ ์ƒํƒœ๋ฅผ ๊ฐœ๋ณ„์ ์œผ๋กœ ๊ด€๋ฆฌํ•œ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ handleAllcheck๋Š” isAllchecked์˜ ๋ฐ˜ํ™˜๊ฐ’์„ ํ™•์ธํ•˜์—ฌ
๋งŒ์•ฝ true์ธ ์ƒํƒœ๋ผ๋ฉด ๋ชจ๋‘ false๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ชจ๋“  ์ฒดํฌ๋ฐ•์Šค๋ฅผ ๋„๋„๋ก ํ•˜๊ณ 
๋งŒ์•ฝ false์ธ ์ƒํƒœ๋ผ๋ฉด ๋ชจ๋‘ true๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ชจ๋“  ์ฒดํฌ๋ฐ•์Šค๋ฅผ ํ‚ค๋„๋ก ํ•œ๋‹ค.

  • Object.values() : ์ „๋‹ฌ๋œ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ์ฒด๊ฐ€ ๊ฐ€์ง€๋Š” ์†์„ฑ์˜ ๊ฐ’๋งŒ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฐฐ์—ด์„ ๋ฆฌํ„ดํ•œ๋‹ค.
  • .every : ๋ฐฐ์—ด ๋‚ด ๋ชจ๋“  ์š”์†Œ๊ฐ€ ์ฃผ์–ด์ง„ ํŒ๋ณ„์‹์„ ์ถฉ์กฑํ•˜๋Š”์ง€ ํ™•์ธํ•˜์—ฌ boolean ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

11. reduce ๋ฉ”์„œ๋“œ๋กœ ์ด ๊ธˆ์•ก ๊ณ„์‚ฐ ๋ฐ ๊ด€๋ฆฌ

  const totalPrice = orderList.reduce(
    (acc, cur) => acc + cur.itemQuantity * cur.itemPrice,
    0
  )

orderList๋Š” ๊ตฌ๋งคํ•  ์ƒํ’ˆ๋“ค์˜ ๊ฐ๊ฐ์˜ ๊ฐ€๊ฒฉ๊ณผ ๊ตฌ๋งค ์ˆ˜๋Ÿ‰์„ ํฌํ•จํ•œ ๋ฐฐ์—ด์ด๋‹ค.
reduce๋‚ด์˜ acc๋Š” ๊ธฐ์กด ๊ฐ’, cur์€ ํ˜„์žฌ ๊ฐ’์„ ์˜๋ฏธํ•œ๋‹ค. reduce๋Š” ๋ฐฐ์—ด์˜ ๋ชจ๋“  ์š”์†Œ๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ
์ •ํ•ด์ง„ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์ด์ „์— ์‹คํ–‰ํ•ด์„œ ๋„์ถœํ•ด๋‘์—ˆ๋˜ ๊ฐ’, acc์— ํ•ฉ์‚ฐํ•œ๋‹ค. ๋ชจ๋“  ๋ฐฐ์—ด ์š”์†Œ์— ์ˆ˜ํ–‰์ด ๋๋‚˜๋ฉด ํ•˜๋‚˜์˜ ๊ฐ’์„ ๋„์ถœํ•ด ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  • reduce : ๋ฐฐ์—ด์˜ ๊ฐ ์š”์†Œ์— ๋Œ€ํ•ด ์ •ํ•ด์ง„ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ํ•˜๋‚˜์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€

Powered by GraphCDN, the GraphQL CDN