[Vue+Nuxt.js] Vuex๋ฅผ ์ด์šฉํ•˜์—ฌ ์žฅ๋ฐ”๊ตฌ๋‹ˆ Page ๋งŒ๋“ค๊ธฐ

2022. 6. 5. 23:51ใ†Front-End ์ž‘์—…์‹ค/Nuxt.js

728x90
๋ฐ˜์‘ํ˜•

 

Git Hub

 

 

 

๐Ÿ—‚ ๋ชฉ์ฐจ

โ— [Vue+Nuxt.js] Nuxt.js ๊ธฐ๋ณธ 
โ—[Vue+Nuxt.js] Nuxt.js ์‹œ์ž‘ํ•˜๊ธฐ 
โ— [Vue+Nuxt.js] Nuxt.js Data ํ˜ธ์ถœ ๋ฐฉ์‹๊ณผ API ์—ฐ๋™  
โ—[Vue+Nuxt.js] Nuxt.js๋ฅผ ์ด์šฉํ•˜์—ฌ ์‡ผํ•‘ ์ƒํ’ˆ ๋ชฉ๋ก ํŽ˜์ด์ง€์™€ ์ƒ์„ธ ํŽ˜์ด์ง€ ๊ฐœ๋ฐœ
โ— [Vue+Nuxt.js] Nuxt.js๋ฅผ ์ด์šฉํ•˜์—ฌ ์‡ผํ•‘ ์ƒํ’ˆ ๊ฒ€์ƒ‰ UI ๊ฐœ๋ฐœ
โ—[Vue+Nuxt.js] Vuex๋ฅผ ์ด์šฉํ•˜์—ฌ ์žฅ๋ฐ”๊ตฌ๋‹ˆ Page ๋งŒ๋“ค๊ธฐ
โ— [Vue+Nuxt.js] Vuex ์ƒˆ๋กœ๊ณ ์นจ ์‹œ ์ดˆ๊ธฐํ™” ๋˜๋Š” ๋ฌธ์ œ ํ•ด๊ฒฐ

 

 

๐Ÿ—‚ ๋ถ€๋ก

โ— [FrontEnd] HMR(Hot Module Replacement)
โ— [Nuxt.js] ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ํ˜ธ์ถœ ๋ฐฉ๋ฒ•

โ— V-Model ๋™์ž‘ ์›๋ฆฌ์™€ ํ™œ์šฉ ๋ฐฉ๋ฒ•
โ— [Nuxt.js] NuxtServerInit

 

 

๐Ÿ—‚ ๋‚ด๊ฐ€ ๋งŒ๋‚œ Error

โ— [vuex] expects string as the type, but found undefined.

 

 

 

 

 

 

๐Ÿš€ Cart Page

    ๐Ÿ”ฝ  Cart Page ์ œ์ž‘ํ•˜๊ธฐ

/pages/detail/_id.vue

 

์ง€๋‚œ ์‹œ๊ฐ„์— /pages/detail_id.vue๋ฅผ ์ฒ˜์Œ ๋งŒ๋“ค ๋•Œ, 15๋ฒˆ์งธ ์ค„์— button Tag๋ฅผ ์ž ์‹œ ์ฃผ์„ ์ฒ˜๋ฆฌ ํ•ด ๋†“๊ณ , ์ง„ํ–‰์„ ํ–ˆ์—ˆ์–ด์š”. ์ด์ œ ์ด ์ฃผ์„์„ ํ’€๊ณ , Cart Page๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” Button์„ ์ž‘์—…ํ•ด ๋ณด๋„๋ก ํ•  ๊ฒƒ์ด์—์š”.

์ตœ์ดˆ Click(@click) Event๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด addToCart()๋ฅผ ํ˜ธ์ถœ ํ•˜๋Š” Button์„ ๋งŒ๋“ค์–ด ์ฃผ์—ˆ์–ด์š”.

 

/pages/detail/_id.vue

 

๊ทธ๋Ÿฐ ๋‹ค์Œ sciprt Tag์•ˆ์— methods ๊ฐ์ฒด์— addToCart()๋ฅผ ์„ ์–ธํ•˜๊ณ , ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด vue Cli๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ router๋ฅผ ์ด์šฉํ•ด์„œ /pages/cart.vue๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด ์ฃผ์—ˆ์–ด์š”.

/pages/cart.vue

 

๊ทธ๋Ÿฐ ๋‹ค์Œ ์œ„์™€ ๊ฐ™์ด /pages Package ๋ฐ‘์— cart.vue๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ์—ˆ๊ณ , ์•„๋ž˜์™€ ๊ฐ™์ด Page๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

 

/pages/cart.vue

 

์ด๋ ‡๊ฒŒ ํ•˜๊ณ  ๋‚˜๋ฉด ์ƒ์„ธ Page์— cart์— ๋Œ€ํ•œ Button์ด ์ƒ๊ฒผ์„ ๊ฒƒ์ด์—์š”.

 

http://localhost:4000/detail/0

Add to Cart Button์„ ํด๋ฆญํ•˜๊ฒŒ ๋˜๋ฉด ์œ„์—์„œ ๋งŒ๋“  Cart Page๋กœ ์ด๋™ํ•˜๊ฒŒ ๋ ๊ฑฐ์—์š”!




http://localhost:4000/cart

 

 

/.nuxt/router.js

 

/.nuxt/routes.json

 

์ด ์ „์— ๊ณต๋ถ€ ํ•ด ๋ณด์•˜๋“ฏ์ด Nuxt.js๋Š” ์ž๋™์œผ๋กœ Route์— ๋Œ€ํ•œ ์„ค์ •์„ ํ•ด์ฃผ๋Š” ๊ฒƒ์ด์—์š”.
์œ„์— ๋‚ด์šฉ์€ ์ฃผ๋‹ˆํ•˜๋ž‘์ด ๋”ฐ๋กœ ๊ฑด๋“ค์ง€ ์•Š์•˜์ง€๋งŒ, cart์— ํ•ด๋‹นํ•˜๋Š” route๊ฐ€ ์ƒ์„ฑ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

    ๐Ÿ”ฝ  Main Page to Move Cart Page

์ด๋ฒˆ์—๋Š” index.vue ์ฆ‰, Main Page์—์„œ ์žฅ๋ฐ”๊ตฌ๋‹ˆ Button์„ ๋งŒ๋“ค์–ด ๋ณด๊ณ , ์Šคํฌ๋กค์„ ์˜ฌ๋ฆฌ๊ฑด ๋‚ด๋ฆฌ๊ฑด ์‚ฌ๋ผ์ง€์ง€ ์•Š๋„๋ก ๋งŒ๋“ค์–ด ๋ณผ๊ฒŒ์š”.

/pages/index.vue

 

13 ~ 15๋ฒˆ์งธ ์ค„์„ ์ฃผ๋ชฉํ•ด ์ฃผ์„ธ์š”.

๋จผ์ € div Tag์˜ Class๋ฅผ cart-wrapper๋กœ ์žก์•˜๊ณ , ํ•ด๋‹น div Tag ๋ฐ‘์— button Tag๋ฅผ ํ†ตํ•ด Button์„ ํ•˜๋‚˜ ๋งŒ๋“ค์—ˆ์–ด์š”.
์ด Button์„ Click(@click)ํ•˜๊ฒŒ ๋˜๋ฉด Click Event๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด์„œ moveToPage()๋ฅผ ํ˜ธ์ถœํ•˜๋„๋ก ๋งŒ๋“ค์–ด ์ฃผ์—ˆ์–ด์š”. 

 

/pages/index.vue

 

์ด ๊ณณ์—์„  76 ~ 78๋ฒˆ์งธ ์ค„์— ์ฃผ๋ชฉํ•ด ์ฃผ์„ธ์š”.

์ด ๊ณณ์—์„œ๋„ router๋ฅผ ์ด์šฉํ•˜์—ฌ push()๋ฅผ ํ†ตํ•ด /pages/cart.vue๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋„๋ก route๋ฅผ ์ด์šฉ ํ•ด ์ฃผ์—ˆ์–ด์š”.

/pages/index.vue

 

์ฐธ๊ณ ๋กœ 13๋ฒˆ์งธ ์ค„ div Tag์˜ Class์ด๋ฆ„์ธ cart-wrapper์˜ Style์€ ์œ„์™€ ๊ฐ™์ด ๋งŒ๋“ค์–ด ์ฃผ์—ˆ๋Š”๋ฐ, ์—ฌ๊ธฐ์„œ position์— sticky๋ฅผ ์„ ์–ธํ•˜๊ฒŒ ๋˜๋ฉด ์Šคํฌ๋กค ์œ„์น˜๊ฐ€ ๋ฐ”๋€Œ์–ด๋„ ํ™”๋ฉด์— ๊ณ ์ • ๋˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค.

http://localhost:4000/

 

์ €๊ธฐ ์ข€ ๋ณด์„ธ์š”! ์˜ค๋ฅธ์ชฝ ์•„๋ž˜์— '์žฅ๋ฐ”๊ตฌ๋‹ˆ ๋ฐ”๋กœ๊ฐ€๊ธฐ' ๋ฒ„ํŠผ์ด ์ƒ๊ฒผ์–ด์š”.

 

http://localhost:4000/cart

 

์ด ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์œ„์™€ ๊ฐ™์ด Cart Page๋กœ ์ด๋™ํ•˜๊ฒŒ ๋œ๋‹ต๋‹ˆ๋‹ค.

 

 

 

    ๐Ÿ”ฝ  Vuex

        ๐Ÿ“ฆ Nuxt์—์„œ์˜ Vuex ์‚ฌ์šฉ ๋ฐฉ๋ฒ•

Cart์˜ ๊ธฐ๋Šฅ์€ Add to Cart๋ฅผ ๋ˆ„๋ฅธ Item์„ ๊ฐ–๊ณ  ์žˆ๋Š” ์—ญํ• ์„ ํ•˜๋„๋ก ํ•ด ์ค„ ๊ฒƒ์ด์—์š”.

์ƒ์„ธ ํŽ˜์ด์ง€์—์„œ id๊ฐ’์œผ๋กœ ํ•ด๋‹น Data๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ƒ์„ธ ์กฐํšŒ๊ฐ€ ๊ฐ€๋Šฅํ•œ๋ฐ, ๋˜ ๋‹ค๋ฅธ Component์—์„œ ํ•ด๋‹น Data๋ฅผ ๊ณต์œ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Store๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋” ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋งŒ์•ฝ ์œ„์˜ ๋ฐฉ๋ฒ• ๋ง๊ณ , ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด Add to Cart๋ฅผ ๋ˆŒ๋ €์„ ๋•Œ, Local Storage (๋ธŒ๋ผ์šฐ์ € Storage)์— ์ €์žฅ์„ ํ•ด ์ค€ ๋’ค ๋‹ค๋ฅธ Page์— ์ง„์ž… ํ–ˆ์„ ๋•Œ, ํ•ด๋‹น Data๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋„๋ก ์ฒ˜๋ฆฌ๋ฅผ ํ•ด ์ค„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ, ์œ„์˜ ๋ฐฉ๋ฒ•๋“ค ์™ธ์—๋„ Java Script Level์—์„œ ์„œ๋กœ Data๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด ์ฃผ๋Š” Store๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Store๋ฅผ ํ•œ๋ฒˆ ์ด์šฉํ•ด ๋ณผ ๊ฒƒ์ด์—์š”.

Nuxt.js์˜ Store ์ฆ‰, Vuex์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์„ค๋ช…์€ '์ด ๊ณณ'์— ๋‚จ๊ฒจ ๋‘๋„๋ก ํ• ๊ฒŒ์š”!

 

 

        ๐Ÿ“ฆ Vuex ์‚ฌ์šฉํ•ด๋ณด๊ธฐ

[Vue.js & Nuxt.js]Vuex๋ž€? ์—์„œ ๊ณต๋ถ€ ํ–ˆ๋“ฏ์ด Nuxt.js์—์„œ๋Š” store Package ๋ฐ‘์— ~~.js File๋งŒ ๋งŒ๋“ค์–ด์ฃผ๋ฉด .nuxt Package ๋ฐ‘์— store.js๊ฐ€ ์ž๋™์œผ๋กœ ๋งŒ๋“ค์–ด์ง€๊ณ , Vue.js์—์„œ๋Š” ์ˆ˜๋™์œผ๋กœ ํ•ด์ฃผ์–ด์•ผ ํ–ˆ๋˜ ์ž‘์—…๋“ค์„ ์ž๋™์œผ๋กœ ํ•ด์ฃผ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด์—์š”.

.nuxt/store.js

 

๋ณธ๊ฒฉ์ ์œผ๋กœ Vuex๋ฅผ ํ†ตํ•ด Cart ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ด ๋ณผ๊ฒŒ์š”.


/store/index.js

 

state๋Š” Vuex์—์„œ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ์š”์†Œ ์ค‘ ํ•˜๋‚˜์ธ๋ฐ, ๊ฐ๊ฐ์˜ Component๋“ค ์•ˆ์—๋Š” data()๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ชจ๋‘ ์•„์‹ค ๊ฑฐ์—์š”. ๊ทธ data()๊ฐ€ ์—ฌ๋Ÿฌ Component๋“ค๊ณผ Data๋ฅผ ๊ณต์œ ํ•ด์•ผ ๋  ๋•Œ, Vuex๊ฐ€ ์ œ๊ณตํ•˜๋Š” state๋ฅผ ์ด์šฉํ•˜๋ฉด ๋˜๋Š” ๊ฒƒ์ด์—์š”.

์œ„์˜ Code๋Š” state๋ฅผ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋กœ ๋งŒ๋“ค๊ณ , ๋ฐ”๋กœ ๋ฐ˜ํ™˜์„ ํ•ด ์ฃผ๋Š”๋ฐ, cartItems๋ผ๋Š” ๋ฐฐ์—ด ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ํ•ด ์ค€ ๊ฒƒ์ด์—์š”.

http://localhost:4000

 

์œ„์™€ ๊ฐ™์ด ํ•œ ๋’ค main page์—์„œ Vue devtool์„ ํ†ตํ•ด Vuex๋ฅผ ํ™•์ธํ•ด ๋ณด๋ฉด ์˜ค๋ฅธ์ชฝ๊ณผ ๊ฐ™์ด state ์•ˆ์— cartItems ๋ฐฐ์—ด ๊ฐ์ฒด๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์š”.

 

 

๋ฐ˜์‘ํ˜•

 

        ๐Ÿ“ฆ ์ƒ์„ธ Page์˜ ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๋‹ด๊ธฐ ๊ธฐ๋Šฅ ๊ตฌํ˜„

 

/store/index.js

์ด๋ฒˆ์—๋Š” mutations๋ผ๋Š” ์นœ๊ตฌ์™€ ํ•จ๊ป˜ ๋†€์•„๋ณผ ๊ฒƒ์ด์—์š”.
์ด ์นœ๊ตฌ๋Š” state์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ๋•Œ ๊ฐ™์ด ๋†€ ์ˆ˜ ์žˆ๋Š” ์นœ๊ตฌ์—์š”.

mutations๋ฅผ ํ†ตํ•ด 10๋ฒˆ์งธ ์ค„์— addCartItem()์ด๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๊ณ , ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ state์™€ cartItem์„ ์ „๋‹ฌ๋ฐ›๊ฒŒ ํ•œ ๋’ค 11๋ฒˆ์งธ ์ถœ์— state์•ˆ์— cartItems๋ผ๋Š” ๋ฐฐ์—ด ๊ฐ์ฒด ์•ˆ์— ๊ฐ’์„ ๋„ฃ๊ธฐ ์œ„ํ•ด push()๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ๊ทธ ๋•Œ ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ ์ž…๋ ฅํ•  Data (์—ฌ๊ธฐ์„œ๋Š” cartItem)์„ ์ „๋‹ฌํ•จ์œผ๋กœ state์•ˆ์— ์„ ์–ธ๋œ cartItems[] ์•ˆ์— Data๊ฐ€ ์Œ“์ผ ์ˆ˜ ์žˆ๋„๋ก ํ•ด ์ค€ ๊ฒƒ์ด์—์š”.

์ด์ œ ํ•ด๋‹น Vuex๋ฅผ ์ด์šฉํ•  Cart Button์ด ์žˆ๋Š” /pages/detail/_id.vue ํ•œํ…Œ ๊ฐ€ ๋ณผ๊ฒŒ์š”!

/pages/detail/_id.vue

/store/index.js๋ฅผ ๋งŒ๋“œ๋Š” ์ˆœ๊ฐ„ ๋‹จ์ˆœํžˆ Library์— ์„ค์น˜ ๋ฐ ์„ค์ •ํ•˜๋Š” Code๋งŒ ์ž‘์„ฑํ•ด ์ฃผ๋Š” ๊ฒƒ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ๊ฐ์ฒด(์ธ์Šคํ„ด์Šค) ๋‚ด๋ถ€์ ์œผ๋กœ ์—ฐ๊ฒฐ์„ ํ•ด ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์œ„ Code๊ณผ ๊ฐ™์ด this๋ฅผ ํ†ตํ•ด $store์™€ commit()์ด๋ผ๋Š” ๊ฒƒ์— ๋ฐ”๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ตœ์ดˆ Add to Cart๋ผ๋Š” Button์„ ํด๋ฆญํ•˜๊ฒŒ ๋˜๋ฉด addToCart()๊ฐ€ ํ˜ธ์ถœ๋˜๊ณ , 39๋ฒˆ์งธ ์ค„์— store์— commit()์ด ๋™์ž‘ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ์ด๊ฒƒ์€ /store/index.js์˜ mutations์— addCartItem()์„ ํ˜ธ์ถœํ•˜๊ฒŒ ๋˜๊ณ , ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ๋‹ด์„ ๊ฐ์ฒด (this.product)๋ฅผ ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌ ํ•ด ์ฃผ๋Š” ๊ฒƒ์ด์—์š”.

๊ทธ๋ ‡๊ฒŒ ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ๋ฌผ๊ฑด์„ ๋‹ด๊ฒŒ ๋˜๋ฉด 41๋ฒˆ์งธ ์ค„์ฒ˜๋Ÿผ ์žฅ๋ฐ”๊ตฌ๋‹ˆ Page๋กœ ์ด๋™์„ ํ•  ๊ฒƒ์ด์—์š”.

 

http://localhost:4000/detail/1

 

์ตœ์ดˆ ์ƒ์„ธ ํŽ˜์ด์ง€์—์„œ Add to Cart Button์„ ๋ˆ„๋ฅด๊ธฐ ์ „๊นŒ์ง€๋Š” ๊ฐœ๋ฐœ์ž ๋„๊ตฌ vue devtool์— Vuex ๊ธฐ๋Šฅ์—์„œ state ์•ˆ์— cartItems[]์— ์–ด๋–ค Data๋„ ์—†๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

http://localhost:4000/cart

 

Add to Cart Button์„ ๋ˆ„๋ฅด๊ฒŒ ๋˜๋ฉด ๊ฐœ๋ฐœ์ž ๋„๊ตฌ vuedevtool์— Vuex ๊ธฐ๋Šฅ์—์„œ state ์•ˆ cartItems[]์•ˆ์— ํ•œ ๊ฐœ์˜ Data๊ฐ€ ๋“ค์–ด๊ฐ„ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ณ , Cart Page๋กœ ์ด๋™๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์š”.

 

 

 

 

        ๐Ÿ“ฆ ์žฅ๋ฐ”๊ตฌ๋‹ˆ Page์˜ ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๋ชฉ๋ก ์กฐํšŒ ๊ธฐ๋Šฅ ๋งŒ๋“ค๊ธฐ

์ด๋ฒˆ์—๋Š” state์— ์ €์žฅํ•œ Data๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค์–ด์„œ ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๋ชฉ๋ก ์กฐํšŒ ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค์–ด ๋ณผ ๊ฒƒ์ด์—์š”.

/pages/cart.vue

 

๊ฒฐ๊ตญ ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ๋‹ด๊ธด ์ œํ’ˆ ๋ชฉ๋ก์€ Cart๋ผ๋Š” Page์—์„œ ๋ณด์—ฌ์ ธ์•ผ ํ•˜๋Š” ๊ฒƒ์ด์—์š”.
๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— cart.vue์— ์œ„์™€ ๊ฐ™์ด ์ž‘์—…์„ ํ•ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ์—ฌ๊ธฐ์„œ ์ฃผ๋ชฉํ•ด์•ผ ํ•˜๋Š” ๊ณณ์€ 6 ~ 19๋ฒˆ์งธ ์ค„ ๊นŒ์ง€์—์š”. ํ•œ๋ฒˆ ํ•˜๋‚˜ํ•˜๋‚˜ ์‚ดํŽด๋ณด์•„์š”!

7๋ฒˆ์งธ ์ค„์—์„œ ul Tag์•ˆ์— li Tag๋กœ ๋ชฉ๋กํ™”๊ฐ€ ๋  ์ˆ˜ ์žˆ๋„๋ก ํ‹€์„ ์žก์•„ ์ค€ ๋’ค li Tag ์•ˆ์— v-for๋ฅผ ํ†ตํ•ด ๋ฐ˜๋ณต์ด ๋˜๋ฉด์„œ ์œ„์—์„œ state์— ์ €์žฅํ•œ ๊ฐ’์„ ํ•˜๋‚˜ํ•˜๋‚˜ ๊บผ๋‚ด์„œ cartItem์ด๋ผ๋Š” ๋ณ€์ˆ˜์— ๋‹ด๋„๋ก ํ•ด ์ฃผ์—ˆ์–ด์š”.

v-for๋Š” index ๊ฐ’์ด ๊ผญ ๋“ค์–ด๊ฐ€ ์ฃผ์–ด์•ผ ํ•˜๋Š”๋ฐ, ์ด๋ฅผ :key๋ฅผ ํ†ตํ•ด์„œ cartItem์˜ id๊ฐ’์œผ๋กœ ์žก์•„ ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.


๊ทธ๋Ÿฐ ๋’ค img Tag๋ฅผ ํ†ตํ•ด ์ƒํ’ˆ ์‚ฌ์ง„์ด ๋‚˜์˜ค๋„๋ก ์ž‘์—…์„ ํ•˜๋Š”๋ฐ, :src๋ฅผ ํ†ตํ•ด imageUrl์„ ๋ฐ›์•„์˜ค๋„๋ก ํ•˜์—ฌ ์‚ฌ์ง„์ด ์ถœ๋ ฅ ๋˜๋„๋กํ•˜๊ณ , ์‚ฌ์ง„์ด ์ถœ๋ ฅ๋˜์ง€ ์•Š์œผ๋ฉด ์ œํ’ˆ ์ด๋ฆ„์ด ์ถœ๋ ฅ๋˜๋„๋ก ํ•ด ์ฃผ์—ˆ์–ด์š”.

๊ทธ๋Ÿฐ ๋’ค ๋‘ ๊ฐœ์˜ p Tag๋ฅผ ํ†ตํ•ด ์ œํ’ˆ ์ด๋ฆ„๊ณผ ๊ฐ€๊ฒฉ์ด ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋„๋ก Code๋ฅผ ์ž‘์„ฑํ•ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

์ฐจ ํ›„ ๊ตฌ๋งคํ•˜๊ธฐ ๊ธฐ๋Šฅ์„ ๋„ฃ๊ธฐ ์œ„ํ•ด 17 ~ 19๋ฒˆ์งธ ์ค„์— ์ž‘์—…์„ ํ•ด ์ฃผ์—ˆ๋Š”๋ฐ, ๋ฒ„ํŠผ ํ•˜๋‚˜๋ฅผ ๋งŒ๋“ค๊ณ , ํ•ด๋‹น ๋ฒ„ํŠผ์— ๊ตฌ๋งคํ•˜๊ธฐ๊ฐ€ ๋ณด์ด๋„๋ก ๋งŒ๋“ค์–ด ๋‘๊ธฐ๋งŒ ํ–ˆ์–ด์š”.

 

http://localhost:4000/cart

 

์œ„์™€ ๊ฐ™์ด ์ž‘์—…์„ ํ•ด ์ฃผ๊ณ , ์‹ค์ œ Cart Page๋ฅผ ๋ณด๋‹ˆ Cart์— ์ž˜ Item์ด ๋‹ด๊ธฐ๊ณ , ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ์–ด์š”.

์—ฌ๊ธฐ๊นŒ์ง€ ์ž‘์—…์„ ํ•˜๊ณ ๋‚˜์„œ ์ƒˆ๋กœ๊ณ ์นจ์„ ํ•˜๊ฒŒ ๋˜๋ฉด ์•„์ฃผ ์žฌ๋ฐŒ๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒ๋˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์–ด์š”.
๋ฐ”๋กœ Cart์— ๋‹ด๊ธด Item๋“ค์ด ๋ชจ๋‘ ์ดˆ๊ธฐํ™” ๋˜ ๋ฒ„๋ฆฌ๋Š” ํ˜„์ƒ์ธ๋ฐ, ์ด ํ˜„์ƒ์— ์ด์œ ๋Š” Vuex๋Š” Java Script ๋‹จ์—์„œ ๋™์ž‘ํ•˜๋Š” Library์ด๊ณ , ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ƒˆ๋กœ ๊ณ ์นจ๋˜๊ฒŒ ๋˜๋ฉด Memory์— ์˜ฌ๋ผ์™€ ์žˆ๋˜ Java Script๋Š” ๋ชจ๋‘ ์ดˆ๊ธฐํ™” ๋˜๋ฒ„๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ์ธ ๊ฒƒ์ด์—์š”.

์ด๋ฅผ ๊ผญ ์ฐธ๊ณ ํ•ด์„œ ๋‚˜์ค‘์— ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ๊นŒ์ง€ ๊ฐ™์ด ๊ณต๋ถ€ํ•ด๋ด์š”!

 

 

        ๐Ÿ“ฆ Cart Page Styling

์ด๋ฒˆ์—๋Š” ์‰ฌ์–ด๊ฐ€๋Š” ๊ฒธํ•˜์—ฌ Styling์„ ํ•ด ์ฃผ๋„๋ก ํ•ด ๋ณผ๊ฒŒ์š”.

http://localhost:4000/cart

 

๊ฒฐ๊ณผ๋ฅผ ๋จผ์ € ๋ง์”€๋“œ๋ฆฌ๋ฉด ์ด๋ ‡๊ฒŒ ๋ณ€๊ฒฝ๋˜๋„๋ก Code๋ฅผ ์ˆ˜์ •ํ•ด ์ค€ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
ํ•ด๋‹น Source Code๋Š” '์ด ๊ณณ'์—์„œ ๋ณด์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! ์ด ๊ณณ์—์„œ /pages/cart.vue๋ฅผ ์ฐธ๊ณ  ํ•ด ์ฃผ์„ธ์š”!

ํ•œ ๊ฐ€์ง€ ๋” ์ •๋ฆฌ๋ฅผ ํ•˜์ž๋ฉด Cart Page์— ์œ„์˜ ์‚ฌ์ง„๋“ค์ด ๋‹ค๋ฅธ ๊ฒƒ๋“ค์ด ์˜ฌ๋ผ๊ฐ€์ง€๋งŒ ์•„๋ž˜ ์ž‘์—…์„ ํ•ด ์ฃผ๊ธฐ ์ „๊นŒ์ง€๋Š” ๋™์ผํ•œ ์‚ฌ์ง„๋“ค์ด ์˜ฌ๋ผ๊ฐ€๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์–ด์š”.

/store/index.js

์œ„์— mutations์— 12~ 15๋ฒˆ์งธ ์ค„์„ ๋ณด๋ฉด addCartItem์˜ ๋งค๊ฐœ ๋ณ€์ˆ˜ cartItem์˜ ๋‚ด์šฉ์„ ๋ชจ๋‘ ๋ฐ›์•„ imageUrl์ด ์•„๋‹Œ ๊ฒƒ๋“ค์€ ๊ทธ๋ƒฅ ํ•œ๋ฒˆ์— ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด 13๋ฒˆ์งธ ์ค„์—์„œ ์ฒ˜๋ฆฌ๊ฐ€ ๋˜์–ด ๊ทธ๋Œ€๋กœ ์•„๋ฌด ์ž‘์—… ์—†์ด ์ƒ์ˆ˜ํ˜• ๋ณ€์ˆ˜ newCartItem์— ๋‹ด๊ธฐ๋Š”๋ฐ, imageUrl ๋ถ€๋ถ„๋งŒ random๊ฐ’์„ ์ค˜์„œ imageUrl์ด ๋‹ค๋ฅด๊ฒŒ ๋‚˜์˜ค๋„๋ก ํ•˜๊ณ , ๊ทธ๊ฒƒ์„ ์ƒ์ˆ˜ํ˜• ๋ณ€์ˆ˜ newCartItem์— ๋‹ด์•„์ค€ ๋’ค ํ•ด๋‹น ๋ณ€์ˆ˜๋ฅผ state์˜ cartItems[]์— ๋‹ด์•„์ฃผ๋„๋ก ํ•ด ์ค€ ๊ฒƒ์ด์—์š”.

 

 

 

 

 

 

 

 

728x90
๋ฐ˜์‘ํ˜•