Skip to main content

v-bind vs v-model

작성일 : 2024.11.13

1. 데이터 흐름​

v-bind​

  • 단방향 데이터 바인딩
  • 컴포넌트/데이터 → 템플릿(화면) 방향으로만 동작
<input :value="message"> <!-- message가 변경되면 input 값이 변경됨 -->
<!-- 하지만 input 값을 변경해도 message는 변경되지 않음 -->

v-model​

  • 양방향 데이터 바인딩
  • 컴포넌트/데이터 ↔ 템플릿(화면) 양쪽으로 동작
<input v-model="message"> <!-- message와 input 값이 서로 동기화됨 -->

2. 내부 동작 방식​

v-model은 실제로 다음과 같은 v-bind와 v-on의 조합으로 동작합니다:

<!-- v-model의 내부 동작 -->
<input
  v-model="message"
>

<!-- 위 코드는 다음과 동일 -->
<input
  :value="message"
  @input="message = $event.target.value"
>

3. 사용 예시와 차이점​

<!-- v-bind 사용 예시 -->
<img :src="imageUrl">         <!-- 이미지 소스 바인딩 -->
<div :class="className">      <!-- 클래스 바인딩 -->
<button :disabled="isLoading"> <!-- 속성 바인딩 -->

<!-- v-model 사용 예시 -->
<input v-model="username">    <!-- 입력 필드 -->
<textarea v-model="content">  <!-- 텍스트 영역 -->
<select v-model="selected">   <!-- 선택 상자 -->

4. 각각 언제 사용하나요?​

v-bind 사용​

  • HTML 속성을 동적으로 설정할 때
  • 컴포넌트의 props를 전달할 때
  • CSS 클래스나 스타일을 동적으로 바인딩할 때
<div :class="{ active: isActive }">
<img :src="imageUrl">
<CustomComponent :prop-name="propValue">

v-model 사용​

  • 폼 입력 요소와 데이터를 동기화할 때
  • 사용자 입력을 직접 데이터에 반영해야 할 때
<input v-model="username">
<select v-model="country">
<textarea v-model="description">

5. 실제 사용 예시​

<template>
  <div class="form-group">
    <!-- v-bind 사용 -->
    <img :src="profileImage">
    <button :disabled="isSubmitting">
      {{ isSubmitting ? 'Submitting...' : 'Submit' }}
    </button>

    <!-- v-model 사용 -->
    <input 
      v-model="formData.name"
      :class="{ 'is-invalid': errors.name }" <!-- v-bind로 클래스 조건부 적용 -->
    >
    <select v-model="formData.country">
      <option v-for="country in countries" 
              :value="country.code" <!-- v-bind로 동적 값 설정 -->
              :key="country.code">
        {{ country.name }}
      </option>
    </select>
  </div>
</template>

6. 주의사항​

  • v-model은 폼 요소나 사용자 입력 컴포넌트에만 사용
  • v-bind는 모든 HTML 속성이나 컴포넌트 props에 사용 가능
  • v-model은 .lazy, .number, .trim 같은 수식어 사용 가능
<input v-model.lazy="message">    <!-- change 이벤트 후 동기화 -->
<input v-model.number="age">      <!-- 숫자로 형변환 -->
<input v-model.trim="message">    <!-- 공백 제거 -->

결론적으로, v-bind는 단방향 데이터 바인딩을 위한 범용적인 디렉티브이고, v-model은 폼 입력 요소에 특화된 양방향 데이터 바인딩 디렉티브입니다.