1. ๊ฐœ๋ฐœํ™˜๊ฒฝ ์„ธํŒ…๊ณผ Vue3.js ์ตœ์‹ ๋ฒ„์ „ ์„ค์น˜

01. ๊ฐœ๋ฐœํ™˜๊ฒฝ ์„ค์น˜

Creating a Vue Application

npm init vue@latest
  • ์ด ๋ช…๋ น์–ด๋กœ vue ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑ ํ•  ์ˆ˜ ์žˆ์Œ
  • ์ดํ›„ ์ž…๋ ฅ์œผ๋กœ ์„ค์ • ํ•  ์ˆ˜ ์žˆ์Œ
โœ” Project name: โ€ฆ <your-project-name>
โœ” Add TypeScript? โ€ฆ No
โœ” Add JSX Support? โ€ฆ No
โœ” Add Vue Router for Single Page Application development? โ€ฆ No
โœ” Add Pinia for state management? โ€ฆ No
โœ” Add Vitest for Unit testing? โ€ฆ No
โœ” Add Cypress for both Unit and End-to-End testing? โ€ฆ No
โœ” Add ESLint for code quality? โ€ฆ No
โœ” Add Prettier for code formatting? โ€ฆ No

Scaffolding project in ./<your-project-name>...
Done.
  • ํ”„๋กœ์ ํŠธ๋กœ ๋“ค์–ด๊ฐ€์„œ code . ๋กœ vscode ์‹คํ–‰
> cd <your-project-name>
> npm install
> npm run dev
  • ๋งŒ์•ฝ ๋นŒ๋“œ ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, npm run build๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋นŒ๋“œํ•จ
  • ๋นŒ๋“œํ•˜๋ฉด html, css, js 3๊ฐœ ํŒŒ์ผ์ด ๋‚˜์˜ด

02. ์ž์ฃผ ๋œจ๋Š” ์˜ค๋ฅ˜

์ €๋Š” ์„ค์น˜๊ฐ€ 10๋ถ„์ด์ƒ ๊ฑธ๋ ค์š”

  • ์ธํ„ฐ๋„ท ๋А๋ฆฌ๋ฉด ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ์Šคํƒ€๋ฒ…์Šค์—์„œ ํ•˜์ง€ ๋ง๊ณ  ์ง‘์—์„œ ํ•˜์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค.

npm, yarn ๋ช…๋ น์–ด ์ž…๋ ฅํ•˜์ž๋งˆ์ž ์—๋Ÿฌ๊ฐ€ ๋‚ฉ๋‹ˆ๋‹ค

  • ์„ค์น˜๊ฐ€ ์ž˜ ๋˜๋‹ค๊ฐ€ ๊ฐ‘์ž๊ธฐ ์ค‘๊ฐ„์— ๋นจ๊ฐ„๊ฒŒ ๋œจ๋ฉฐ ์—๋Ÿฌ๊ฐ€ ๋‚˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ๋Š”
  • 99%ํ™•๋ฅ ๋กœ nodejs๊ฐ€ ์ตœ์‹ ๋ฒ„์ „์ด ์•„๋‹ ๊ฒฝ์šฐ ์ž…๋‹ˆ๋‹ค.
  1. nodejs ์‚ญ์ œ ํ›„
  2. ๋‹ค๋ฅธ ๋ฒ„์ „ ๋‹ค์šด๋ฐ›์•„์„œ ๋‹ค์‹œ ์‹œ๋„ํ•ด๋ณด์‹ญ์‹œ์˜ค

npm : command not found ์—๋Ÿฌ

  • npm : command not found ๋ผ๋Š” ์—๋Ÿฌ๊ฐ€ ๋œจ๋Š” ๊ฒƒ์€ ์—ญ์‹œ 99%์˜ ํ™•๋ฅ ๋กœ node ์ด์ƒํ•˜๊ฒŒ ์„ค์น˜ํ•˜์…”์„œ ์ž…๋‹ˆ๋‹ค.
  • nodejs ์„ค์น˜์‹œ ์„ค์น˜๊ฒฝ๋กœ ๋งŒ์ง€์ง€ ๋งˆ์‹ญ์‹œ์˜ค.
  • ๋งฅ๋„ brew ์–ด์ฉŒ๊ตฌ ๊ทธ๋Ÿฐ๊ฑธ๋กœ ์„ค์น˜ํ•˜์ง€ ๋งˆ์‹œ๊ณ  ๋‹ค์šด๋ฐ›์œผ์„ธ์š”.
  • ๋ฆฌ๋ˆ…์Šค๋Š” nodejs ๋ฒ„์ „ ์—…๊ทธ๋ ˆ์ด๋“œ ์ปค๋งจ๋“œ ์ฐพ์•„์„œ ์ž…๋ ฅํ•˜์‹œ๋ฉด ๋˜๋‹ˆ ์•Œ์•„์„œ ์ž˜ ํ•˜์‹œ๋ฆฌ๋ผ ๋ฏฟ์Šต๋‹ˆ๋‹ค.

๋งฅ์—์„œ permission์ด ์—†์–ด์š”, ๊ถŒํ•œ์ด ์—†์–ด์š” ์ด๋Ÿฐ ์—๋Ÿฌ๊ฐ€ ๋œฌ๋‹ค๋ฉด

  • ์ง๊ด€์ ์ธ ํ•ด๊ฒฐ์ฑ…์€ ๊ทธ๋ƒฅ npm์ด๋‚˜ yarn ์“ฐ์‹ค ๋•Œ ์•ž์— sudo ๋ผ๋Š” ๋‹จ์–ด๋ฅผ ๋ถ™์—ฌ์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
  • sudo npm init vue@latest ์ด๋Ÿฐ ์‹์œผ๋กœ ํ•˜๋ฉด ์ž˜ ๋ฉ๋‹ˆ๋‹ค
  • ์„ค์น˜ ์ค‘๊ฐ„์— ์—ฌ๋Ÿฌ๋ถ„ ๋งฅ๋ถ ๋น„๋ฒˆ์ž…๋ ฅ์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ทผ๋ฐ sudo๋Š” ์ž„์‹œ๋ฐฉํŽธ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.
npm ERR! syscall access
npm ERR! Error: EACCES: permission denied, access '/usr/local/lib/node_modules'
  • ์˜ˆ๋ฅผ ๋“ค๋ฉด ์ด๋Ÿฐ ์—๋Ÿฌ์ธ๋ฐ ํด๋” ์ˆ˜์ • ๊ถŒํ•œ์ด ์—†๋‹ค๊ณ  ์—๋Ÿฌ๋ฅผ ๋„์šฐ๋Š” ๊ฑฐ๋ฉด
  • ์œ„์˜ ๊ฒฝ์šฐ /usr/local/lib/node_modules ๋ผ๋Š” ํด๋”์— ์ˆ˜์ •๊ถŒํ•œ์„ ์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
  • ํ„ฐ๋ฏธ๋„์„ ์ผœ์„œ ์ด๊ฑฐ ๋‘˜ ์ค‘์— ํ•˜๋‚˜๋ฅผ ์ž…๋ ฅํ•ด๋ณด์‹ญ์‹œ์˜ค
sudo chown -R ๋‹˜๋งฅ๋ถ์œ ์ €์ด๋ฆ„: ์œ„์—์—๋Ÿฌ๋œฌ๊ฒฝ๋กœ
sudo chown -R $USER ์œ„์—์—๋Ÿฌ๋œฌ๊ฒฝ๋กœ
  • ์•„๋งˆ ๋‘˜ ์ค‘ ํ•˜๋‚˜ ์ž…๋ ฅํ•˜์‹œ๋ฉด ๋Œ€๋ถ€๋ถ„ ํ•ด๊ฒฐ๋  ๊ฒ๋‹ˆ๋‹ค.
  • ๋‹˜๋งฅ๋ถ์œ ์ €์ด๋ฆ„์€ ํ„ฐ๋ฏธ๋„์— whoami ์ž…๋ ฅํ•˜์‹œ๋ฉด ๋‚˜์˜ต๋‹ˆ๋‹ค.
  • ์—ญ์‹œ ์ด๊ฒƒ๋„ ์ž„์‹œ๋ฐฉํŽธ์ด๊ธด ํ•œ๋ฐ
  • ์ด๊ฑฐ ๋ง๊ณ ๋„ ๋‹ค๋ฅธ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋‹ˆ ๊ทธ๋Œ€๋กœ ๊ตฌ๊ธ€์— ์—๋Ÿฌ๋ฉ”์„ธ์ง€ ๊ฒ€์ƒ‰ํ•ด๋ณด์‹œ๋ฉด ๋˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์œˆ๋„์šฐ Powershell์—์„œ ๋นจ๊ฐ„๊ธ€์”จ๋กœ โ€˜๋ณด์•ˆ์˜ค๋ฅ˜โ€™๊ฐ€ ๋œน๋‹ˆ๋‹ค.

  • โ€œํ—ˆ๊ฐ€๋˜์ง€ ์•Š์€ ์Šคํฌ๋ฆฝํŠธ ์ž…๋‹ˆ๋‹ค ์–ด์ฉŒ๊ตฌ~โ€ ๊ทธ๋Ÿฐ ์—๋Ÿฌ๊ฐ€ ๋œจ๋ฉด
  • ์œˆ๋„์šฐ ๊ฒ€์ƒ‰๋ฉ”๋‰ด (๋‹๋ณด๊ธฐ) - Powershell ๊ฒ€์ƒ‰ - ์šฐํด๋ฆญ - ๊ด€๋ฆฌ์ž ๊ถŒํ•œ์œผ๋กœ ์‹คํ–‰ํ•œ ๋’ค
  • Set-ExecutionPolicy Unrestricted
  • ๋ผ๊ณ  ๋Œ€์†Œ๋ฌธ์ž ํ•˜๋‚˜๋ผ๋„ ํ‹€๋ฆฌ์ง€์•Š๊ณ  ์ž…๋ ฅํ•˜์‹ญ์‹œ์˜ค.
  • ๊ทธ๋Ÿผ ์ด์ œ npm์œผ๋กœ ๋ญ ํ•˜๋Š”๊ฑฐ ์ž˜๋ฉ๋‹ˆ๋‹ค.

์œˆ๋„์šฐ Powershell์„ ์ด์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋„ ๊ถŒํ•œ์ด ์—†๋‹ค๊ณ  ๋ญ๋ผ ๊ทธ๋Ÿด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๊ทธ๋ ‡๋‹ค๋ฉด ์œˆ๋„์šฐ ๊ฒ€์ƒ‰๋ฉ”๋‰ด์—์„œ powershell์„ ๊ฒ€์ƒ‰ ํ›„ ์šฐํด๋ฆญ - ๊ด€๋ฆฌ์ž ๊ถŒํ•œ์œผ๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ทธ ๋‹ค์Œ์— npm init vue@latest ๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.
  • ๊ทธ๋Ÿผ ๋ฉ๋‹ˆ๋‹ค.
  • ์ด ๊ฒฝ์šฐ vue create ์–ด์ฉŒ๊ตฌ ํ•  ๋•Œ๋„
  • ์ž‘์—…ํด๋”๋ฅผ ์˜คํ”ˆํ•œ ๋’ค์— ์ƒ๋‹จ ๋ฉ”๋‰ด์—์„œ ํŒŒ์ผ - powershell์—ด๊ธฐ - ๊ด€๋ฆฌ์ž ๊ถŒํ•œ์œผ๋กœ powershell ์—ด๊ธฐ ๋ˆ„๋ฅด์‹  ํ›„ ์ž…๋ ฅํ•ด๋ณด์‹ญ์‹œ์˜ค.

2. HTML์— ๋ฐ์ดํ„ฐ ๊ฝƒ์•„๋„ฃ๋Š” Vue ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ ๋ฌธ๋ฒ•

00. ์˜ค๋Š˜์˜ 5๋ถ„ ์ˆ™์ œ

  • ์ผ๋‹จ ์ด๋ ‡๊ฒŒ ์ƒ๊ธด ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜๋‹จ์— ํ•˜๋‚˜ ์ €์žฅํ•จ
products: ["์—ญ์‚ผ๋™์›๋ฃธ", "์ฒœํ˜ธ๋™์›๋ฃธ", "๋งˆํฌ๊ตฌ์›๋ฃธ"];

image

  • ๊ทธ ๋ฐ์ดํ„ฐ์™€ {{๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ}} ๋ฌธ๋ฒ•์œผ๋กœ ๋Œ€์ถฉ ์ด๋ ‡๊ฒŒ ์ƒ๊ธด HTML ๋ ˆ์ด์•„์›ƒ์„ ๋งŒ๋“ค์–ด๋ณด์…ˆ
  • ๊ฐ€๊ฒฉ์€ ๋Œ€์ถฉ ์ž„์‹œ๋กœ ์•„๋ฌด๊ฑฐ๋‚˜ ๊ธฐ์ž…ํ•˜๋ฉด๋จ

01. ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ

HTML์— ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฝ‚์•„๋„ฃ๊ณ  ์‹ถ์„ ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ๋ฐ”์ธ๋”ฉ์ด๋ผ๊ณ  ํ•˜๋Š”๋ฐ

Vue์—์„œ ๋ฐ์ดํ„ฐ๋ฐ”์ธ๋”ฉ ํ•˜๋Š” ๋ฌธ๋ฒ•์„ 2๊ฐœ ์•Œ์•„๋ณด๋„๋ก ํ•ฉ์‹œ๋‹ค.

๊ทผ๋ฐ ์• ์ดˆ์— ๋ฐ์ดํ„ฐ๋ฐ”์ธ๋”ฉ์„ ์™œ ํ•˜๋Š”์ง€ ์˜๋ฌธ์  ๋ถ€ํ„ฐ ๋“ค์ง€ ์•Š์Šต๋‹ˆ๊นŒ.

๊ทธ๋Ÿฐ๊ฑฐ ๊ถ๊ธˆํ•ดํ•ด์•ผ ๋‚˜์ค‘์— ์—ฌ๋Ÿฌ๋ถ„ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ ํ• ์ง€ ๋ง์ง€ ์Šค์Šค๋กœ ํŒ๋‹จํ•˜๋Š” ํ›Œ๋ฅญํ•œ ์‚ฌ๋žŒ์ด ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ ๋ถ€ํ„ฐ ์•Œ์•„๋ด…์‹œ๋‹ค.

02. Vue ๊ฐœ๋ฐœ์€ ์–ด๋ ค์šด๊ฒŒ ์•„๋‹˜

์–ด๋”œ๊ฐ€๋‚˜ ์ด์ƒํ•œ ๋ฌธ๋ฒ•๋ถ€ํ„ฐ ๊ฐ€๋ฅด์น˜๋‹ˆ๊นŒ ํ˜ผ์ž ์ฝ”๋“œ์งœ๋Š”๊ฑฐ ์–ด๋ ค์›Œ๋“ค ํ•˜์‹œ๋Š”๋ฐ

๊ทธ๋ƒฅ ํ‰์†Œ์— HTML CSS๋กœ ์›นํŽ˜์ด์ง€ ๊ฐœ๋ฐœํ•˜๋˜ ๋Œ€๋กœ ์ญ‰ ์ฝ”๋“œ์งœ์‹œ๋ฉด ๋˜๊ณ 

ํ•„์š”ํ•œ ์ˆœ๊ฐ„์ˆœ๊ฐ„ Vue ๋ฌธ๋ฒ•์„ ์ฒจ๊ฐ€ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์›๋ฃธํŒŒ๋Š” ์‡ผํ•‘๋ชฐ์„ ํ•œ๋ฒˆ ๋งŒ๋“ค์–ด๋ด…์‹œ๋‹ค. ์ผ๋‹จ ๋ ˆ์ด์•„์›ƒ ๋ถ€ํ„ฐ์š”.

<template>
  <div>
    <h4>XX ์›๋ฃธ</h4>
    <p>XX ๋งŒ์›</p>
  </div>
  <div>
    <h4>XX ์›๋ฃธ</h4>
    <p>XX ๋งŒ์›</p>
  </div>
</template>

HTML ์ฝ”๋“œ๋“ค์€ <template>์•ˆ์— ์ง‘์–ด๋„ฃ์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ์€ <script> ์Šคํƒ€์ผ์€ <style> ์•ˆ์— ๋„ฃ์œผ์‹ญ์‹œ์˜ค.

๊ทธ๋ž˜์„œ ์•„๋ฌดํŠผ ์ €๋Ÿฐ HTML์„ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค. ๋ฐฐ์šธ ๋ฌธ๋ฒ•์ด ํ•˜๋‚˜ ์žˆ์–ด์„œ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค.

03. Vue์˜ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ ๋ฌธ๋ฒ•

JavaScript๋กœ ์ž์ฃผ ํ•˜๋Š” ์ง“๊ฑฐ๋ฆฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ณ€์ˆ˜๋‚˜ ๋ฐ์ดํ„ฐ๋ฅผ HTML์— ๊ฝ‚์•„๋„ฃ๋Š” ๋ฐ์ดํ„ฐ๋ฐ”์ธ๋”ฉ์ž…๋‹ˆ๋‹ค.

์ „ํ†ต๋ฐฉ์‹์€ ์ด๋ ‡๊ฒŒ ๊ธธ๊ฒŒ ํ•œ์ค„ ์จ์•ผ ๋ฐ์ดํ„ฐ๋ฐ”์ธ๋”ฉ์ด ๊ฐ€๋Šฅํ–ˆ์Šต๋‹ˆ๋‹ค.

document.getElementById(์–ด์ฉŒ๊ตฌ).innerHTML = ๋ฐ์ดํ„ฐ;

๊ทผ๋ฐ Vue๋Š” ๊ทธ๋Ÿด ํ•„์š”์—†์ด

  1. ์ผ๋‹จ ๋ฐ์ดํ„ฐ๋ณด๊ด€๋ถ€ํ„ฐ ์–ด๋”˜๊ฐ€์— ํ•˜์‹œ๊ณ 

  2. ๊ทธ๊ฑธ {{๋ฐ์ดํ„ฐ}} ์ด๋Ÿฐ ๋ฌธ๋ฒ•์œผ๋กœ HTML ์ค‘๊ฐ„์ค‘๊ฐ„์— ์‰ฝ๊ฒŒ ๊ฝ‚์•„๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

data๋ณด๊ด€ํ•จ์€ ์—ฌ๊ธฐ์žˆ์Šต๋‹ˆ๋‹ค.

<script>
  export default {
    name: "App",
    data() {
      return {
        price1: 60,
      };
    },
  };
</script>

script ํƒœ๊ทธ ์•ˆ์— data(){ return { } } ์ด๊ฑธ ์—ด๊ณ 

๋ฐ์ดํ„ฐ๋ฅผ object ํ˜•์‹์œผ๋กœ ์ €์žฅํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์ด๊ฒŒ Vue์˜ data๋ณด๊ด€ํ•จ, ๋ณ€์ˆ˜๋ณด๊ด€ํ•จ์ด๋ผ๊ณ  ๋ณด์‹œ๋ฉด ๋˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์ค‘์š”ํ•œ ๋ฐ์ดํ„ฐ๋Š” ๋‹ค ์—ฌ๊ธฐ ๋ณด๊ด€ํ•˜์‹ญ์‹œ์˜ค. ์ค‘๊ด„ํ˜ธ๋‹ˆ๊นŒ object ํ˜•์‹์— ๋งž์ถฐ์„œ์š”.

๊ทธ๋Ÿผ ์ด์ œ price1 ์ด๋ผ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ HTML์•ˆ์— ๊ฝ‚์•„๋„ฃ์–ด์„œ ์œ ์ €์—๊ฒŒ ๋ณด์—ฌ์ฃผ๊ณ  ์‹ถ์œผ๋ฉด

{{ price1 }} ์ด๊ฒƒ๋งŒ ์“ฐ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

<p>{{ price1 }} ๋งŒ์›</p>

์ €์žฅํ•˜๋ฉด ๋ธŒ๋ผ์šฐ์ €์— 60๋งŒ์›์ด๋ผ๊ณ  ์ž˜ ๋œน๋‹ˆ๋‹ค.

Q. ๋ญ์ž„ ๊ทธ๋ƒฅ ์• ์ดˆ์— <p>60๋งŒ์›</p> ์ด๋ ‡๊ฒŒ ํ•˜๋“œ์ฝ”๋”ฉํ•˜๋ฉด ๋˜๋Š”๋ฐ ๊ตณ์ด ๋ฐ์ดํ„ฐ๋กœ ์ €์žฅํ•ด๋’€๋‹ค๊ฐ€ ์™œ ๋ฐ์ดํ„ฐ๋ฐ”์ธ๋”ฉํ•จ?

์ด์œ 1. ์‡ผํ•‘๋ชฐ์€ ๊ฐ€๊ฒฉ์ด ๋งจ๋‚  ๋ณ€๋™๋˜์ง€์•Š์Šต๋‹ˆ๊นŒ.

๊ทธ๊ฑธ ๋ฐ์ดํ„ฐ๋กœ ์ €์žฅํ•ด๋†“์œผ๋ฉด ์ˆ˜์ •์ด ๋‚˜์ค‘์— ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

JS๋กœ ์กฐ์ž‘์ด ์‰ฝ๊ฑฐ๋“ ์š”

์ด์œ 2. Vue์˜ ์‹ค์‹œ๊ฐ„ ๋ Œ๋”๋ง๊ธฐ๋Šฅ ์“ฐ๋ ค๋ฉด ๋ฐ์ดํ„ฐ๋ฐ”์ธ๋”ฉ ํ•ด๋†“์œผ์‹ญ์‹œ์˜ค

Vue๋Š” ์‹ ๊ธฐํ•ด์„œ data๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด data์™€ ๊ด€๋ จ๋œ HTML์— ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค.

๋งŒ์•ฝ์— ์—ฌ๋Ÿฌ๋ถ„์ด price1์„ 60์—์„œ 70์œผ๋กœ ์กฐ์ •ํ•˜๋ฉด

{{ price1 }} ์—๋„ ๊ทธ ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ๋ฐ”๋กœ ์ ์šฉ๋œ๋‹ค๋Š” ์†Œ๋ฆฌ์ž…๋‹ˆ๋‹ค.

๋”ฐ๋กœ ์ฝ”๋“œ์งค ํ•„์š” ์—†์ด ์ž๋™์œผ๋กœ ์ƒฅ ๋ฐ”๋€๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ด๋Ÿฐ ์‚ฌ์ดํŠธ๋ฅผ ์šฐ๋ฆฌ๋Š” ์›น์•ฑ์ด๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์›น์•ฑ ๋งŒ๋“ค๊ณ  ์‹ถ์œผ๋ฉด ์ข‹์€ ๋งํ•  ๋•Œ ์ž์ฃผ ๋ฐ”๋€” ๋“ฏํ•œ ๋ฐ์ดํ„ฐ๋“ค์„ data๋ž€์— ์ง‘์–ด๋„ฃ๊ณ 

๋ฐ์ดํ„ฐ๋ฐ”์ธ๋”ฉํ•ด์„œ ๋ณด์—ฌ์ฃผ์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค.

04. HTML ์†์„ฑ๋„ ๋ฐ์ดํ„ฐ๋ฐ”์ธ๋”ฉ์ด ๊ฐ€๋Šฅ

๊ทธ๋‹ˆ๊นŒ style=โ€โ€ id=โ€โ€ class=โ€โ€ ์ด๋Ÿฐ ๊ฒƒ๋“ค์—๋„

๋ฐ‘์— ์ €์žฅํ•ด๋‘” data๋ฅผ ๊ฝ‚์•„๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

<template>
  <div>
    <h4 :style="์Šคํƒ€์ผ">XX ์›๋ฃธ</h4>
    <p>XX ๋งŒ์›</p>
  </div>
  <div>
    <h4>XX ์›๋ฃธ</h4>
    <p>XX ๋งŒ์›</p>
  </div>
</template>

<script>
  export default {
    name: "App",
    data() {
      return {
        price1: 60,
        ์Šคํƒ€์ผ: "color:red",
      };
    },
  };
</script>

์ด๋ ‡๊ฒŒ ์งœ์‹œ๋ฉด color : red๋ผ๋Š” ๋ฐ์ดํ„ฐ๋„ ์›ํ•˜๋Š” ๊ณณ์— ๊ฝ‚์•„๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒ์ƒํ•˜๋Š” ๋ชจ๋“  ์†์„ฑ์— ๋ฐ์ดํ„ฐ ๊ฝ‚์•„๋„ฃ๊ธฐ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

3. ๋ฆฌ์•กํŠธ๋ณด๋‹ค 100๋ฐฐ ์‰ฌ์šด Vue ๋ฐ˜๋ณต๋ฌธ v-for

00. ์˜ค๋Š˜์˜ 5๋ถ„ ์ˆ™์ œ

  • v-for ๋ฌธ๋ฒ•์„ ์ด์šฉํ•ด ์ง€๊ธˆ ์žˆ๋Š” ์ƒํ’ˆ๋ชฉ๋ก์„ ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ์ถ•์•ฝํ•ด๋ณด์‹ญ์‹œ์˜ค.

  • ๊ฐ€๊ฒฉ์€ ์‹ ๊ฒฝ์“ฐ์ง€๋ง๊ณ  ์ƒํ’ˆ์ œ๋ชฉ๋งŒ ์ž˜ ๋ณด์ด๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์ €๋ฒˆ์‹œ๊ฐ„ ์ˆ™์ œ ์ €๋ฒˆ ์‹œ๊ฐ„์— ํ•˜๋‹จ์— ๋ฐ์ดํ„ฐ๋กœ ```js products: ["์—ญ์‚ผ๋™์›๋ฃธ", "์ฒœํ˜ธ๋™์›๋ฃธ", "๋งˆํฌ๊ตฌ์›๋ฃธ"]; ``` ์ด๋ ‡๊ฒŒ 3๊ฐœ์˜ ์ƒํ’ˆ๋ช…์„ ์ €์žฅํ•˜๋ผ๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๋‹ค์Œ 3๊ฐœ์˜ ์ƒํ’ˆ๋ช…์„ ์ €๊ธฐ HTML์—๋‹ค๊ฐ€ ๋ฐ์ดํ„ฐ๋ฐ”์ธ๋”ฉํ•˜๋ผ๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ณ ๋ฏผํ•  ๊ฒƒ ์—†์ด ์ค‘๊ด„ํ˜ธ ๋ฌธ๋ฒ•์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฝ‚์•„๋„ฃ์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ```html

{{products[0]}}

50๋งŒ์›

{{products[1]}}

50๋งŒ์›

{{products[2]}}

50๋งŒ์›

```

HTML์„ ์งœ๋‹ค๋ณด๋ฉด ๋น„์Šทํ•œ <div> ์ด๋Ÿฐ๊ฒŒ ์ˆ˜๋ฐฑ๋ฒˆ ์ถœ๋ชฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ.

๊ทธ๊ฑธ ๋ณด๊ณ  ์žˆ์œผ๋ฉด ๋น„์Šทํ•œ <div>๋“ค์„ ๊ฐ„๋‹จํ•˜๊ฒŒ for ๋ฐ˜๋ณต๋ฌธ ๊ฐ™์€ ๊ฑธ๋กœ ์ถ•์•ฝํ•˜๊ณ  ์‹ถ์€ ์ถฉ๋™์ด ๋“ค์ง€ ์•Š์Šต๋‹ˆ๊นŒ.

๋ฆฌ์•กํŠธ๋‚˜ Vue๋ฅผ ์“ฐ๋ฉด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๋Ÿฐ ์žฅ์  ๋•Œ๋ฌธ์— ๋ฆฌ์•กํŠธ์™€ Vue๋ฅผ ์“ฐ๋Š”๊ฒ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ for, map, forEach ์ด๋Ÿฐ ๋ฌธ๋ฒ• ๋ฐฐ์šฐ๋‹ค ํฌ๊ธฐํ•˜์…จ๋‹ค๋ฉด

Vue ๋ฐ˜๋ณต๋ฌธ์€ 100๋ฐฐ ์‰ฌ์šฐ๋‹ˆ ๊ฑฑ์ •ํ•˜์ง€ ๋ง™์‹œ๋‹ค.

01. ์ƒ๋‹จ ๋ฉ”๋‰ด ๋งŒ๋“ค๊ธฐ

ํŽ˜์ด์ง€๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ ์‹ฌ์‹ฌํ•˜๋‹ˆ ์ƒ๋‹จ๋ฉ”๋‰ด๋ฅผ ๋งŒ๋“ค์–ด๋ด…์‹œ๋‹ค.

HTML๊ณผ CSS๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

CSS๋Š” vueํŒŒ์ผ ํ•˜๋‹จ <style> ํƒœ๊ทธ ์•ˆ์— ๋„ฃ์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

<div class="menu">
  <a>Home</a>
  <a>Products</a>
  <a>About</a>
</div>
.menu {
  background: darkslateblue;
  padding: 15px;
  border-radius: 5px;
}
.menu a {
  color: white;
  padding: 10px;
}

02. v-for HTML ๋ฐ˜๋ณต๋ฌธ

๊ฐ€๋” ์ฝ”๋“œ๋ฅผ ์งœ๋‹ค๊ฐ€

HTML์— ๋ฐ˜๋ณต๋˜๋Š” ๋ถ€๋ถ„์ด ๋ณด์ด๋ฉด ์ถ•์•ฝํ•˜๊ณ  ์‹ถ์€ ์ถฉ๋™์ด ๋“ญ๋‹ˆ๋‹ค.

์ด๊ฑธ ์ถ•์•ฝํ•˜๊ณ  ์‹ถ์œผ๋ฉด v-for์„ ์“ฐ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

v-for์“ฐ์‹œ๋ฉด ์›ํ•˜๋Š” ๋งŒํผ HTML ํƒœ๊ทธ๋ฅผ ๋ณต๋ถ™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด์„œ ์œ„์—์„œ ์ž‘์„ฑํ–ˆ๋˜ <a>ํƒœ๊ทธ 3๊ฐœ๋ฅผ

ํ•œ์ค„ ์ปท์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ๋งˆ๋ฒ•์„ ๋ณด์—ฌ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

<div class="menu">
  <a v-for="์ž‘๋ช… in 3" :key="์ž‘๋ช…">Home</a>
</div>
  1. ์›ํ•˜๋Š” ํƒœ๊ทธ์— v-for="์ž‘๋ช… in ๋ฐ˜๋ณตํ• ํšŸ์ˆ˜" ๋ฅผ ์ ์Šต๋‹ˆ๋‹ค.

  2. ๊ทธ๋ฆฌ๊ณ  ์„ผ์Šค์žˆ๊ฒŒ :key="์ž‘๋ช…" ์ด๊ฒƒ๋„ ์ถ”๊ฐ€ํ•ด์ค๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ ์ด HTML ํƒœ๊ทธ๋Š” ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๋งŒํผ ๋ฐ˜๋ณต์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

์œ„์˜ ์˜ˆ์ œ๋Š” Home์ด๋ผ๋Š” aํƒœ๊ทธ๊ฐ€ 3๊ฐœ๋‚˜ ์ƒ์„ฑ๋˜๊ฒ ๋„ค์š”.

์ž‘๋ช…์€ ์•„๋ฌด๋ ‡๊ฒŒ๋‚˜ ํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋ณ€์ˆ˜ํ•˜๋‚˜ ์ž‘๋ช…ํ•˜๋Š” ๊ฒ๋‹ˆ๋‹ค.

:key ์†์„ฑ์€ ๋ฐ˜๋ณต๋ฌธ๋Œ๋ฆด ๋•Œ ๊ผญ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ณตํ•œ ์š”์†Œ๋“ค์„ ๊ฐ๊ฐ ๊ตฌ๋ถ„์ง“๊ธฐ ์œ„ํ•œ ์†์„ฑ์ž…๋‹ˆ๋‹ค.

03. v-for HTML ๋ฐ˜๋ณต๋ฌธ 2

v-for ๋ฐ˜๋ณต๋ฌธ์„ ์‚ฌ์šฉํ•  ๋•Œ array, object ๋ฐ์ดํ„ฐ๋ฅผ ์ง‘์–ด๋„ฃ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด์„œ array ์ž๋ฃŒ๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด๋ด…์‹œ๋‹ค. ๋ฐ์ดํ„ฐ๋กœ ์ €์žฅํ•ด๋‘์‹ญ์‹œ์˜ค.

data(){
  return {
    ๋ฉ”๋‰ด๋“ค : ['Home', 'Shop', 'About']
  }
}

๊ทธ๋Ÿผ ์ด์ œ ๋ฉ”๋‰ด๋“ค ์ด๋ผ๋Š” ๋ฐ์ดํ„ฐ๋กœ ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ฆด ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ๊ฒ๋‹ˆ๋‹ค.

<div class="menu">
  <a v-for="์ž‘๋ช… in ๋ฉ”๋‰ด๋“ค" :key="์ž‘๋ช…">Home</a>
</div>

์•„๊นŒ๋ž‘ ์‚ฌ์šฉํ•˜๋Š” ๋ฒ•์€ ๋˜‘๊ฐ™์€๋ฐ ๋ฐ˜๋ณต์‹œํ‚ฌ ํšŸ์ˆ˜ ์ ๋Š” ๋ž€์—๋‹ค๊ฐ€ array ์ž๋ฃŒ๋ฅผ ์ง‘์–ด๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ฒฝ์šฐ

1. ๋ฉ”๋‰ด๋“ค์•ˆ์˜ ์ž๋ฃŒ ๊ฐฏ์ˆ˜๋งŒํผ ๋ฐ˜๋ณต๋ฉ๋‹ˆ๋‹ค.

2. ์ž‘๋ช…ํ•œ ๋ณ€์ˆ˜๋Š” ๋ฐ˜๋ณต๋  ๋•Œ๋งˆ๋‹ค ๋ฉ”๋‰ด๋“ค ์•ˆ์— ์žˆ๋˜ ์ž๋ฃŒ๋“ค์ด ๋ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด์„œ ์ž‘๋ช…ํ•œ ๋ณ€์ˆ˜๋Š” ์ถœ๋ ฅํ•ด๋ณด๋ฉด 1ํšŒ ๋ฐ˜๋ณต์‹œ์—” โ€˜Homeโ€™ 2ํšŒ ๋ฐ˜๋ณต์‹œ์—” โ€˜Shopโ€™ ์ด๋ ‡๊ฒŒ ๋ณ€ํ•œ๋‹ค๋Š” ๊ฒ๋‹ˆ๋‹ค.

<div class="menu">
  <a v-for="์ž‘๋ช… in ๋ฉ”๋‰ด๋“ค" :key="์ž‘๋ช…"> {{ ์ž‘๋ช… }}</a>
</div>

๊ทธ๋ž˜์„œ ์ž‘๋ช…ํ•œ ๋ณ€์ˆ˜๋ฅผ ์ €๊ธฐ ์‹ค์ œ๋กœ ์ถœ๋ ฅํ•ด๋ณด๋ฉด (๋ฐ์ดํ„ฐ๋ฐ”์ธ๋”ฉํ•ด๋ณด๋ฉด) ์ง„์งœ ๊ทธ๋ ‡์ฃ ?

<a>ํƒœ๊ทธ๊ฐ€ 3๋ฒˆ ์ƒ์„ฑ๋˜๋Š”๋ฐ ์ƒ์„ฑ๋  ๋•Œ๋งˆ๋‹ค {{์ž‘๋ช…}} ๋ถ€๋ถ„์€ ์ฐจ๋ก€๋กœ

Home์ด ๋˜๊ณ  Shop์ด ๋˜๊ณ  About์ด ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋ฐ‘์— ์žˆ๋Š” array, object ๋ฐ์ดํ„ฐ ์•ˆ์— ์žˆ๋˜ ์ž๋ฃŒ๋“ค์„

ํ•˜๋‚˜์”ฉ HTML๋กœ ๋งŒ๋“ค์–ด์„œ ๋ณด์—ฌ์ฃผ๊ณ  ์‹ถ์„ ๋•Œ๋„ v-for์„ ์“ฐ์‹œ๋ฉด ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

04. v-for ์•ˆ์— ๋ณ€์ˆ˜๋Š” 2๊ฐœ๊นŒ์ง€ ์ž‘๋ช… ๊ฐ€๋Šฅ

<div class="menu">
  <a v-for="(์ž‘๋ช…,i) in ๋ฉ”๋‰ด๋“ค" :key="i"> {{ ์ž‘๋ช… }}</a>
</div>

() ์†Œ๊ด„ํ˜ธ๋ฅผ ์—ฌ์‹œ๋ฉด ์ž‘๋ช…์„ ๋‘๊ฐœ๊นŒ์ง€ ํ—ˆ์šฉํ•ด์ค๋‹ˆ๋‹ค.

์ฒซ์งธ ์ž‘๋ช…ํ•œ๊ฑด ์•„๊นŒ ์„ค๋ช…ํ–ˆ๋˜ array์•ˆ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋˜๋Š” ๊ฒƒ์ด๊ณ 

๋‘˜์งธ ์ž‘๋ช…ํ•œ๊ฑด 0, 1, 2 .. ์ด๋Ÿฐ ์‹์œผ๋กœ 1์”ฉ ์ฆ๊ฐ€ํ•˜๋Š” ์ •์ˆ˜๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

๋ฐ˜๋ณต ํšŸ์ˆ˜๋ฅผ ์•Œ๋ ค์ฃผ๋Š” ์ˆซ์ž๋ผ๊ณ  ๋ณด์‹œ๋ฉด ๋˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ i๋Š” ์ถœ๋ ฅํ•ด๋ณด์‹œ๋ฉด ๋ฐ˜๋ณต๋  ๋•Œ๋งˆ๋‹ค 0, 1, 2.. ์ด๋ ‡๊ฒŒ ๋ณ€ํ• ๊ฑธ์š”

๊ทธ๋ฆฌ๊ณ  ์ด๊ฑธ ๋ณดํ†ต ๊ด€์Šต์ ์œผ๋กœ :key ์•ˆ์— ์ง‘์–ด๋„ฃ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๊ฒฐ๋ก ์€ HTML ๋ณต๋ถ™ํ•˜๊ธฐ ํž˜๋“ค๋ฉด ์“ฐ์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์•„๋‹ˆ๋ฉด ํ˜น์€ HTML์„ ๋ฐ์ดํ„ฐ ๊ฐฏ์ˆ˜๋งŒํผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜๊ณ  ์‹ถ์œผ๋ฉด ์“ฐ์‹ญ์‹œ์˜ค.

04. Vue ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋กœ click ๊ฐ์ง€ํ•˜๊ธฐ (ํ—ˆ์œ„๋งค๋ฌผ ์‹ ๊ณ ๋ฒ„ํŠผ ๋งŒ๋“ค๊ธฐ)

00. ์˜ค๋Š˜์˜ 5๋ถ„ ์ˆ™์ œ

๋ชจ๋“  ์ƒํ’ˆ์— ์‹ ๊ณ ๋ฒ„ํŠผ๊ณผ ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค์–ด์˜ค์‹ญ์‹œ์˜ค.

์ƒํ’ˆ๋งˆ๋‹ค ๊ฐ๊ฐ ์‹ ๊ณ ์ˆ˜๋ฅผ ๋”ฐ๋กœ ์ง‘๊ณ„ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์‹ ๊ณ ์ˆ˜ 3๊ฐœ๋ฅผ ๊ฐ๊ฐ ์ €์žฅํ•  ๊ณต๊ฐ„์ด ๋ฏธ๋ฆฌ ํ•„์š”ํ•˜๊ฒ ๊ตฐ์š”.

์ €๋ฒˆ์‹œ๊ฐ„ ์ˆ™์ œ `
` 3๊ฐœ๋ฅผ ํ•˜๋“œ์ฝ”๋”ฉํ•ด์„œ ๋งŒ๋“ค์—ˆ๋˜ ์ƒํ’ˆ๋ชฉ๋ก์„ v-for ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ๋ฉ‹์žˆ๊ฒŒ ์ถ•์•ฝํ•ด์„œ ์ƒํ’ˆ๋ชฉ๋ก์„ ๋งŒ๋“ค์–ด์˜ค๋ผ๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ „ ์ด๋ ‡๊ฒŒ ํ–ˆ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋‹จ ํ•˜๋‹จ์— `products`๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•ด๋†จ๋Š”๋ฐ ๊ทธ๊ฑฐ ๊ฐฏ์ˆ˜๋งŒํผ `v-for` ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ฆฌ๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค. ```html <div v-for="(a,i) in products" :key="i">

{{products[i]}}

50๋งŒ์›

``` ๊ทธ๋ž˜์„œ ์ด๋ ‡๊ฒŒ ์ ์—ˆ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋ ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ฆฌ๋ฉด์„œ `products[i]`๋ฅผ ์ƒํ’ˆ๋ช…์œผ๋กœ ์ถœ๋ ฅํ•˜๋ผ๊ณ  ํ•ด๋†จ์Šต๋‹ˆ๋‹ค. ์ด๊ฑฐ ๋Œ€์‹  `a`๋ผ๊ณ  ์“ฐ์…”๋„ ๋˜‘๊ฐ™๊ฒ ๊ตฐ์š”

์–ด๋–ค HTML ์š”์†Œ๋ฅผ ํด๋ฆญํ–ˆ์„ ๋•Œ ๋ญ”๊ฐ€ ์ผ์ด ์ผ์–ด๋‚˜๊ฒŒ ๋งŒ๋“ค๊ณ  ์‹ถ์œผ๋ฉด

<div onclick=""> ์ด ์•ˆ์— ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ง‘์–ด๋„ฃ์Šต๋‹ˆ๋‹ค.

Vue์—์„œ๋Š” ์‚ด์ง ๋‹ค๋ฅด๊ฒŒ ์ง‘์–ด๋„ฃ์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. @click="" ์ด๊ฑธ ์ง‘์–ด๋„ฃ์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋ฌธ๋ฒ•๋งŒ ์„ค๋ช…ํ•˜๋ฉด ๋‹ค์Œ๋‚  ๋‹ค ๊นŒ๋จน์„๊ฒŒ ๋ถ„๋ช…ํ•˜๋‹ˆ

์ €๋ฒˆ์‹œ๊ฐ„๊นŒ์ง€ ๋งŒ๋“ค๋˜ ๋ถ€๋™์‚ฐ ์‚ฌ์ดํŠธ์— ํ—ˆ์œ„๋งค๋ฌผ ์‹ ๊ณ ๋ฒ„ํŠผ๊ณผ ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค์–ด๋ณด๋ฉฐ ๋ฐฐ์›Œ๋ด…์‹œ๋‹ค.

01. ํ—ˆ์œ„๋งค๋ฌผ ์‹ ๊ณ ๋ฒ„ํŠผ๊ณผ ์‹ ๊ณ ์ˆ˜ ๋งŒ๋“ค๊ธฐ

์ผ๋‹จ ์ €๋ฒˆ์‹œ๊ฐ„ ๋ฐ˜๋ณต๋ฌธ ๋Œ๋ฆฐ๊ฑด ๋ณต์žกํ•ด๋ณด์ด๋‹ˆ๊นŒ ๋‹ค์‹œ ์›๋ž˜๋Œ€๋กœ ๋ณต๊ตฌ์‹œํ‚ต๋‹ˆ๋‹ค.

<div>
  <h4>{{products[0]}}</h4>
  <p>50๋งŒ์›</p>
</div>
<div>
  <h4>{{products[1]}}</h4>
  <p>50๋งŒ์›</p>
</div>
<div>
  <h4>{{products[2]}}</h4>
  <p>50๋งŒ์›</p>
</div>

์šฐ๋ฆฌ๊ฐ™์€ ๋นก๋Œ€๊ฐ€๋ฆฌ๋“ค์€ ๊ฐ„๋‹จํ•œ๊ฑธ ์ข‹์•„ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์—ฌ๊ธฐ๋‹ค๊ฐ€ ๋ฒ„ํŠผ์„ ํ•˜๋‚˜ ์ถ”๊ฐ€ํ•ด๋ณด์ž๋Š”๊ฒ๋‹ˆ๋‹ค.

<div>
  <h4>{{products[0]}}</h4>
  <p>50๋งŒ์›</p>
  <button>ํ—ˆ์œ„๋งค๋ฌผ์‹ ๊ณ </button>
  <span>์‹ ๊ณ ์ˆ˜ : 0</span>
</div>

์ด๊ฑฐ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์˜†์— ์žˆ๋Š” ์‹ ๊ณ ์ˆ˜๊ฐ€ 1 ์ฆ๊ฐ€ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค์–ด๋ณผ๊ฒ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ์ง€ ์ƒ๊ฐํ•ด๋ด…์‹œ๋‹ค.

์ผ๋‹จ ์‹ ๊ณ ์ˆ˜๋ฅผ ๊ธฐ๋กํ•  ์ˆ˜ ์žˆ๋Š” ๋ณ€์ˆ˜๋‚˜ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•˜๋‚˜ ํ•„์š”ํ•˜์ง€ ์•Š์„๊นŒ์š”?

data(){
  return {
    ์‹ ๊ณ ์ˆ˜ : 0,
  }
}
<div>
  <h4>{{products[0]}}</h4>
  <p>50๋งŒ์›</p>
  <button>ํ—ˆ์œ„๋งค๋ฌผ์‹ ๊ณ </button>
  <span>์‹ ๊ณ ์ˆ˜ : {์‹ ๊ณ ์ˆ˜}</span>
</div>

1. ๊ทธ๋ž˜์„œ ํ•˜๋‹จ์— ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค๊ณ  2. ๋ฐ์ดํ„ฐ๋ฅผ HTML๋ž€์— ๊ฝ‚์•„๋„ฃ์—ˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์‹ ๊ณ ์ˆ˜๋ผ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ 1์ฆ๊ฐ€์‹œํ‚ค๋ฉด ์‹ ๊ณ ์ˆ˜๊ฐ€ 1์ด ๋˜๊ณ  HTML๋„ ์žฌ๋ Œ๋”๋ง์ด ๋˜๊ณ 

์›ํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์™„์„ฑ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

02 . ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๊ธฐ๋Šฅ์„ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” onclick=โ€โ€ ์ด๋ผ๋Š” ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ HTMLํƒœ๊ทธ์— ๋‹ฌ์•˜์ง€๋งŒ

Vue์—์„œ๋Š” @click="" ์ด๋ผ๊ณ  ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ ์•ˆ์—๋‹ค๊ฐ€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž์œ ๋กญ๊ฒŒ ์ž…๋ ฅ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

<div>
  <h4>{{products[0]}}</h4>
  <p>50๋งŒ์›</p>
  <button @click="์‹ ๊ณ ์ˆ˜++">ํ—ˆ์œ„๋งค๋ฌผ์‹ ๊ณ </button>
  <span>์‹ ๊ณ ์ˆ˜ : {{์‹ ๊ณ ์ˆ˜}}</span>
</div>

์ด๊ฑฐ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์‹ ๊ณ ์ˆ˜๋ผ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ +1 ํ•ด์ฃผ๊ณ  ์‹ถ์–ด์„œ ์ €๋ ‡๊ฒŒ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ ๋ฒ„ํŠผ ๋ˆ„๋ฅผ ๋•Œ๋งˆ๋‹ค ์‹ ๊ณ ์ˆ˜๊ฐ€ +1 ๋ฉ๋‹ˆ๋‹ค. ๋!

์‹ ๊ณ ์ˆ˜++

์‹ ๊ณ ์ˆ˜+=1

์•„๋ฌด๋ ‡๊ฒŒ๋‚˜ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@click ๋ง๊ณ  ๋‹ค๋ฅธ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@mouseover ํ•˜๋ฉด ํด๋ฆญ์ด ์•„๋‹ˆ๋ผ ๋งˆ์šฐ์Šค๋งŒ ๋Œ”์„ ๋•Œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰๊ฐ€๋Šฅํ•˜๊ณ 

@input ํ•˜๋ฉด ์ธํ’‹์— ๊ฐ’์„ ์ž…๋ ฅํ–ˆ์„ ๋•Œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰๊ฐ€๋Šฅํ•˜๊ณ 

๋‹˜๋“ค์ด ์•Œ๋˜ ์ด๋ฒคํŠธ๋ช…์„ ์ž์œ ๋กญ๊ฒŒ ๊ธฐ์ž…ํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋ชจ๋ฅด๋ฉด ์–ด์ฉ” ์ˆ˜ ์—†์ด @click์ด๋‚˜ ์”์‹œ๋‹ค.

03. ์ฝ”๋“œ๊ฐ€ ๊ธธ ๊ฒฝ์šฐ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์”๋‹ˆ๋‹ค

๊ธด ์ฝ”๋“œ๋ฅผ ์งง๊ฒŒ ์ถ•์•ฝํ•ด์ฃผ๋Š”๊ฒŒ ๋ฐ”๋กœ ํ•จ์ˆ˜๋ฌธ๋ฒ•์ž…๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ @click ์•ˆ์— ๋“ค์–ด๊ฐˆ ๋ง์ด ๋„ˆ๋ฌด ๊ธธ๋‹ค๋ฉด ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์„œ ์ง‘์–ด๋„ฃ์œผ์‹ญ์‹œ์˜ค.

ํ•จ์ˆ˜ ๋งŒ๋“œ๋Š” ์ž๋ฆฌ๋Š” ์ด๋ฏธ ์ •ํ•ด์ ธ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ‘์—์„œ methods : {} ๋ผ๋Š” ํ•ญ๋ชฉ์„ ์‹ ์„คํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

data(){
  return {
    ์‹ ๊ณ ์ˆ˜ : 0,
  },
}

methods : { 
  increase(){ 
    this.์‹ ๊ณ ์ˆ˜ += 1 
  } 
}

methods๋ผ๋Š” ํ•ญ๋ชฉ์„ ๋งŒ๋“œ์‹  ํ›„

ํ•จ์ˆ˜๋ฅผ ์•ˆ์—๋‹ค๊ฐ€ ๊ณ„์† ๋งŒ๋“ค์–ด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•จ์ˆ˜๋งŒ๋“ค ๋• ํ•จ์ˆ˜์ด๋ฆ„(){} ์ด๊ฒŒ ๋์ž…๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ด๊ฑด ๊ผญ ๊ธฐ์–ตํ•ด์•ผํ•˜๋Š” ๋ถ€๋ถ„์ธ๋ฐ

์—ฌ๊ธฐ์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ๋‹ค์“ฐ๊ณ  ์‹ถ์œผ๋ฉด ๊ผญ this.๋ฐ์ดํ„ฐ์ด๋ฆ„ ์ด๋ผ๊ณ  ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

this๋Š” ๊ทธ๋ƒฅ ์œ„์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ์™€ ํ•จ์ˆ˜๋ฅผ ๋‹ด์€ ํฐ object๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹œ๋ฉด ๋˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์•„๊นŒ HTML ๋ถ€๋ถ„์—์„œ ํ•จ์ˆ˜๋ฅผ ์ž์œ ๋กญ๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด

์•„๊นŒ ์ถ•์•ฝํ–ˆ๋˜ this.์‹ ๊ณ ์ˆ˜+=1 ์ด๊ฒŒ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๋

<div>
  <h4>{{products[0]}}</h4>
  <p>50๋งŒ์›</p>
  <button @click="increase()">ํ—ˆ์œ„๋งค๋ฌผ์‹ ๊ณ </button>
  <span>์‹ ๊ณ ์ˆ˜ : {{์‹ ๊ณ ์ˆ˜}}</span>
</div>

ํ•จ์ˆ˜() ์ด๋ ‡๊ฒŒ ํ•˜์…”๋„ ๋˜๊ณ 

ํ•จ์ˆ˜์ด๋ฆ„๋งŒ ์“ฐ์…”๋„ ๋ฉ๋‹ˆ๋‹ค. @click="increase" ์ด๋ ‡๊ฒŒ์š”.

ํ•จ์ˆ˜๋Š” ํ•œ๊ธ€๋กœ ์ž‘๋ช…ํ•˜๋ฉด ์ž˜ ์•ˆ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

05. v-if ์™€ ๋ชจ๋‹ฌ์ฐฝ ๋งŒ๋“ค๊ธฐ (Vue์—์„œ ๋™์ ์ธ UI ๋งŒ๋“œ๋Š” ๋ฒ•)

00. ์˜ค๋Š˜์˜ 5๋ถ„ ์ˆ™์ œ

๋ชจ๋‹ฌ์ฐฝ ๋‹ซ๊ธฐ๋ฒ„ํŠผ๊ณผ ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค์–ด์˜ค์‹ญ์‹œ์˜ค.

์ €๋ฒˆ์‹œ๊ฐ„ ์ˆ™์ œ ```html ์‹ ๊ณ ์ˆ˜ : 0 ์‹ ๊ณ ์ˆ˜ : 0 ์‹ ๊ณ ์ˆ˜ : 0 ``` ๋ฒ„ํŠผ๊ณผ ์‹ ๊ณ ์ˆ˜ํ‘œ์‹œ๋ฅผ 3๊ฐœ ๋งŒ๋“ค์–ด๋‘๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ ๊ธฐ๋Šฅ์„ ๊ฐœ๋ฐœํ•˜๋ฉด ๋˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฐ๊ฐ ์‹ ๊ณ ์ˆ˜๋Š” ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ €๋Š” ์ผ๋‹จ ๋ฐ์ดํ„ฐ๋ฅผ ์ด๋ ‡๊ฒŒ ๋งŒ๋“ค์–ด๋†จ์Šต๋‹ˆ๋‹ค. ```js data(){ return { ์‹ ๊ณ ์ˆ˜ : [0,0,0] } } ``` ์™œ๋ƒ๋ฉด ์ƒํ’ˆ์ด 3๊ฐœ์ธ๋ฐ ๊ทธ๋Ÿผ ๊ฐ๊ฐ ์‹ ๊ณ ์ˆ˜๋ฅผ ๊ธฐ๋กํ•  ๊ณต๊ฐ„๋„ 3๊ฐœ ์žˆ์–ด์•ผํ•˜์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๊นŒ. array ์ž๋ฃŒ๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  0๋ฒˆ์งธ ์ƒํ’ˆ์—๋Š” `์‹ ๊ณ ์ˆ˜[0]`์„ ํ‘œ๊ธฐํ•ด์ฃผ๊ณ  0๋ฒˆ์งธ ์‹ ๊ณ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด `์‹ ๊ณ ์ˆ˜[0]++` 1๋ฒˆ์งธ ์ƒํ’ˆ์—๋Š” `์‹ ๊ณ ์ˆ˜[1]`์„ ํ‘œ๊ธฐํ•ด์ฃผ๊ณ  1๋ฒˆ์งธ ์‹ ๊ณ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด `์‹ ๊ณ ์ˆ˜[1]++` ... ๋ฅผ ํ•ด์ฃผ๋ฉด ๊ธฐ๋Šฅ๊ฐœ๋ฐœ ๋์ผ ๋“ฏ์š”

์˜ค๋Š˜์€ ์ƒํ’ˆ์„ ๋ˆ„๋ฅด๋ฉด ๋œจ๋Š” ์ƒ์„ธํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค์–ด๋ณผ ๊ฑด๋ฐ

์‹ค์ œ ํŽ˜์ด์ง€๋ฅผ ๋‹ค๋ฅด๊ฒŒ ์ด๋™์‹œํ‚ค๋Š”๊ฑด ์•„๋‹ˆ๊ณ  ๋ชจ๋‹ฌ์ฐฝ ์Šคํƒ€์ผ๋กœ ๋งŒ๋“ค์–ด๋ด…์‹œ๋‹ค.

image

โ–ฒ ๋ชจ๋‹ฌ์ฐฝ์ด ๋ญ๋ƒ๋ฉด ๊ทธ๋ƒฅ ๋ฐฐ๊ฒฝ๊นŒ๋งฃ๊ณ  ์•ˆ์— ํ•˜์–€ ์ฐฝ์žˆ๋Š” UI๋ฅผ ๋œปํ•ฉ๋‹ˆ๋‹ค.

์ƒํ’ˆ๋ช…์„ ํด๋ฆญํ•˜๋ฉด ์ด๊ฑธ ๋„์›Œ๋ณผ๊ฒ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋ชจ๋‹ฌ์ฐฝ๋งŒ ๋ฐฐ์› ๋‹ค๊ณ  ๋ชจ๋‹ฌ์ฐฝ๋งŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋žŒ์ด ๋˜๋ฉด ์•ˆ๋˜๊ธฐ ๋•Œ๋ฌธ์—

Vue๋กœ ๋™์ ์ธ UI ๋งŒ๋“œ๋Š” Step์„ ์„ค๋ช…ํ•ด๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

1. ํ˜„์žฌ HTML UI์˜ ์ƒํƒœ๋ฅผ ๋ฐ์ดํ„ฐ๋กœ ์ €์žฅํ•ด๋‘  (์ง€๊ธˆ ๋ณด์ด๋Š”์ง€ ์•ˆ๋ณด์ด๋Š”์ง€ ์ด๋Ÿฐ๊ฑฐ)

2. ๊ทธ ์ƒํƒœ์— ๋”ฐ๋ผ HTML UI์„ ๋ณด์—ฌ์ค„์ง€ ๋ง์ง€๋ฅผ Vue๋ฌธ๋ฒ•์œผ๋กœ ์ž‘์„ฑํ•จ

์ด๊ฒƒ๋งŒ ๊ธฐ์–ตํ•ด๋‘์‹œ๋ฉด ๋ชจ๋‹ฌ์ฐฝ ๋ง๊ณ ๋„ ํƒญ, ์„œ๋ธŒ๋ฉ”๋‰ด ๋“ฑ ๋ˆ„๋ฅด๋ฉด ๋™์ž‘ํ•˜๋Š” UI๋“ค์€ ๊ตฌ๊ธ€ ๋„์›€ ์—†์ด๋„ ์•Œ์•„์„œ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ฒŒ๋ฉ๋‹ˆ๋‹ค.

๋ง์ด ์ถ”์ƒ์ ์ด๋ผ ๋ญ”์ง€ ์•„์ง ๋ชจ๋ฅด๊ฒ ์œผ๋ฉด ๋ชจ๋‹ฌ์ฐฝ์ด๋‚˜ ๋”ฐ๋ผ ๋งŒ๋“ค์–ด๋ด…์‹œ๋‹ค. ๊ทธ๋Ÿผ ์ดํ•ด๋ฉ๋‹ˆ๋‹ค.

01. ๊ทธ ์ „์— ์ž ๊น ์ด๋ฏธ์ง€ ๋„ฃ๋Š” ๋ฒ•

์ด๋ฏธ์ง€๋ฅผ src ํด๋” ์•ˆ์— ์•„๋ฌด๋ฐ๋‚˜ ๋„ฃ์œผ์‹œ๊ณ 

<img src="./๊ฒฝ๋กœ"> 

๋ฅผ ์ ์œผ์‹œ๋ฉด ์ด๋ฏธ์ง€ ๋‚˜์˜ต๋‹ˆ๋‹ค. ๋

public ํด๋”์— ๋„ฃ์œผ์‹ค ๊ฑฐ๋ฉด ์•ฝ๊ฐ„ ๋‹ค๋ฅธ๋ฐ /๊ฒฝ๋กœ๋ผ๊ณ  ์ ์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

(public ํด๋”์— ๋„ฃ์œผ๋ฉด ๋‚˜์ค‘์— ๋ฐœํ–‰ํ•  ๋•Œ ์ด๋ฏธ์ง€๊ฐ€ ์ด๋ฆ„์ด ๋ณ€ํ•˜์ง€์•Š์Šต๋‹ˆ๋‹ค src๋Š” ์ž„์˜๋กœ ๋ฐ”๊ฟ”์คŒ)

๋ฐฐ์šด ๊ธฐ๋…์œผ๋กœ ํ•˜๋‹จ์— ์ฒจ๋ถ€๋œ ์›๋ฃธ๋“ค ์ด๋ฏธ์ง€๋ฅผ ์ง‘์–ด๋„ฃ์–ด๋ณด์‹ญ์‹œ์˜ค.

์ด๋ฏธ์ง€ ํฌ๋‹ˆ๊นŒ ์ด๋ฏธ์ง€์—๋‹ค๊ฐ€ width์™€ margin-top ์ด๋Ÿฐ ๊ฑธ๋กœ ์Šคํƒ€์ผ๋ง์ข€ ํ•ด๋ณด์‹œ๊ณ ์š”.

02. ๋ชจ๋‹ฌ์ฐฝ ๋งŒ๋“ค๊ธฐ

๋ญ”๊ฐ€ ๋ฒ„ํŠผ๋ˆ„๋ฅด๋ฉด ๋ชจ๋‹ฌ์ฐฝ์„ ๋„์›Œ๋ณด๊ณ  ์‹ถ์œผ๋ฉด

๋ชจ๋‹ฌ์ฐฝ๋ถ€ํ„ฐ HTML CSS๋กœ ๋งŒ๋“œ์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋ญ”๊ฐ€ ๊ฐ‘์ž๊ธฐ ๋“ฑ์žฅํ•˜๋Š” UI๋“ค์€ ๋‹ค ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด๋†“๊ณ  ์›ํ•  ๋•Œ ๋„์›Œ์ฃผ๋Š” ๋ฐฉ์‹์ด๋‹ˆ๊นŒ์š”.

<div class="black-bg">
  <div class="white-bg">
    <h4>์ƒ์„ธํŽ˜์ด์ง€</h4>
    <p>์ƒ์„ธํŽ˜์ด์ง€๋‚ด์šฉ์ž„</p>
  </div>
</div>
body {
  margin : 0;
}
div {
  box-sizing: border-box;
}
.black-bg {
  width: 100%; height:100%;
  background: rgba(0,0,0,0.5);
  position: fixed; padding: 20px;
}
.white-bg {
  width: 100%; background: white;
  border-radius: 8px;
  padding: 20px;
} 

์ด๋ ‡๊ฒŒ HTML๊ณผ CSS๋ฅผ ์–ด๋”˜๊ฐ€์— ์งœ๋†“์œผ์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์ด๋ฒˆ HTML ์ฝ”๋“œ๋Š” ์ข€ ์œ„์— ์ ๋Š”๊ฒŒ ์ข‹์Šต๋‹ˆ๋‹ค.

๊ทผ๋ฐ ๊ธฐ๋Šฅ๊ฐœ๋ฐœ ์–ด๋–ป๊ฒŒ ํ• ๊ฒ๋‹ˆ๊นŒ. ์ƒํ’ˆ์ œ๋ชฉ์„ ๋ˆ„๋ฅด๋ฉด ๋ชจ๋‹ฌ์ฐฝ์ด ๋ฟ…ํ•˜๊ณ  ๋– ์•ผํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ƒฅ Vue๋กœ ๋™์ ์ธ UI ๋งŒ๋“œ๋Š” Step์„ ์„ค๋ช…ํ•ด๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

  1. ํ˜„์žฌ HTML UI์˜ ์ƒํƒœ๋ฅผ ๋ฐ์ดํ„ฐ๋กœ ์ €์žฅํ•ด๋‘  (์ง€๊ธˆ ๋ณด์ด๋Š”์ง€ ์•ˆ๋ณด์ด๋Š”์ง€ ์ด๋Ÿฐ๊ฑฐ)

  2. ๊ทธ ์ƒํƒœ์— ๋”ฐ๋ผ HTML UI๋ฅผ ๋ณด์—ฌ์ค„์ง€ ๋ง์ง€๋ฅผ Vue๋ฌธ๋ฒ•์œผ๋กœ ์ž‘์„ฑํ•จ

์ด๊ฒƒ๋งŒ ๊ธฐ์–ตํ•ด๋‘์‹œ๋ฉด ๋ชจ๋“  UI๊ธฐ๋Šฅ์€ ๊ฑฐ์˜ ๋‹ค ํ˜ผ์ž ๋งŒ๋“ค ์ˆ˜ ์žˆ์„๊ฑธ์š”

๊ทธ๋ž˜์„œ

1. ํ˜„์žฌ ๋ชจ๋‹ฌ์ฐฝ์˜ ์ƒํƒœ๋ฅผ ๋ฐ์ดํ„ฐ๋กœ ์ €์žฅํ•ด๋‘ก๋‹ˆ๋‹ค.

๋ชจ๋‹ฌ์ฐฝ์€ ๋ณด์ด๋Š”/์•ˆ๋ณด์ด๋Š” ์ƒํƒœ๋งŒ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ด๊ฑธ ๋ฐ์ดํ„ฐ๋กœ ํ‘œํ˜„ํ•ด์„œ ์ €์žฅํ•ด๋‘๋ผ๋Š” ์†Œ๋ฆฌ์ž…๋‹ˆ๋‹ค.

data(){
  return {
    ๋ชจ๋‹ฌ์ฐฝ์—ด๋ ธ๋‹ˆ : true,
  }
}

์ €๋Š” ์ด๋ ‡๊ฒŒ true/false๋กœ ๋‚˜ํƒ€๋‚ด๊ณ  ์‹ถ์–ด์„œ ์ €๋ ‡๊ฒŒ ์จ๋†จ์Šต๋‹ˆ๋‹ค.

0๋˜๋Š” 1 ์ด๋ ‡๊ฒŒ ํ‘œํ˜„ํ•ด๋„ ์ „ํ˜€ ์ƒ๊ด€์—†์Šต๋‹ˆ๋‹ค ๋‹˜๋“ค ๋ง˜์ž„

๋ฏธ๋ฆฌ ์ฑ„์›Œ๋†“๋Š” ๊ฐ’์€ ๊ธฐ๋ณธ๊ฐ’์ด๋ผ๊ณ  ์ƒ๊ฐํ•ด๋„ ๋˜๊ฒ ์Šต๋‹ˆ๋‹ค.

1๋ฒˆ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ ๋

**2. ๋ฐ์ดํ„ฐ ์ƒํƒœ์— ๋”ฐ๋ผ HTML UI์„ ๋ณด์—ฌ์ค„์ง€ ๋ง์ง€๋ฅผ Vue๋ฌธ๋ฒ•์œผ๋กœ ์ž‘์„ฑํ•จ **

false๋ฉด ์ˆจ๊ธฐ๊ณ  true๋ฉด ์•„๊นŒ ๋งŒ๋“  <div>๋ฅผ ๋ณด์—ฌ์ฃผ์ž๋Š” ๊ฒ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ ค๋ฉด ํ•˜๋‚˜์˜ ์ƒˆ๋กœ์šด ๋ฌธ๋ฒ•์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

HTML ํƒœ๊ทธ ์•ˆ์— v-if="์กฐ๊ฑด์‹"์„ ์‚ฌ์šฉํ•˜๋ฉด ์กฐ๊ฑด์‹์ด ์ฐธ์ผ ๋•Œ๋งŒ HTML์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

๊ฐ„๋‹จํ•œ Vue ๋ฌธ๋ฒ•์ธ๋ฐ ์ด๊ฑฐ ์“ฐ๋ฉด 2๋ฒˆ์„ ๊ตฌํ˜„๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

<div class="black-bg" v-if="๋ชจ๋‹ฌ์ฐฝ์—ด๋ ธ๋‹ˆ == true">
  <div class="white-bg">
    <h4>์ƒ์„ธํŽ˜์ด์ง€</h4>
    <p>์ƒ์„ธํŽ˜์ด์ง€๋‚ด์šฉ์ž„</p>
  </div>
</div>

๊ทธ๋ž˜์„œ ์ด๋ ‡๊ฒŒ ์“ฐ๋ฉด ๋ชจ๋‹ฌ์ฐฝ์—ด๋ ธ๋‹ˆ๋ผ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ true์ผ ๋•Œ๋งŒ

<div>๋ฅผ ๋ณด์—ฌ์ฃผ๋Š”๊ฒ๋‹ˆ๋‹ค.

2๋ฒˆ ๊ฐœ๋ฐœ ๋์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ ๋ชจ๋‹ฌ์ฐฝ ์…‹ํŒ…์ด ์™„๋ฃŒ๋œ๊ฒ๋‹ˆ๋‹ค.

์ด์ œ ์—ฌ๋Ÿฌ๋ถ„์€ ๋ชจ๋‹ฌ์ฐฝ์—ด๋ ธ๋‹ˆ ๋ผ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ์ž‘ํ•˜๋ฉด ๋ชจ๋‹ฌ์ฐฝ์„ ์ผœ๊ณ  ๋Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

UI๋งŒ๋“ค ๋• ์ผ์ข…์˜ ์Šค์œ„์น˜๊ฐ™์€๊ฑธ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด๋‘”๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์Šค์œ„์น˜๋งŒ๋“œ๋Š” ๋ฒ•์€ ์ €๋ ‡๊ฒŒ 1๋ฒˆ 2๋ฒˆ ๋”ฐ๋ผ์ฃผ๋ฉด ๋˜๊ณ 

์Šค์œ„์น˜๋ฅผ ์ผœ๊ณ  ๋„๋Š”๊ฑด ๋ชจ๋‹ฌ์ฐฝ์—ด๋ ธ๋‹ˆ๋ผ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ์ž‘ํ•˜๋ฉด ๋ ์•„๋‹ˆ๊ฒ ์Šต๋‹ˆ๊นŒ.

Q. ๊ทธ๋Ÿผ ์ƒํ’ˆ์ œ๋ชฉ์„ ๋ˆŒ๋ €์„ ๋•Œ ๋ชจ๋‹ฌ์ฐฝ์„ ์—ด๋ ค๋ฉด ์ฝ”๋“œ ์–ด๋–ป๊ฒŒ์งœ์ฃ ?

๊ทธ๋‹ˆ๊นŒ ๋ชจ๋‹ฌ์ฐฝ์—ด๋ ธ๋‹ˆ ์Šค์œ„์น˜๋ฅผ ์ผœ๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ์ฝ”๋“œ์งญ๋‹ˆ๊นŒ.

์ „ ๊ฐ•์˜์—์„œ ๋ฐฐ์šด๊ฑด ์•Œ์•„์„œ ํ•ด๋ณด์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์˜ค๋Š˜์˜ ์ƒ์‹ :

data(){} ์ด ๋ถ€๋ถ„์„ ๋ฆฌ์•กํŠธ ์ด๋Ÿฐ ๊ณณ์—์„  state๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.

๋ญ”๊ฐ€ ์ •๋ณด ์ €์žฅํ•˜๋Š” ๊ณณ์ด๊ธฐ๋„ ํ•˜๊ณ 

UI์˜ ํ˜„์žฌ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ณณ์ด๊ธฐ๋„ ํ•˜๋‹ˆ๊นŒ์š”.

์ƒํƒœ๋Š” ์˜์–ด๋กœ state์ž…๋‹ˆ๋‹ค.

ํƒœ๊ทธ:

์นดํ…Œ๊ณ ๋ฆฌ:

์—…๋ฐ์ดํŠธ:

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ