VUE3

Vue3 - 템플릿 문법

J-Chris 2023. 7. 6. 17:54

## 텍스트 보간법

 

데이터 바인딩의 가장 기본형태는 {{ data }} (이중 중고라호, 콧수염 괄호)를 사용하는 것 입니다.

  • 이중 중괄호를 사용하면 해당 문법은 컴포넌트 인스턴스의 message 값으로 대체됩니다.
  • Message 속성이 변경될 때마다 갱신(반응)됩니다. 

 

<template>

  <div>

    <p>문자열 : {{ message }}</p>

  </div>

</template>

<script>

import { ref } from 'vue';

 

export default {

  setup() {

    const message = ref('안녕하세요');

    return {

      message,

    };

  },

};

</script>

 

 v-once 디렉티브를 사용하여 데이터가 변경되어도 갱신(반응) 되지 않는 일회성 보간을 수행할 수 있습니다.

 

(예)

<p v-once> 문자열 : {{ message }} </p>

 

(예제)

<template>

  <div>

    <h2>보간법</h2>

    <p>{{ message }}</p>

    <p v-once>{{ message }}</p>

    <button v-on:click="message = message + '!'">Click!</button>

  </div>

</template>

<script>

import { ref } from 'vue';

 

export default {

  setup() {

    const message = ref('안녕하세요');

    

    return {

      message,

    };

  },

};

</script>

 

 

V-once는 일회성만 보관하므로 버튼 클릭시 반응성 작용이 일어나지 않는다.

 

## HTML (v-html)

이중 중괄호는 데이터를 HTML이 아닌 일반 텍스트로 해석합니다.  실제 HTML을 출력하려면 v-html 디렉티브를 사용해야합니다.

 

<h2>텍스트: {{ rawHtml }}</h2>

<h2>v-html: <span v-html="rawHtml"></span></h2>

 

 

Tip !

웹 사이트에서 임의의 HTML을 동적으로 렌더링하면 XSS 취약점 (opens new window) 으로 쉽게 이어질 수 있고

이는 매우 위험할 소지가 있습니다. HTML 보간법은 반드시 신뢰할 수 있는 콘텐츠에서만 사용하고 사용자가 제공한

콘텐츠에서는 절대 사용하면 안됩니다.

 

 

## 속성 바인딩 (v-bind)

 

이중 중괄호는 HTML 속성에 사용할 수 없습니다. 대신 v-bind 디렉티브를 사용하세요.

<div v-bind:title=“dynamicTitle”> 마우스를 올려보세요. </div>

 

‘Boolean 속성’은 속성 존재 자체가 참(true) , 거짓(false)을 의미하는 속성입니다.

<input type=“text” v-bind:disabled=“isInputDisabled” />

 

단축 표현

V-bind는 매우 자주 사용하기 때문에 단축 문법이 있습니다.

<div :title=“dynamicTitle”> 마우스를 올려보세요. </div>

<input type=“text” :disabled=“isInputDisabled” />

 

:을 사용하여 속성을 바인딩할 수 있습니다.

 

다중 속성 바인딩 이란 무엇인가 ??

 

(예제)

<template>
  <div>
    <h2>보간법</h2>
    <p>{{ message }}</p>
    <p v-once>{{ message }}</p>
    <button v-on:click="message = message + '!'">Click!</button>
    <hr />
    <h2>v-html</h2>
    <p>{{ rawHtml }}</p>
    <p v-html="rawHtml"></p>
    <hr />
    <h2>속성 바인딩</h2>
    <div :title="dynamicTitle">마우스를 올려보세요</div>
    <input type="text" value="홍길동" :disabled="isInputDisabled" />
    <input v-bind="attrs" />
    <h2>Javascript</h2>
    {{ message.split('').reverse().join('') }}<br />
    {{ isInputDisabled ? '예' : '아니오' }}
  </div>
</template>
<script>
import { ref } from 'vue';

export default {
  setup() {
    const message = ref('안녕하세요');
    const rawHtml = ref('<strong>안녕하세요</strong>');
    const dynamicTitle = ref('안녕하세요 !!!')

    const isInputDisabled = ref(false);
    const attrs = ref({
      type: 'text',
      value: '12345678',
      disabled: false,
    });
    return {
      message,
      rawHtml,
      dynamicTitle,
      isInputDisabled,
      attrs,
    };
  },
};
</script>