๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
โญ Personal_Study/Vue

Vue: Basic Syntax

by ํฌ์ŠคํŠธ์‰์ดํฌ 2022. 11. 7.

Basic Syntax

Template Interpolation

<div id="app">
  <p>๋ฉ”์‹œ์ง€: {{ msg }}</p>
  <p>HTML ๋ฉ”์‹œ์ง€ : {{ rawHTML }}</p>
  <p>HTML ๋ฉ”์‹œ์ง€ : <span v-html="rawHTML"></span></p>
  <p>{{ msg.split('').reverse().join('') }}</p>
</div>
<script>
  // 1. Text interpolation
  const app = new Vue({
    el: "#app",
    data: {
      msg: "Text interpolation",
      rawHTML: '<span style="color:red"> ๋นจ๊ฐ„ ๊ธ€์”จ</span>',
    },
  });
</script>

โœ” ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ๋ฐ”์ธ๋”ฉ(์—ฐ๊ฒฐ) ๋ฐฉ๋ฒ•
โœ” ์ค‘๊ด„ํ˜ธ 2๊ฐœ๋กœ ํ‘œ๊ธฐ

Directives

๊ธฐ๋ณธ ๊ตฌ์„ฑ

โœ” v-์ ‘๋‘์‚ฌ๊ฐ€ ์žˆ๋Š” ํŠน์ˆ˜ ์†์„ฑ์—๋Š” ๊ฐ’์„ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ๊ฐ’์—๋Š” JSํ‘œํ˜„์‹์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Œ

โœ” directive์˜ ์—ญํ• ์€ ํ‘œํ˜„์‹์˜ ๊ฐ’์ด ๋ณ€๊ฒฐ๋  ๋•Œ ๋ฐ˜์‘์ ์œผ๋กœ DOM์— ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ

โœ” :์„ ํ†ตํ•ด ์ „๋‹ฌ์ธ์ž๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์Œ
โœ” .์œผ๋กœ ํ‘œ์‹œ๋˜๋Š” ํŠน์ˆ˜ ์ ‘๋ฏธ์‚ฌ directive์„ ํŠน๋ณ„ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ฐ”์ธ๋”ฉ

v-text & v-html

<div id="app2">
  <!-- v-text & {{}} -->
  <p v-text="message"></p>
  <!-- ๋™์ผ -->
  <p>{{ message }}</p>
</div>
const app2 = new Vue({
  el: "#app2",
  data: {
    // text
    message: "Hello!",
    // html
    html: '<a href="https://www.google.com">GOOGLE</a>',
  },
});

โœ” Template interpolation๊ณผ ํ•จ๊ป˜ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ๋ฐ”์ธ๋”ฉ ๋ฐฉ๋ฒ•

โœ” v-html

  • RAW HTML์„ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•
  • ๋‹จ, ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•˜๊ฑฐ๋‚˜ ์ œ๊ณตํ•˜๋Š” ์ปจํ…์ธ ์—๋Š” ์ ˆ๋Œ€ ์‚ฌ์šฉ ๊ธˆ์ง€ (XSS ๊ณต๊ฒฉ)

v-show & v-if

<div id="app3">
  <p v-show="isActive">๋ณด์ด๋‹ˆ? ์•ˆ๋ณด์ด๋‹ˆ?</p>
  <p v-if="isActive">์•ˆ๋ณด์ด๋‹ˆ? ๋ณด์ด๋‹ˆ?</p>
</div>
const app3 = new Vue({
  el: "#app3",
  data: {
    isActive: false,
  },
});

โœ” v-show

  • ํ‘œํ˜„์‹์— ์ž‘์„ฑ๋œ ๊ฐ’์— ๋”ฐ๋ผ element๋ฅผ ๋ณด์—ฌ์ค„ ๊ฒƒ์ธ์ง€ ๊ฒฐ์ •(boolean ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ๋ฐ˜์‘)
  • ๋Œ€์ƒ element์˜ display์†์„ฑ์„ ๊ธฐ๋ณธ ์†์„ฑ๊ณผ none์œผ๋กœ toggle
  • ์š”์†Œ ์ž์ฒด๋Š” ํ•ญ์ƒ DOM์— ๋ Œ๋”๋ง ๋œ๋‹ค.

โœ” v-if

  • v-show์™€ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์€ ๋™์ผ
  • ๊ฐ’์ด false์ธ ๊ฒฝ์šฐ DOM์—์„œ ์‚ฌ๋ผ์ง

v-show vs v-if

โœ” v-show(Expensive initial load, cheap toggle)

  • ํ‘œํ˜„์‹ ๊ฒฐ๊ณผ์™€ ๊ด€๊ณ„์—†์ด ๋ Œ๋”๋ง ๋˜๋ฏ€๋กœ ์ดˆ๊ธฐ ๋ Œ๋”๋ง์— ํ•„์š”ํ•œ ๋น„์šฉ์€ v-if๋ณด๋‹ค ๋†’์„ ์ˆ˜ ์žˆ์Œ
  • display ์†์„ฑ ๋ณ€๊ฒฝ์œผ๋กœ ํ‘œํ˜„ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•˜๋ฏ€๋กœ ๋ Œ๋”๋ง ํ›„ toggle ๋น„์šฉ์€ ์ ์Œ

โœ” v-if (Cheap initial load, expensive toggle)

  • ํ‘œํ˜„์‹ ๊ฒฐ๊ณผ๊ฐ€ false์ธ ๊ฒฝ์šฐ ๋ Œ๋”๋ง์กฐ์ฐจ ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ดˆ๊ธฐ ๋ Œ๋”๋ง ๋น„์šฉ์€ ๋‚ฎ์„ ์ˆ˜ ์žˆ์Œ
  • ๋‹จ, ํ‘œํ˜„์‹ ๊ฐ’์ด ์ž์ฃผ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒฝ์šฐ ์žฆ์€ ์žฌ ๋ Œ๋”๋ง์œผ๋กœ ๋น„์šฉ์ด ์ฆ๊ฐ€
  • else, if-else ๋“ฑ๊ณผ ํ•จ๊ป˜ ์กฐ๊ฑด๋ฌธ์œผ๋กœ ์ด์šฉ

v-for

  1. string
<div id="app">
  <h2>String</h2>
  <div v-for="char in myStr">{{ char }}</div>
  <div v-for="(char, index) in myStr" :key="index">
    <p>{{ index }}๋ฒˆ์งธ ๋ฌธ์ž์—ด {{ char }}</p>
  </div>
</div>
<script>
  const app = new Vue({
    el: "#app",
    data: {
      // 1. String
      myStr: "Hello, World!",
    },
  });
</script>
  1. array
<h2>Array</h2>
<div v-for="(item, index) in myArr" :key="index">
  <p>{{ index }}๋ฒˆ์งธ ์•„์ดํ…œ {{ item }}</p>
</div>

<div v-for="(item, index) in myArr2" :key="`arry-${index}`">
  <p>{{ index }}๋ฒˆ์งธ ์•„์ดํ…œ</p>
  <p>{{ item.name }}</p>
</div>
<script>
  const app = new Vue({
    el: "#app",
    data: {
      // 2-1. Array
      myArr: ["python", "django", "vue.js"],

      // 2-2. Array with Object
      myArr2: [
        { id: 1, name: "python", completed: true },
        { id: 2, name: "django", completed: true },
        { id: 3, name: "vue.js", completed: false },
      ],
    },
  });
</script>
  1. objects
<h2>Object</h2>
<div v-for="value in myObj">
  <p>{{ value }}</p>
</div>

<div v-for="(value, key) in myObj" :key="key">
  <p>{{ key }} : {{ value }}</p>
</div>
<script>
  const app = new Vue({
    el: "#app",
    data: {
      // 3. Object
      myObj: {
        name: "sun",
        age: 27,
      },
    },
  });
</script>

โœ” for.. in.. ํ˜•์‹์œผ๋กœ ์ž‘์„ฑ
โœ” ๋ฐ˜๋ณตํ•˜๋Š” ๋ฐ์ดํ„ฐ ํƒ€์ž…์— ๋ชจ๋‘ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
โœ” index๋ฅผ ํ•จ๊ป˜ ์ถœ๋ ฅํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด (char, index) ํ˜•ํƒœ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

ํŠน์ˆ˜ ์†์„ฑ key

โœ” v-for ์‚ฌ์šฉ ์‹œ ๋ฐ˜๋“œ์‹œ key ์†์„ฑ์„ ๊ฐ ์š”์†Œ์— ์ž‘์„ฑ
โœ” ์ฃผ๋กœ v-for directive ์ž‘์„ฑ ์‹œ ์‚ฌ์šฉ
โœ” vue ํ™”๋ฉด ๊ตฌ์„ฑ ์‹œ ์ด์ „๊ณผ ๋‹ฌ๋ผ์ง„ ์ ์„ ํ™•์ธํ•˜๋Š” ์šฉ๋„๋กœ ํ™œ์šฉ

  • ๋”ฐ๋ผ์„œ key ์ค‘๋ณต x

โœ” ๊ฐ ์š”์†Œ๊ฐ€ ๊ณ ์œ ํ•œ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด ์ƒ๋žต ๊ฐ€๋Šฅ

v-on

โœ” :์„ ํ†ตํ•ด ์ „๋‹ฌ๋ฐ›์€ ์ธ์ž๋ฅผ ํ™•์ธ
โœ” ๊ฐ’์œผ๋กœ JSํ‘œํ˜„์‹ ์ž‘์„ฑ
โœ” addEventListener์˜ ์ฒซ๋ฒˆ์งธ ์ธ์ž์™€ ๋™์ผํ•œ ๊ฐ’๋“ค๋กœ ๊ตฌ์„ฑ
โœ” ๋Œ€๊ธฐํ•˜๊ณ  ์žˆ๋˜ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํ• ๋‹น๋œ ํ‘œํ˜„์‹ ์‹คํ–‰

<body>
  <div id="app">
    <button v-on:click="number++">increase Number</button>
    <p>{{ number }}</p>
  </div>
  ...
</body>
<script>
  const app = new Vue({
    el: "#app",
    data: {
      number: 0,
      isActive: false,
    },
  });
</script>

โœ” method๋ฅผ ํ†ตํ•œ data ์กฐ์ž‘๋„ ๊ฐ€๋Šฅ
โœ” method์— ์ธ์ž๋ฅผ ๋„˜๊ธฐ๋Š” ๋ฐฉ๋ฒ•์€ ์ผ๋ฐ˜ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ์™€ ๋™์ผํ•œ ๋ฐฉ์‹
โœ” :์„ ํ†ตํ•ด ์ „๋‹ฌ๋œ ์ธ์ž์— ๋”ฐ๋ผ ํŠน๋ณ„ํ•œ modifiers(์ˆ˜์‹์–ด)๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Œ

  • ex) v-on:keyup.enter

โœ” @ shortcut ์ œ๊ณต

  • ex) @keyup.click
<body>
  <div id="app">
    ...
    <button v-on:click="toggleActive">toggle isActive</button>
    <button @click="checkActive(isActive)">check isActive</button>
    <p>{{ isActive }}</p>
  </div>
</body>
<script>
  const app = new Vue({
    el: "#app",
    data: {
      number: 0,
      isActive: false,
    },
    methods: {
      toggleActive: function () {
        this.isActive = !this.isActive;
      },
      checkActive: function (check) {
        console.log(check);
      },
    },
  });
</script>

v-bind

<div id="app2">
  <a v-bind:href="url">Go To GOOGLE</a>

  <p v-bind:class="redTextClass">๋นจ๊ฐ„ ๊ธ€์”จ</p>
  <p v-bind:class="{ 'red-text': true }">๋นจ๊ฐ„ ๊ธ€์”จ</p>
  <p v-bind:class="[redTextClass, borderBlack]">๋นจ๊ฐ„ ๊ธ€์”จ, ๊ฒ€์€ ํ…Œ๋‘๋ฆฌ</p>
  <!-- : shortcut -->
  <p :class="theme">์ƒํ™ฉ์— ๋”ฐ๋ฅธ ํ™œ์„ฑํ™”</p>
  <button @click="darkModeToggle">dark Mode {{ isActive }}</button>
</div>
<script>
  const app2 = new Vue({
    el: "#app2",
    data: {
      url: "https://www.google.com/",
      redTextClass: "red-text",
      borderBlack: "border-black",
      isActive: true,
      theme: "dark-mode",
    },
    methods: {
      darkModeToggle() {
        this.isActive = !this.isActive;
        if (this.isActive) {
          this.theme = "dark-mode";
        } else {
          this.theme = "white-mode";
        }
      },
    },
  });
</script>

โœ” HTML ๊ธฐ๋ณธ ์†์„ฑ์— Vue data๋ฅผ ์—ฐ๊ฒฐ
โœ” class์˜ ๊ฒฝ์šฐ ๋‹ค์–‘ํ•œ ํ˜•ํƒœ๋กœ ์—ฐ๊ฒฐ ๊ฐ€๋Šฅ
โœ” ์กฐ๊ฑด๋ถ€ ๋ฐ”์ธ๋”ฉ

  • `{'class Name': '์กฐ๊ฑด ํ‘œํ˜„์‹'}
  • ์‚ผํ•ญ ์—ฐ์‚ฐ์ž ๊ฐ€๋Šฅ

โœ” ๋‹ค์ค‘ ๋ฐ”์ธ๋”ฉ

  • ['JSํ‘œํ˜„์‹', 'JSํ‘œํ˜„์‹',...]

โœ” : shortcut ์ œ๊ณต

v-model

<div id="app">
  <h2>1. Input -> Data</h2>
  <h3>{{ myMessage }}</h3>
  <input @input="onInputChange" type="text" />
  <hr />

  <h2>2. Input <-> Data</h2>
  <h3>{{ myMessage2 }}</h3>
  <input v-model="myMessage2" type="text" />
  <hr />
</div>
<script>
  const app = new Vue({
    el: "#app",
    data: {
      myMessage: "",
      myMessage2: "",
    },
    methods: {
      onInputChange: function (event) {
        this.myMessage = event.target.value;
      },
    },
  });
</script>

โœ” Vue instance์™€ DOM์˜ ์–‘๋ฐฉํ–ฅ ๋ฐ”์ธ๋”ฉ
โœ” Vue data ๋ณ€๊ฒฝ ์‹œ v-model๋กœ ์—ฐ๊ฒฐ๋œ ์‚ฌ์šฉ์ž ์ž…๋ ฅ element์—๋„ ์ ์šฉ
โœ” ํ•œ๊ธ€, ์ผ๋ณธ์–ด, ์ค‘๊ตญ์–ด ์™„์ „ํžˆ ์ง€์› x

'โญ Personal_Study > Vue' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

SFC (Single File Component)  (0) 2022.11.11
Vue_CLI  (0) 2022.11.09
Vue: advanced attributes  (0) 2022.11.07
Vue Instance  (0) 2022.11.06
Vue Intro  (0) 2022.11.06

๋Œ“๊ธ€