[Vue+Nuxt.js] Nuxt.js๋ฅผ ์ด์šฉํ•˜์—ฌ ์‡ผํ•‘ ์ƒํ’ˆ ๊ฒ€์ƒ‰ UI ๊ฐœ๋ฐœ

2022. 6. 1. 22:57ใ†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.

 

 

 

 

 

 

๐Ÿš€ ์‡ผํ•‘ ์ƒํ’ˆ ๊ฒ€์ƒ‰ UI ๊ฐœ๋ฐœ

    ๐Ÿ”ฝ  ๊ฒ€์ƒ‰ UI ์ปดํฌ๋„ŒํŠธํ™”

์ตœ์ดˆ ๊ฒ€์ƒ‰์ด๋ผ๋Š” ๊ธฐ๋Šฅ์€ ์–ด๋””์„œ๋“ ์ง€ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ๊ณตํ†ต component๋กœ ๋งŒ๋“ค์–ด ์ฃผ๋Š” ๊ฒƒ์ด ์ข‹๊ธฐ ๋•Œ๋ฌธ์— /components ๋ฐ‘์— SearchInput.vue๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ๋„๋ก ํ• ๊ฒŒ์š”.

/components/SearchInput.vue

 

๊ทธ๋ฆฌ๊ณ , /pages/index.vue์—๋Š” ๊ฒ€์ƒ‰์„ ์œ„ํ•ด ๋„ฃ์–ด์คฌ์—ˆ๋˜ Input Tag๊ฐ€ ์žˆ๋Š”๋ฐ, ์ด ๊ฒƒ์„ ์ง€์šฐ๊ณ , ์œ„์—์„œ ๋งŒ๋“  Component๊ฐ€ ๋ถ™๋„๋ก ์ž‘์—…์„ ํ•ด ์ค„ ๊ฒƒ์ด์—์š”.

/pages/index.vue

 

์ฐธ๊ณ ๋กœ 4๋ฒˆ์งธ ์ค„์— <SerchInput์„ ์ž…๋ ฅํ•˜๊ณ , Tab์„ ๋ˆ„๋ฅด๊ฒŒ ๋˜๋ฉด ์ž๋™์œผ๋กœ 19๋ฒˆ์งธ ์ค„์ฒ˜๋Ÿผ import๊ฐ€ ๋  ๊ฒƒ์ด๊ณ , 22๋ฒˆ์งธ ์ค„์ฒ˜๋Ÿผ Component๊ฐ€ ๋“ฑ๋ก๋  ๊ฒƒ์ด์—์š”.

/components/SearchInput.vue

 

ํ•ด๋‹น Component์—์„œ ๊ฒ€์ƒ‰ ์‹œ์— ๋ฐ›์€ ๊ฒ€์ƒ‰์–ด๊ฐ€ /pages/index.vue์™€ ์—ฐ๋™๋˜๊ฒŒ ์ž‘์—…์„ ํ•ด์•ผ ํ•ด์š”.

/pages/index.vue - 1 ~ 19๋ฒˆ์งธ ์ค„

 

์œ„์— ์ฝ”๋“œ ์ค‘ 5 ~ 6์€ 7๋ฒˆ์งธ ์ค„์ด ํ†ตํ•ฉ ํ•˜๋Š” ๊ณผ์ •์„ ๊ธฐ์–ตํ•˜๊ธฐ ์œ„ํ•ด ์ง€์šฐ์ง€ ์•Š์€ ๋ถ€๋ถ„ ์ž…๋‹ˆ๋‹ค. ์—†์–ด์ ธ๋„ ๋˜๋Š” ์ฝ”๋“œ ์ด๋‹ˆ ์ฐธ๊ณ  ๋ถ€ํƒ ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

 

 

/pages/index.vue - 21 ~ 52๋ฒˆ์งธ ์ค„

 

/pages/index.vue - 54 ~ 66๋ฒˆ์งธ ์ค„

 

 

 

๋จผ์ € V-Model์— ๋Œ€ํ•ด์„œ `์ด ๊ณณ`์— ๋‚ด์šฉ์„ ์ค€๋น„ ํ•ด ๋‘์—ˆ์–ด์š”.

 

/components/SearchInput.vue

 


์ตœ์ดˆ ์ด์šฉ์ž๊ฐ€ ๊ฒ€์ƒ‰์–ด๋ฅผ ์ž…๋ ฅํ•˜๊ฒŒ ๋˜๋ฉด 13๋ฒˆ์งธ ์ค„ props๋กœ ๋ฐ›์€ value๋ฅผ Input Tag์— ๊ฐ’์œผ๋กœ ์—ฐ๊ฒฐ์„ ํ•ฉ๋‹ˆ๋‹ค.
Input Tag์— ๊ฐ’์ด ์ž…๋ ฅ๋˜๋ฉด Input Tag์—์„œ input Event๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜๊ณ , 5๋ฒˆ์งธ ์ค„์— @input์œผ๋กœ ์ปดํฌ๋„ŒํŠธ ๊ฐ„ Data ๊ณต์œ ๋ฅผ ์„ ์–ธํ•˜๊ณ , $emit์„ ํ†ตํ•ด ๋ถ€๋ชจ Component์ธ index.vue์— ํ•ด๋‹น Event์˜ value๋ฅผ ์ „๋‹ฌ ํ•ด ์ฃผ๋Š” ๊ฒƒ์ด์—์š”.

/pages/index.vue - 54 ~ 66๋ฒˆ์งธ ์ค„

ํ•ด๋‹น value๋Š” 60๋ฒˆ์งธ ์ค„์— updateSearchKeyword์— ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌ๋˜๊ฒŒ ๋˜๊ณ , 61๋ฒˆ์งธ ์ค„์— this.searchKeyword๋ฅผ ํ†ตํ•ด 

/pages/index.vue - 21 ~ 52๋ฒˆ์งธ ์ค„

50๋ฒˆ์งธ ์ค„์— serachKeyword์— ๊ฐ’์ด ๋“ค์–ด๊ฐ€๊ฒŒ ๋  ๊ฒƒ์ด์—์š”.

์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ๊ฒ€์ƒ‰์–ด์— ๋Œ€ํ•œ Data๋ฅผ Component ๊ฐ„ ๊ณต์œ ๋ฅผ ํ•˜๋„๋ก ํ•ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

 

 

    ๐Ÿ”ฝ  ๊ฒ€์ƒ‰์„ ์œ„ํ•œ API ํ•จ์ˆ˜ ์„ค๊ณ„ ๋ฐ ๊ตฌํ˜„

๊ฒ€์ƒ‰์„ ํ•  ์ค€๋น„๊ฐ€ ๋˜์—ˆ์œผ๋‹ˆ ์ด ๊ฒ€์ƒ‰์–ด๋ฅผ Back End์— ๋ณด๋‚ด์„œ ํ•ด๋‹น ๊ฒ€์ƒ‰์— ๋งž๋Š” ๋‚ด์šฉ์„ ๊ฐ€์ ธ์˜ค๋Š” ์ฒ˜๋ฆฌ๋ฅผ ํ•ด ์ฃผ์–ด์•ผ ํ•ด์š”.

/components/SearchInput.vue

๋จผ์ € ๊ฒ€์ƒ‰์–ด ๊ธฐ๋Šฅ์„ ๋‹ด๋‹นํ•˜๋Š” Component์ธ SearchInput.vue์— 7๋ฒˆ์งธ ์ค„์ฒ˜๋Ÿผ Click Event๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด $emit์„ ํ†ตํ•ด ์ƒ์œ„ Component์— search Event๋ฅผ ์ „๋‹ฌํ•˜๋„๋ก ๋งŒ๋“ค์–ด ์ฃผ์—ˆ์–ด์š”.

/pages/index.vue

๊ทธ๋Ÿผ ๋‹ค์Œ index.vue์—์„œ 4๋ฒˆ์งธ ์ค„์— ๋ณด๋ฉด @search="searchProducts"๋ฅผ ์ถ”๊ฐ€ ํ•ด ์ฃผ์—ˆ๋Š”๋ฐ, ์ด ๋ถ€๋ถ„์ด ๋ฐ”๋กœ ํ•˜์œ„ Component SearchInput.vue 7๋ฒˆ์งธ ์ค„์—์„œ ๋ฐœ์ƒํ•œ Click Event๋ฅผ ๋ฐ›๋Š” ๊ณณ์ด์—์š”. Click Event๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜๋ฉด searchProducts๋ผ๋Š” ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ ๋˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

/pages/index.vue

์ด ๊ณณ์—์„œ ์šฐ๋ฆฌ๊ฐ€ ์ฃผ๋ชฉํ•ด์•ผ ํ•  ๊ณณ์€ 57 ~ 62๋ฒˆ์žฌ ์ค„ ๊นŒ์ง€์—์š”. ์œ„์—์„œ Click Event๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋ฐ”๋กœ ์ด Method๊ฐ€ ํ˜ธ์ถœ ๋˜๊ฒŒ ๋˜๋Š”๋ฐ, 59๋ฒˆ์งธ ์ค„์— ๋ณด๋ฉด fetchProductsByKeyword()๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด์„œ ๊ฒ€์ƒ‰์–ด๋ฅผ ๋‹ด์€ ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•ด ์ฃผ๊ณ  ์žˆ๋Š” ๊ฒƒ์ด์—์š”.

        ๐Ÿ“ฆ API ํ•จ์ˆ˜ ์„ค๊ณ„

fetchProductsByKeyword()๋Š” /api Package๋ฅผ ๋ณด๋ฉด index.js๊ฐ€ ์žˆ์„ํ…๋ฐ ๊ทธ ๊ณณ์— ์ •์˜ํ•˜์—ฌ Moduleํ™” ํ•ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ณณ์—์„œ axios๋ฅผ ์ด์šฉํ•œ API ํ†ต์‹  ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด ์ค„ ๊ฑฐ์—์š”.

/api/index.js

์šฐ๋ฆฌ๋Š” ์ด๋Ÿฐ์‹์œผ๋กœ Query String ๋ฐฉ์‹์„ ์ด์šฉํ•œ API๋ฅผ ์„ค๊ณ„ํ•  ์ˆ˜๋„ ์žˆ์–ด์š”. ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒ ํ•  ํ•„์š”๊ฐ€ ์—†๋Š”๋ฐ, ์ผ๋‹จ ์ด๋ ‡๊ฒŒ ๋˜๋ฉด Query String์„ ๋งค ๋ฒˆ ๋ถ™์—ฌ์•ผ ํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์ด ์ƒ๊ธฐ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด์—์š”.

๊ทธ๋ž˜์„œ ์œ„์™€ ๊ฐ™์ด config์™€ params ์†์„ฑ ์ด์šฉํ•˜์—ฌ ๊ฐ์ฒด๋ฅผ ๋ณด๋‚ด๋ฒ„๋ฆฌ๋Š” ๋ฐฉ์‹์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋…์„ฑ ๋“ฑ ๋ฉด์—์„œ ์ข‹๋‹ต๋‹ˆ๋‹ค.

 

/pages/index.vue

๋‹ค์‹œ index.vue์— searchProducts()๋ฅผ ๋ณด๋ฉด ์œ„ API๋ฅผ ํ†ตํ•ด ๋ฐ›์•„์˜จ Data๋ฅผ ์ƒ์ˆ˜ํ˜• ๋ณ€์ˆ˜ response์— ๋‹ด์•„์ฃผ๊ฒŒ ๋˜์š”. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ด Data ๊ฐ’์„ ์ถœ๋ ฅํ•ด ๋ณด๊ฒŒ ๋˜๋ฉด

http://localhost:4000/

์ผ๋‹จ์€ ๊ฒ€์ƒ‰์–ด์— 'chicken'์„ ์ž…๋ ฅ ํ•ด ์ฃผ์—ˆ๊ณ , ๊ฐœ๋ฐœ์ž ๋„๊ตฌ๋ฅผ ํ†ตํ•ด ์ฝ˜์†” ์ถœ๋ ฅ์„ ํ™•์ธํ•ด ๋ณด๋ฉด 3๊ฐœ์— ๋ฐฐ์—ด์ด ์‘๋‹ต ๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์–ด์š”.

name์„ ๋ณด๋‹ˆ chicken์ด๋ผ๋Š” ๋‹จ์–ด๊ฐ€ ๋“ค์–ด๊ฐ„ ๋‚ด์šฉ๋“ค์„ ๊ฒ€์ƒ‰ํ•ด ์˜จ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜๊ฐ€ ์žˆ์–ด์š”!

 

 

๋ฐ˜์‘ํ˜•

 

 

    ๐Ÿ”ฝ  ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ ๋งˆ๋ฌด๋ฆฌ

        ๐Ÿ“ฆ serchProducts()

๊ณ„์†ํ•ด์„œ ์šฐ๋ฆฌ๋Š” serchProducts()๋ฅผ ์œ ์‹ฌํžˆ ์ง€์ผœ๋ณผ ๊ฒƒ์ด์—์š”.

 

/pages/index.vue

์ด๋ฒˆ์— ์ถ”๊ฐ€๋œ ๋‚ด์šฉ์€ 65~68๋ฒˆ์งธ ์ค„ ๊นŒ์ง€์—์š”.

์„ค๋ช…ํ•˜๊ธฐ์— ์•ž ์จ ์šฐ๋ฆฌ๋Š” asyncData()๋ฅผ ํ†ตํ•ด products๋ผ๋Š” ์ƒ์ˆ˜ํ˜• ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด ์ค€ ์ ์ด ์žˆ์–ด์š”.


ํ•ด๋‹น ๋‚ด์šฉ์„ ๋ชป ๋ณด๊ณ  ์˜ค์‹  ๋ถ„๋“ค์€ '์ด ๊ณณ'์—์„œ ๋งŒ๋‚˜์‹ค ์ˆ˜ ์žˆ๊ฒŒ ์ค€๋น„ ํ•ด ๋‘์—ˆ์Šต๋‹ˆ๋‹ค!

/pages/index.vue

 

ํ˜„์žฌ data()์—๋Š” products๋ผ๋Š” ์นœ๊ตฌ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์ง€๋งŒ, 

 

/pages/index.vue

asyncData()์— return ํ•œ ๊ฐ’์ด Vue Data()์— ์†์„ฑ์œผ๋กœ ์ •์˜ ๋ฐ ์„ค์ •์ด ๋˜๋Š” ์ ์„ ์šฐ๋ฆฌ๊ฐ€ ๊ผญ ๊ธฐ์–ตํ•ด ๋‘์–ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด์—์š”. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— products๋Š” ํ•ด๋‹น ์ธ์Šคํ„ด์Šค(๊ฐ์ฒด)์— Data() ์†์„ฑ์œผ๋กœ ์กด์žฌํ•˜๊ณ  ์žˆ๋‹ต๋‹ˆ๋‹ค.

 

http://localhost:4000/

์ด๋ ‡๊ฒŒ ํ•˜๊ณ  ๋‚˜๋ฉด ์œ„์™€ ๊ฐ™์ด ๊ฒ€์ƒ‰์–ด๋ฅผ ์ž…๋ ฅํ–ˆ์„ ๋•Œ, ํ•ด๋‹น ๊ฐ’์— ํ•ด๋‹นํ•˜๋Š” ๋‚ด์šฉ๋งŒ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์š”.

ํ˜„์žฌ Back End๋Š” FE๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ์ž„์‹œ์ ์ธ Server์ด๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์ง„์ด Chicken๊ณผ๋Š” ๋งž์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์„ ๊ผญ ์ฐธ๊ณ  ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

 

 

 

 

    ๐Ÿ”ฝ  Header์™€ ๊ฒ€์ƒ‰ UI Style ์ •๋ฆฌ
        ๐Ÿ“ฆ defulat.vue

์ตœ์ดˆ Header๋ถ€๋ถ„์— ๋Œ€ํ•œ CSS ์ฒ˜๋ฆฌ๋ฅผ ํ•ด ๋ณด๋„๋ก ํ• ๊ฒŒ์š”.

Header์— ๋Œ€ํ•œ ๋‚ด์šฉ์€ /layouts/default.vue์— ์œ„์น˜ํ•˜๊ณ  ์žˆ์–ด์š”.

/layouts/default.vue

๊ณตํ†ต์˜ Style์„ ๊พธ๋ฏธ๋ ค๊ณ  ํ•  ๋•Œ layouts Package ๋ฐ‘์— vue File์„ ๋งŒ๋“ค์–ด์ฃผ๋ฉด ๋œ๋‹ค๊ณ  ์šฐ๋ฆฌ๋Š” ๊ณต๋ถ€๋ฅผ ํ–ˆ์—ˆ์–ด์š”.
Header๋ผ๋Š” ์นœ๊ตฌ๋Š” ์–ด๋Š Page์—๋‚˜ ๊ณตํ†ต์œผ๋กœ ๋‚˜์™€์•ผ ํ•˜๋Š” ๋ถ€๋ถ„์ด๊ธฐ ๋•Œ๋ฌธ์— ์œ„ Package์— ๋งŒ๋“ค์–ด ์ฃผ์—ˆ์–ด์š”.

์ตœ์ดˆ header์— class๋ฅผ title๋กœ ํ•˜๊ณ , 16 ~ 20๋ฒˆ์งธ๊นŒ์ง€ ํ•ด๋‹น ๋‚ด์šฉ์— ๋Œ€ํ•œ CSS๋ฌธ์„ ์ž‘์„ฑํ•ด ์ฃผ์—ˆ์–ด์š”.

๊ทธ๋ฆฌ๊ณ , NuxtLink์— class๋ฅผ logo๋ผ๊ณ  ์ •์˜ํ•˜๊ณ , 22๋ฒˆ์งธ ~ 27๋ฒˆ์งธ๊นŒ์ง€ ํ•ด๋‹น Class ์ด๋ฆ„๊ณผ Matching๋˜๋Š” CSS๋ฌธ์„ ์ž‘์„ฑํ•ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.


 

        ๐Ÿ“ฆ SerchInput.vue

์ด๋ฒˆ์—๋Š” ๊ฒ€์ƒ‰์— ๋Œ€ํ•œ Input Box์™€ Button์„ ๊พธ๋ฉฐ๋ณผ๊ฒŒ์š”.

/components/SearchInput.vue

์ตœ์ดˆ 2๋ฒˆ์งธ ์ค„์— dIv Tag์˜ class๋ฅผ input-wrapper๋กœ ์ง€์–ด์ฃผ๊ณ , 5๋ฒˆ์งธ ์ค„์— input Tag์— class๋ฅผ search-input์ด๋ผ๊ณ  ์ด๋ฆ„ ์ง€์–ด ์ฃผ์—ˆ์–ด์š”.

๊ทธ๋ฆฌ๊ณ , 8๋ฒˆ์งธ ์ค„์— button Tag class๋ฅผ btn์ด๋ผ๊ณ  ์ด๋ฆ„ ์ง€์–ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

/components/SearchInput.vue - style

 

๊ทธ๋Ÿฐ ๋’ค ์œ„์™€ ๊ฐ™์ด CSS๋ฌธ์„ ์ž…๋ ฅํ•˜์—ฌ ๊พธ๋ฉฐ ์ฃผ์—ˆ์–ด์š”. ์ฐธ๊ณ ๋กœ .์ด ๋ถ™์€ ๊ฒƒ์€ class ์ด๋ฆ„๊ณผ Matching์ด ๋˜๊ณ , .์ด ๋ถ™์ง€ ์•Š์€ ๊ฒƒ์€ ID ์ด๋ฆ„๊ณผ Matching์ด ๋œ๋‹ต๋‹ˆ๋‹ค. ํ•ด๋‹น ๋‚ด์šฉ์— ๋Œ€ํ•ด ์ž˜ ๋ชจ๋ฅด๊ฒ ๋Š” ๋ถ„๋“ค์„ ์œ„ํ•ด '์ด ๊ณณ'์— ์ •๋ฆฌ ํ•ด ๋‘์—ˆ์–ด์š”!

๋˜ํ•œ, Style Tag์— scoped๋ผ๊ณ  ๋ถ™๋Š” ๊ฒƒ์€ ํ•ด๋‹น vue File์—์„œ๋งŒ ์ ์šฉ๋˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•จ์ด์—์š”.

์ฆ‰, Vue๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ์ ํŠธ๋Š” ๋‹ค์ˆ˜์˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•˜๋‚˜์˜ ์•ฑ์„ ๊ตฌํ˜„ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๊ฐ๊ฐ์˜ ์ปดํฌ๋„ŒํŠธ์— ์„ ์–ธ๋œ ์Šคํƒ€์ผ์ด ์˜๋„ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์‹ค์ˆ˜์— ์˜ํ•˜์—ฌ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ์„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด์—์š”. ์ด์ฒ˜๋Ÿผ ์˜ค์ง ํŠน์ • ์ปดํฌ๋„ŒํŠธ์—๋งŒ ๊ณ ์œ ์˜ ์Šคํƒ€์ผ์„ ์„ ์–ธํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ vue-loader๊ฐ€ ์ œ๊ณตํ•˜๋Š” scoped ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

 

 

 

 

 

728x90
๋ฐ˜์‘ํ˜•