본문 바로가기
PROGRAMMING/Vue

[Vue] Template Syntax

by 안녕나는현서 2021. 11. 15.
728x90

Template Syntax

  • 렌더링된 DOM를 기본 Vue 인스턴스의 데이터에 선언적으로 바인딩할 수 있는 HTML 기반 템플릿 구문 사용

 

Interploation (보간법)

- Text

<span>메시지: {{ message }}</span>

 

- Raw HTML

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

 

- Attributes

<div v-bind:id="dynamicId"></div>

 

- JS 표현식

{{ number + 1 }}
{{ message.split('').reverse().join('') }}

 

Directive (디렉티브)

  • v- 접두사가 있는 특수 속성
  • 속성 값은 단일 JS 표현식이 됨
  • 표현식의 값이 변경될 때 반응적으로 DOM에 적용하는 역할
  • 전달인자 (Arguments) : ':' (콜론)을 통해 전달인자 받을 수 있음
  • 수식어 (Modifiers) : '.' (점)으로 표시되는 특수 접미사, directive를 특별한 방법으로 바인딩해야함을 나타냄

 

- v-text

  • 엘리먼트의 textContent를 업데이트
  • 내부적으로 interpolation 문법이 v-text로 컴파일 됨
<p>{{ message }}</p>
<p v-text="message"></p>

 

- v-html

  • 엘리먼트의 innerHTML을 업데이트
  • XSS 공격에 취약
  • 사용자 입력값에서는 절대 사용 금지
<div v-html="myHtml"></div>

<script>
  const app = new Vue({
    el: '#app',
    data: {
      myHtml: '<b>Hello</b>'
    },
  })
</script>

 

[조건문]

- v-show

  • 조건부 렌더링 중 하나
  • 엘리먼트는 항상 렌더링 되고 DOM에 남아있음
  • 단순히 엘리먼트의 display CSS 속성을 hidden으로 만들어 토글
<div id="app">
  <p v-show="isTrue">true</p>
  <p v-show="isFalse">false</p>
</div>
<script>
  const app = new Vue({
    el: '#app',
    data: {
      isTrue: true,
      isFalse: false,
    },
  })
</script>

 

- v-if, v-else-if, v-else

  • 조건부 렌더링 중 하나
  • 조건에 따라 블록을 렌더링, directive 표현식이 true일 때만 렌더링
  • 엘리먼트 및 포함된 directive는 토글하는 동안 삭제되고 다시 작성
<div id="app">
  <p v-if="isTrue">true</p>
</div>
<script>
  const app = new Vue({
    el: '#app',
    data: {
      isTrue: true,
    },
  })
</script>

 

* v-show와 v-if

  • v-show
    • 실제로 렌더링은 되지만 눈에 보이지 않는 것
    • 딱 한 번만 렌더링되는 경우라면, v-if에 비해 렌더링 비용 높음
    • 자주 변경되는 요소라면, 렌더링 이후 보여주는지 여부만 판단하기 때문에 토글 비용 적음
  • v-if
    • 전달인자가 false은 경우 렌더링이 되지 않음
    • 렌더링 자체가 되지 않기 때문에 렌더링 비용 낮음
    • 자주 변경되는 요소의 경우, 다시 렌더링 해야하므로 비용 증가할 수 있음

 

[반복문]

- v-for

  • 원본 데이터를 기반으로 엘리먼트 또는 템플릿 블록을 여러 번 렌더링
  • 'item in items' 구문 사용
  • 반드시 key 속성을 각 요소에 작성
  • v-if와 함께 사용하는 경우 v-for가 더 우선순위가 높음 (가능하면 같이 쓰지 말 것)
<div id="app">
  <div v-for="item in items" :key="item.id">{{ item.title }}</div>
</div>
<script>
  const app = new Vue({
    el: '#app',
    data: {
      items: [
        {id: 1, title: 'item1'},
        {id: 2, title: 'item2'},
        {id: 3, title: 'item3'},
      ]
    },
  })

 

[이벤트]

- v-on

  • 엘리먼트에 이벤트 리스너 연결
  • 이벤트 유형은 전달인자로 표시
  • 특정 이벤트 발생 시, 주어진 코드 실행
  • shorthand : @ (v-on:click === @click)
<div id="app">
  <button @click="doAlert">button</button>
</div>
<script>
  const app = new Vue({
    el: '#app',
    data: {
    },
    methods: {
      doAlert: function () {
        alert('Hi!')
      },
    }
  })
</script>

 

[Element 속성 바인딩]

- v-bind

  • HTML 요소 속성에 Vue의 상태 데이터를 값으로 할당
  • Object 형태로 사용하면 value가 true인 key가 class 바인딩 값으로 할당
  • shorthand : :(콜론) (v-bind:href === :href)
<div id="app">
  <div :class="{ active: isRed }">안녕</div>
  <div :clss="[activeRed, myBackground]">잘가</div>
</div>
<script>
  const app = new Vue({
    el: '#app',
    data: {
      isRed: true,
      activeRed: 'active',
      myBackground: 'my-background-color'
    },
  })
</script>

 

- v-model

  • HTML form 요소의 값과 data를 양방향 바인딩
  • .lazy : input대신 change 이벤트 이후에 동기화
  • .number : 문자열을 숫자로 변경
  • .trim : 입력에 대한 trim을 진행
<div id="app">
  <input v-model="userInput" type="text">
</div>
<script>
  const app = new Vue({
    el: '#app',
    data: {
      userInput: '',
    },
  })
</script>
728x90

'PROGRAMMING > Vue' 카테고리의 다른 글

[Vue] Components  (0) 2021.11.20
[Vue] Vue CLI  (0) 2021.11.20
[Vue] Lifecycle Hooks, lodash  (0) 2021.11.15
[Vue] MVVM Pattern, Vue 인스턴스 생성  (0) 2021.11.15
[Vue] SPA(Single Page Application), CSR(Client Side Rendering)  (0) 2021.11.15

댓글