λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ“  archive

[Vue.js] v-model 속성과 @Model λ°μ½”λ ˆμ΄ν„°μ— κ΄€ν•΄μ„œ

by HandHand 2022. 2. 20.

Vue 의 v-model 에 λŒ€ν•΄μ„œ μ•Œμ•„λ³΄μž

πŸ“Œ v-model μ΄λž€?

v-model 은 Vue μ—μ„œ μ–‘λ°©ν–₯ 바인딩을 μ‚¬μš©ν•  수 μžˆλŠ” λ””λ ‰ν‹°λΈŒμž…λ‹ˆλ‹€.

기본적으둜 form μš”μ†Œλ“€μ— μ‚¬μš©ν•  수 있으며 이λ₯Ό 톡해 ν˜„μž¬ μž…λ ₯된 form μš”μ†Œ 값을

λ™κΈ°μ μœΌλ‘œ μ†μ‰½κ²Œ λ‹€λ£° 수 μžˆλ„λ‘ ν•΄μ€λ‹ˆλ‹€.

 

πŸ“Œ v-model 의 μ‚¬μš© μ˜ˆμ‹œ

<template>
  <div>
    <input type="text" v-model="name" />
  </div>
</template>

<script lang="ts">
import { Component, Vue } from 'vue-property-decorator'

@Component({
  name: 'Index',
})
export default class Index extends Vue {
  private name = ''
}
</script>

 

πŸ“Œ v-model κ³Ό ν•¨κ»˜ μ‚¬μš©ν•  수 μžˆλŠ” μˆ˜μ‹μ–΄

v-model κ³Ό ν•¨κ»˜ μ‚¬μš©ν•  수 μžˆλŠ” μˆ˜μ‹μ–΄(modifier) κ°€ 3가지 μ‘΄μž¬ν•©λ‹ˆλ‹€.

각각의 μˆ˜μ‹μ–΄μ— λŒ€ν•΄μ„œ κ°„λ‹¨ν•œ μ˜ˆμ‹œμ™€ ν•¨κ»˜ μ‚΄νŽ΄λ³΄λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.

.lazy

<template>
  <div>
    <input type="text" v-model.lazy="firstName">
    <input type="text" v-model="lastName">
  </div>
</template>

<script lang="ts">
import { Component, Vue } from 'vue-property-decorator'

@Component({
  name: 'Index',
})
export default class Index extends Vue {
  private firstName = ''
  private lastName = ''
}
</script>

.lazy μˆ˜μ‹μ–΄λ₯Ό μ‚¬μš©ν•  경우 change μ΄λ²€νŠΈκ°€ λ°œμƒν•  λ•Œ κ°’μ˜ 동기화가 이루어지도둝 λ³€κ²½ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μœ„ 예제의 경우 첫번째 input μš”μ†Œμ—μ„œ focus out 될 κ²½μš°μ— 값이 λ™κΈ°ν™”λ˜λŠ” 것을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

.number

<template>
  <div>
    <input type="number" v-model.number="price" />
  </div>
</template>

<script lang="ts">
import { Component, Vue } from 'vue-property-decorator'

@Component({
  name: 'Index',
})
export default class Index extends Vue {
  private price = 0
}
</script>

input μš”μ†Œμ— type=number λ₯Ό μ‚¬μš©ν•˜λ”λΌλ„ λ°”μΈλ”©λœ 값은 λ¬Έμžμ—΄ νƒ€μž…μœΌλ‘œ λ³€ν™˜λ©λ‹ˆλ‹€.

.number μˆ˜μ‹μ–΄λ₯Ό μ‚¬μš©ν•˜λ©΄ λ°”μΈλ”©λœ 값을 μˆ«μžν˜•μœΌλ‘œ λ³€ν™˜ν•˜μ—¬ λ™κΈ°ν™”ν•©λ‹ˆλ‹€.

λ•Œλ¬Έμ— μˆ«μžν˜• 값을 μž…λ ₯ λ°›μ•„μ•Ό ν•  λ•Œ λ³„λ„λ‘œ ν˜•λ³€ν™˜ μ½”λ“œλ₯Ό 좔가해주지 μ•Šμ•„λ„ λœλ‹€λŠ” μž₯점이 μžˆμŠ΅λ‹ˆλ‹€.

λ§Œμ•½ μœ νš¨ν•˜μ§€ μ•Šμ€ μˆ«μžκ°’μ΄ μž…λ ₯되면 λΉˆλ¬Έμžμ—΄μ΄ ν• λ‹Ήλ©λ‹ˆλ‹€.

.trim

<input v-model.trim="message" />

.trim μˆ˜μ‹μ–΄λ₯Ό μ‚¬μš©ν•˜λ©΄ μžλ™μœΌλ‘œ trim(λ¬Έμžμ—΄ μ–‘ 끝 곡백 제거) 을 μˆ˜ν–‰ν•˜μ—¬ 값을 λ°”μΈλ”©ν•©λ‹ˆλ‹€.

 

πŸ“Œ μ»΄ν¬λ„ŒνŠΈμ— v-model μ‚¬μš©ν•˜κΈ°

μ‚¬μš©μžκ°€ μ •μ˜ν•œ μ»΄ν¬λ„ŒνŠΈμ— v-model 을 μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ”

v-model 의 λ™μž‘ 방식에 λŒ€ν•΄μ„œ μ‚΄νŽ΄λ³Ό ν•„μš”κ°€ μžˆμŠ΅λ‹ˆλ‹€.

v-model 은 기본적으둜 input μ΄λ²€νŠΈμ™€ value 속성값을 μ΄μš©ν•΄μ„œ κ΅¬ν˜„λ©λ‹ˆλ‹€.

λ”°λΌμ„œ λ‹€μŒκ³Ό 같은 v-model 선언은 사싀..

<input v-model="message" />

λ‹€μŒκ³Ό λ™μΌν•œ μ½”λ“œμž…λ‹ˆλ‹€.

<input v-bind:value="message" v-on:input="value = $event.target.value">

λ”°λΌμ„œ μ»΄ν¬λ„ŒνŠΈμ— v-model 을 μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” κ°’μ˜ 동기화에 μ‚¬μš©λ  event 와

값을 동기화할 value λ₯Ό μ§€μ •ν•˜λ©΄ λ©λ‹ˆλ‹€.

Vue μ—μ„œλŠ” 이λ₯Ό μœ„ν•΄ model 속성을 μ œκ³΅ν•˜λ©° vue-property-decorator λ₯Ό μ‚¬μš©ν•  경우

@Model λ°μ½”λ ˆμ΄ν„°λ₯Ό μ‚¬μš©ν•˜λ©΄ λ©λ‹ˆλ‹€.

 

πŸ“Œ @Model λ°μ½”λ ˆμ΄ν„° μ‚¬μš© μ˜ˆμ‹œ

vue-property-decorator 둜 앱을 κ°œλ°œμ€‘μ΄λΌλ©΄

@Model λ°μ½”λ ˆμ΄ν„°λ₯Ό μ‚¬μš©ν•΄μ„œ v-model 을 μ •μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

List μ»΄ν¬λ„ŒνŠΈλ₯Ό μƒμ„±ν•˜κ³  각각의 리슀트 ν•­λͺ©μ— 이벀트λ₯Ό λΆ€μ—¬ν•˜μ—¬

ν˜„μž¬ μ„ νƒλœ 이벀트λ₯Ό v-model 둜 좔적할 수 μžˆλ„λ‘ ν•˜λŠ” κ°„λ‹¨ν•œ μ˜ˆμ œμž…λ‹ˆλ‹€.

// List.vue

<template>
  <ul>
    <li @click="onClick(0)">0</li>
    <li @click="onClick(1)">1</li>
    <li @click="onClick(2)">2</li>
  </ul>
</template>

<script lang="ts">
import { Component, Vue, Model, Emit } from 'vue-property-decorator'

@Component({
  name: 'List'
})
export default class List extends Vue {
  @Model('select', { type: Number }) readonly value!: number;

  @Emit('select')
  public onClick(idx: number) {
    return idx
  }
}
</script>
// Index.vue

<template>
  <list v-model="selectedIndex" />
</template>

<script lang="ts">
import { Component, Vue } from 'vue-property-decorator'

import List from '../components/List.vue'

@Component({
  name: 'Index',
  components: { List }
})
export default class Index extends Vue {
  private selectedIndex = 0
}
</script>

 

πŸ“Œ μ°Έκ³  자료

v-model의 λ™μž‘ 원리와 ν™œμš© 방법

Everything You Need to Know About Vue v-model

Using v-model for Two-Way Binding in Vue.js | DigitalOcean

μ»΄ν¬λ„ŒνŠΈ - Vue.js

Vue.js Tutorial - Custom Components with v-model

λ°˜μ‘ν˜•

πŸ’¬ λŒ“κΈ€