본문 바로가기
Study

[Vue.js] Vue Template (v-bind, v-on, v-if, v-show)

by 안자두 2023. 5. 25.

Template

템플릿이란 Vue로 화면을 조작하기 위해 제공되는 문법이다. 크게 데이터 바인딩과 디렉티브 두 가지로 나눌 수 있다.

 


 

Data Binding

Vue 인스턴스에서 정의한 속성들을 화면에 표시하는 방법이다. 가장 기본적인 방식이며 콧수염 문법인 "{{ }}"을 활용하여 인스턴스의 data, computed, props 속성을 연결할 수 있다. 간단한 표현식 또한 표시할 수 있다.

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

 


 

Directive

Directive는 Vue의 화면 요소를 더 쉽게 조작하기 위한 문법이다.
일반적으로 id, class 등 표준 속성을 제외하고 v- 접두사가 붙은 속성을 모두 일컫는다.

주로 사용하는 속성들은 v-bind, v-on, v-if, v-else, v-show 등이 있다.

v-bind

v-bind는 인스턴스의 data, computed, props 속성값들을 바인딩시켜준다.
html을 읽다가 v-bind를 만나면 Vue 인스턴스의 data나 computed, props 등의 속성을 검색해서 해당 속성을 찾는다.

해당 값을 사용할 속성의 앞에 v-bind를 적어주고 콜론(:)으로 이어준다.

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <style>
    .text-blue {
      color: blue;
      font-weight: 700;
      font-size: 24px;
    }
  </style>
</head>
<body>
  <div id="app">
    <p v-bind:id="uuid" v-bind:class="name">{{ num }}</p>
  </div>

  <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  <script>
    const vm = new Vue({
      el: '#app',
      data: {
        num: 10,
        uuid: 'abc1234',
        name: 'text-blue',
      }
    })
  </script>
</body>

p의 id는 data의 uuid를 바인딩하고, class에는 name 속성을 바인딩시켰다.

렌더링 된 화면에서는 잘 바뀐 것을 확인할 수 있다.

 

v-on

v-on은 DOM 이벤트를 수신한다. 전달 인자는 이벤트를 받을 이름이다.
v-on 디렉티브를 사용하여 DOM 이벤트를 듣고 트리거 될 때, JavaScript를 실행할 수 있다.

<body>
  <div id="app">
    <button v-on:click="handleClick">click</button>
  </div>

  <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  <script>
    const vm = new Vue({
      el: '#app',
      methods: {
        handleClick() {
          console.log('clicked!');
        }
      }
    })
  </script>
</body>

button의 click 이벤트에 handleClick이라는 메서드를 할당시켜 주었다.

이제 버튼을 클릭하게 되면 이벤트에 할당된 메서드가 실행된다.

click할 때마다 로그가 찍힌다

이벤트 수식어

이벤트 핸들러 내부에서 event.preventDefault() 또는 event.stopPropagation()를 호출하는 대신, 이벤트 수식어를 사용하여 간단하게 작업할 수 있다.

예를 들어, form의 경우 submit 이벤트가 발생하면 페이지가 새로고침된다. 이를 방지하기 위해 이벤트 발생 시, event.preventDefault()를 호출하였지만 Vue에서는 이벤트 수식어를 사용해 아래처럼 작성하여 방지할 수 있다.

<form v-on:submit.prevent="onSubmit"></form>

수식어는 점으로 표시된 접미사로 아래와 같은 것들이 있다.

  • .stop
  • .prevent
  • .capture
  • .self
  • .once
  • .passive

 

v-if, v-else, v-show

v-if와 v-else는 JavaScript의 if-else문과 유사하다.

if(isActive) return '<div>active!</div>'
else return '<div>inactive!</div>'

만약 isActive라는 변수에 따라 다른 요소를 보여줘야 한다면 위와 같이 작성할 수 있을 것이다.

하지만 Vue에서는 v-if와 v-else로 아래와 같이 작성할 수 있다.

<div v-if="isActive">active!</div>
<div v-else>inactive!</div>

이렇게 사용할 때는 JavaScript처럼 if문과 else문이 붙어있어야 한다.

 

v-show는 v-if와 유사하지만 조금 다르다.

<div v-show="isActive">active!</div>

둘 모두 조건에 부합할 때 보인다는 점에서는 동일하지만, v-if의 경우에는 값에 따라 DOM에 렌더링 여부가 갈리지만, v-show의 경우에는 display: none처리를 한 것과 같아진다.

즉, 자주 변경될 값은 v-show를 사용하고, 값에 따라 분기할 필요가 있을 때에는 v-if를 사용하는 것이 좋다.

 


REF

https://v2.ko.vuejs.org/v2/guide/syntax.html

https://v2.ko.vuejs.org/v2/guide/events.html

https://joshua1988.github.io/web-development/vuejs/vuejs-tutorial-for-beginner/

 

728x90