๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๊ฐœ๋ฐœ/Vue.js

Vue ์‚ฌ์šฉ๋ฒ• / ๋ฌธ๋ฒ• / ์˜ต์…˜ / ๋””๋ ‰ํ‹ฐ๋ธŒ

by 1mj 2022. 3. 28.

Vue.js ์ ์šฉ ๋ฐฉ๋ฒ•

๐Ÿ‘†CDN ๋ฐฉ์‹์œผ๋กœ Vue ์‹œ์ž‘ํ•˜๊ธฐ

- ๊ฐœ๋ฐœ์šฉ

// ์ตœ์‹ ๋ฒ„์ „ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

// ํŠน์ •๋ฒ„์ „ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
<script src="https://cdn.jsdelivr.net/npm/vue@2.3.0"></script>

- ์ƒ์šฉ

<script src="https://cdn.jsdelivr.net/npm/vue"></script>

 

โœŒ๏ธWebpack ๋ฐฉ์‹์œผ๋กœ Vue ์‹œ์ž‘ํ•˜๊ธฐ

npm์œผ๋กœ cli๋ฅผ ์„ค์น˜ํ•ด vue ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋ฐฉ์‹์ด๋‹ค.

npm install -g @vue/cli
# OR
yarn global add @vue/cli
๐Ÿ”Ž npm(Node Package Manager)
node.js์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“ˆ๋“ค์„ ํŒจํ‚ค์ง€๋กœ ๋งŒ๋“ค์–ด npm์„ ํ†ตํ•ด์„œ ๊ด€๋ฆฌํ•˜๊ณ  ๋ฐฐํฌํ•œ๋‹ค. ์ง์ ‘ ๊ฐœ๋ฐœํ•œ ๋ชจ๋“ˆ์ด๋‚˜ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๋“ค์ด ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด๋†“์€ ๋ชจ๋“ˆ์„ ๊ฐ„ํŽธํ•˜๊ฒŒ ๋‹ค์šด๋ฐ›์•„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ”Ž Node.js

๋„คํŠธ์›Œํฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์— ์‚ฌ์šฉ๋˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด ํ”Œ๋žซํผ์œผ๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ™œ์šฉํ•˜๊ณ  ๋‚ด์žฅ http ์„œ๋ฒ„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด ์›น ์„œ๋ฒ„์—์„œ ๋ณ„๋„ ์†Œํ”„ํŠธ์›จ์–ด ์—†์ด ๋™์ž‘ ๊ฐ€๋Šฅํ•˜๋‹ค.
Chrome์˜ V8์—”์ง„์„ ์ด์šฉํ•˜์—ฌ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์„œ๋ฒ„๋ฅผ ๊ตฌ์ถ•ํ•˜๊ณ  ์„œ๋ฒ„์—์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ž‘๋™๋˜๋„๋ก ํ•ด์ฃผ๋Š” ๋Ÿฐํƒ€์ž„ ํ™˜๊ฒฝ์ด๋‹ค.

 


Vue ๊ธฐ๋ณธ ํ˜•์‹

- Vue ์ธ์Šคํ„ด์Šค ์ƒ์„ฑํ•˜๊ธฐ

new Vue({
    el: "#app",
    data: {
        text: 'hello world'
    },
})

 

  • vue๋กœ ํ™”๋ฉด์„ ๊ฐœ๋ฐœํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ธฐ๋ณธ ๋‹จ์œ„์ธ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค.
  • new Vue ๋ผ๋Š” ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•ด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
  • ์ƒ์„ฑ์ž์˜ ์†์„ฑ์—๋Š” ์•„๋ž˜ ์˜ˆ์ œ์˜ el, data ์™ธ์—๋„ template, methods ๋“ฑ์˜ ์˜ต์…˜์ด ์žˆ๋‹ค.
  • ์ธ์Šคํ„ด์Šค์˜ ์œ ํšจ๋ฒ”์œ„๋Š” el ์†์„ฑ์— ์˜ํ•ด ์ •ํ•ด์ง„๋‹ค.
  • ์ธ์Šคํ„ด์Šค ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ํŠน์ • element์— ์ธ์Šคํ„ด์Šค๋ฅผ ์—ฐ๊ฒฐํ•˜๊ณ , ์ธ์Šคํ„ด์Šค์˜ ์†์„ฑ์ด element์— ์ ์šฉ๋˜์–ด ํ™”๋ฉด์— ๋…ธ์ถœ๋œ๋‹ค.

 

- Vue ์ธ์Šคํ„ด์Šค ์˜ต์…˜ ์†์„ฑ

new Vue({
  // instance option properties
  template: "",
  data: "",
  el: "",          # ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์š”์†Œ์— ์ง€์ • ๋ถˆ๊ฐ€, ๋™์  el ์—ฐ๊ฒฐ ๊ฐ€๋Šฅ(๊ถŒ์žฅ X)
  methods: {},
  computed: {},
  watch: {}        # ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์— ๋Œ€ํ•œ ์‘๋‹ต, ๋น„๋™๊ธฐ ๋˜๋Š” ์‹œ๊ฐ„์ด ๋งŽ์ด ์†Œ์š”๋˜๋Š” ์ž‘์—…์— ์‚ฌ์šฉ
  // ...
});

 

์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ์‹œ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ์˜ต์…˜ ๋ชฉ๋ก์ด๋‹ค.

 

์˜ต์…˜ ์„ค๋ช… ์˜ˆ์ œ
el html DOM ์š”์†Œ์™€ Vue ์ธ์Šคํ„ด์Šค ์—ฐ๊ฒฐ
#: id ์ง€์ •, .: ํด๋ž˜์Šค ์ง€์ •
el: '#app'
data Vue๊ฐ€ ๋ฐ”๋ผ๋ณด๋Š” data ๊ฐ์ฒด ์ง€์ • data: {name: '๊น€๊ฐ์ž'}
computed data ๊ฐ์ฒด ๋“ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ณ„์‚ฐ๋œ ๊ฐ’์„ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ •์˜
์บ์‹ฑ์„ ์‹œ์ผœ๋†“๊ณ  ๋™์ผํ•œ ์š”์ฒญ์—๋Š” ๊ฐ’๋งŒ ๋ฆฌํ„ด
 
methods data ๊ฐ์ฒด ๋“ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ณ„์‚ฐ๋œ ๊ฐ’์„ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ •์˜
์บ์‹ฑ์ด ๋˜์ง€ ์•Š๊ณ  ํ˜ธ์ถœ๋  ๋•Œ๋งˆ๋‹ค ๊ณ„์† ํ•จ์ˆ˜ ์‹คํ–‰
 
watch ์ง€์ •๋œ ๋ณ€์ˆ˜๋ฅผ ๊ณ„์† ์ง€์ผœ๋ณด๋‹ค๊ฐ€ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ ์ •์˜๋œ ํ•จ์ˆ˜ ์‹คํ–‰  
filter ํ…์ŠคํŠธ ํ˜•์‹ํ™”๋ฅผ ์œ„ํ•ด ํ‘œํ˜„์‹ ๋งˆ์ง€๋ง‰์— ํŒŒ์ดํ”„ ์‹ฌ๋ณผ(|)๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ  

 


Vue ๋ฐ์ดํ„ฐ ํ‘œ์‹œ

- ์ฝง์ˆ˜์—ผ ๋ฌธ๋ฒ• {{ํ”„๋กœํผํ‹ฐ๋ช…}}

์ด์ค‘ ์ค‘๊ด„ํ˜ธ {{ }} ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ทฐ ์ธ์Šคํ„ด์Šค์— ๊ด€๋ฆฌํ•˜๋Š” data, computed, props ์†์„ฑ์„ ํ™”๋ฉด์— ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ‘œ์‹œํ•  ๋ฐ์ดํ„ฐ ๋ณ€์ˆ˜๋ช…์„ ์ด์ค‘ ์ค‘๊ด„ํ˜ธ ์•ˆ์— ์ ๊ฑฐ๋‚˜ JS ํ‘œํ˜„์‹๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ex) {{ํ”„๋กœํผํ‹ฐ๋ช….replace('a', 'b')}}

 

<div>{{ str }}</div>
<div>{{ number + 1 }}</div>
<div>{{ message.split('').reverse().join('') }}</div>

 

Vue ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œ์‹œํ•˜๋Š” ์ „์ฒด ํ˜•ํƒœ์ด๋‹ค.

 

<!DOCTYPE html>
<html>
  <head><title>Vue.js Sample</title></head>
  <body>
    <div id="app">
      {{ message }} #Hello Vue.js!
    </div>


    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> # cdn
    <script>
      new Vue({
        el: "#app",
        data: {
          message: "Hello Vue.js!"
        }
      });
    </script>
  </body>
</html>

 

- ๋””๋ ‰ํ‹ฐ๋ธŒ

Vue์—์„œ html ์š”์†Œ์— ๋Œ€ํ•ด ์‹คํ–‰ํ•˜๋Š” ๋ช…๋ น์œผ๋กœ 'v-' ์ ‘๋‘์‚ฌ๋ฅผ ๋ถ™์—ฌ์„œ ์‚ฌ์šฉํ•œ๋‹ค.

๋‚ด๋ถ€์ ์œผ๋กœ ์ฝง์ˆ˜์—ผ ๋ฌธ๋ฒ•์ด v-text๋กœ ์ปดํŒŒ์ผ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์œ„์˜ ์˜ˆ์ œ์™€ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋‚ธ๋‹ค.

 

<div id="app">
    <p v-text="message"></p>
</div>

 

โœ”๏ธ v-text

innerText ์™€ ๋™์ผํ•œ ๊ธฐ๋Šฅ ์ˆ˜ํ–‰

ํƒœ๊ทธ๋ฅผ ์ธ์ฝ”๋”ฉํ•˜์—ฌ ๋ฌธ์ž ๊ทธ๋Œ€๋กœ ๋ณด์—ฌ์คŒ

์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋ผ {{}} ์™€ ๊ฐ™์€ ๊ฐ„๋‹จํ•œ ์„œ์‹์„ ์ถ”๊ฐ€ํ•ด์ค€ ๊ฒƒ

 

โœ”๏ธ v-html

innerHtml ๊ณผ ๋™์ผํ•œ ๊ธฐ๋Šฅ ์ˆ˜ํ–‰

ํƒœ๊ทธ๋ฅผ ํŒŒ์‹ฑํ•˜์—ฌ ํ™”๋ฉด์— ๊ตฌํ˜„

XSS(Cross Site Scripting) ๊ณต๊ฒฉ์— ์ฃผ์˜ํ•˜์—ฌ ์‚ฌ์šฉ

 

<body>
    <div id="app">
        <p>{{ myMessage }}</p>
        <p v-text="myMessage"></p>
        <p v-html="myMessage"></p>
    </div>
    <script>
        new Vue({
            el: '#app',
            data: {
                myMessage:'<h1>Hello :)</h1>'
            }
        })
    </script>
</body>

 

  • {{}}: <h1>Hello :)</h1>
  • v-text: <h1>Hello :)</h1>
  • v-html: h1 ํƒœ๊ทธ๊ฐ€ ํŒŒ์‹ฑ๋˜์–ด ํ™”๋ฉด์— ๊ตฌํ˜„๋จ

 

โœ”๏ธ v-show

css์˜ display์™€ ๋™์ผํ•œ ๊ธฐ๋Šฅ์œผ๋กœ ์—˜๋ฆฌ๋จผํŠธ๋Š” ๋ Œ๋”๋ง๋˜์–ด DOM์— ๋‚จ์•„์žˆ์Œ

 

โœ”๏ธ v-if, v-else-if, v-else

if, else if, else ์กฐ๊ฑด๋ฌธ์„ ๊ตฌํ˜„

์กฐ๊ฑด์— ๋”ฐ๋ผ ๋ธ”๋ก์„ ๋ Œ๋”๋ง, ๋””๋ ‰ํ‹ฐ๋ธŒ ํ‘œํ˜„์‹ ๊ฐ’์ด true ์ผ ๋•Œ๋งŒ ๋ Œ๋”๋ง

 

โœ”๏ธ v-for

for ๋ฐ˜๋ณต๋ฌธ์„ ๊ตฌํ˜„, ์›๋ณธ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์—˜๋ฆฌ๋จผํŠธ ๋˜๋Š” ํ…œํ”Œ๋ฆฟ ๋ธ”๋ก์„ ์—ฌ๋Ÿฌ ๋ฒˆ ๋ Œ๋”๋ง

item in items ๊ตฌ๋ฌธ ์‚ฌ์šฉ

ํ•ด๋‹น ๋ฐ์ดํ„ฐ์˜ ๊ธธ์ด๊ฐ€ 0์ด๋ฉด ๊ทธ๋ ค์ง€์ง€ ์•Š์•„ ๊ตณ์ด v-if๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์Œ

๋ฐ์ดํ„ฐ์˜ ๊ธธ์ด๊ฐ€ ์ฆ๊ฐ€ํ•˜๋ฉด ๊ธฐ์กด์˜ DOM ์ž์ฒด๋ฅผ ํŒŒ๊ธฐํ•˜์ง€๋Š” ์•Š๊ณ  ์ „๋ถ€ ๋ Œ๋”๋ง์„ ๋‹ค์‹œ ํ•˜์ง€ ์•Š์•„ ์„ฑ๋Šฅ์ด ์ข‹์€๋ฐ, ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ์œ ๋‹ˆํฌํ•œ key๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•จ

 

v-if ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹๊ณ ,  ๊ฐ™์ด ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ v-for ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์Œ

- ๋ฆฌ์ŠคํŠธ ๋ชฉ๋ก์„ ํ•„ํ„ฐ๋ง ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ

v-for="user in users" v-if="user.isActive" ์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•˜์ง€ ๋ง๊ณ  ํ•„ํ„ฐ๋ง๋œ ๋ชฉ๋ก์„ ์ƒˆ๋กœ์šด computed ์†์„ฑ์œผ๋กœ ์ •์˜

- ๋ฆฌ์ŠคํŠธ๋ฅผ ์ˆจ๊ธฐ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ

v-for="user in users" v-if="shouldShowUsers" ์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•˜์ง€ ๋ง๊ณ  v-if๋Š” ์ปจํ…Œ์ด๋„ˆ ์—˜๋ฆฌ๋จผํŠธ๋กœ ์˜ฎ๊ธฐ๊ธฐ

 

โœ”๏ธ v-on

์—˜๋ฆฌ๋จผํŠธ์— ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ์—ฐ๊ฒฐํ•˜์—ฌ ํŠน์ • ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์ฝ”๋“œ ์‹คํ–‰

์ด๋ฒคํŠธ ์œ ํ˜•์€ ์ „๋‹ฌ์ธ์ž๋กœ ํ‘œ์‹œ

v-on:click ์€ @click ๊ณผ ๊ฐ™์€ ์•ฝ์–ด๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

 

โœ”๏ธ v-bind

ํƒœ๊ทธ์˜ ์†์„ฑ์„ ๋ณ€๊ฒฝํ•  ๋•Œ ์‚ฌ์šฉ, html ์š”์†Œ์˜ ์†์„ฑ์— vue ์ƒํƒœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ’์œผ๋กœ ํ• ๋‹น

v-bind:href ๋Š” :href ์™€ ๊ฐ™์€ ์•ฝ์–ด๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

 

โœ”๏ธ v-model

html form ์š”์†Œ ๊ฐ’๊ณผ data ๋ฅผ ์–‘๋ฐฉํ–ฅ ๋ฐ”์ธ๋”ฉ

lazy, number, trim ๋“ฑ์˜ ์†์„ฑ์ด ์žˆ์Œ

- lazy

input ๋Œ€์‹  change ์ด๋ฒคํŠธ ํ›„์— ๋™๊ธฐํ™”

- number

๋ฌธ์ž์—ด์„ ์ˆซ์ž๋กœ ๋ณ€๊ฒฝ

- trim

์ž…๋ ฅ์— ๋Œ€ํ•œ ๊ณต๋ฐฑ ์ œ๊ฑฐ

 

โœ”๏ธ v-pre

์ปดํŒŒ์ผํ•˜์ง€ ์•Š๊ณ  ์ฝ”๋“œ๊ฐ€ ๊ทธ๋Œ€๋กœ ๋ณด์—ฌ์ง

 

โœ”๏ธ v-once

์ฒ˜์Œ ํ•œ ๋ฒˆ๋งŒ ๋ Œ๋”๋ง์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์ดํ›„์— ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋„ ๊ทธ๋Œ€๋กœ ์ฒ˜์Œ ๊ฐ’์„ ๋ณด์—ฌ์คŒ

 

 

์ฐธ๊ณ ์ž๋ฃŒ ๋ฐ ์ถœ์ฒ˜ ๐Ÿ™‡‍โ™‚๏ธ

https://velog.io/@swhan9404/vue%EC%9D%98-%EB%AC%B8%EB%B2%95

https://cjw-awdsd.tistory.com/33

https://uxgjs.tistory.com/112

 

๋Œ“๊ธ€