Vue Study

Vue3 - v model

eddie0329 2020. 11. 8. 15:08
λ°˜μ‘ν˜•

πŸ“Œ λͺ©μ°¨

  • Introduction
  • v-model(value, event)
  • v-model argument
  • mutilple v-model
  • Conclusion
  • Reference

πŸ“Œ Introduction

μ•ˆλ…•ν•˜μ„Έμš”. vue3μ—μ„œ v-model에 μƒˆλ‘œμš΄ κΈ°λŠ₯듀이 μžˆμ–΄μ„œ μ΄λ ‡κ²Œ ν¬μŠ€νŒ…μ„ μž‘μ„±ν•˜κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€. ν•΄λ‹Ή μ½”λ“œλŠ” μ—¬κΈ°μ„œν™•μΈ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ“Œ v-model(value, event)

μƒˆλ‘­κ²Œ 바뀐 vue3μ—μ„œλŠ” 이제 props둜 value와 input 이벀트둜 v-model을 μ‚¬μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

value -> model-value
@input -> @update:model-value

둜 λ°”λ€Œμ—ˆμŠ΅λ‹ˆλ‹€.

<template>
  <input type="text" :value="modelValue" @input="onInput" />
</template>

<script>
export default {
  props: {
    modelValue: {
      type: String,
      default: ""
    }
  },
  methods: {
    onInput(e) {
      this.$emit('update:model-value', e.target.value);
    }
  }
}
</script>

πŸ“Œ v-model argument

<template>
  <MyName v-model:first-name="name"/>
</template>

μ΄λŸ°μ‹μœΌλ‘œ name을 μ§€μ •ν•΄ 쀄 수 μžˆμŠ΅λ‹ˆλ‹€.

// MyName.vue
<template>
  <input type="text" :value="firstName" @input="onInputFirstName">
</template>

<script>
export default {
  props: {
    firstName: {
      type: String,
      default: ''
    }
  },
  methods: {
    onInputFirstName(e) {
      this.$emit('update:first-name', e.target.value);
    }
  }
}

그럼 propsλ‘œλŠ” modelValue둜 λ‚΄λ €μ˜€λŠ”κ²ƒμ΄ μ•„λ‹Œ μ§€μ •λœ name으둜 λ‚΄λ €μ˜€κ²Œ λ©λ‹ˆλ‹€. λ˜ν•œ update도 μ§€μ •λœ μ΄λ¦„μœΌλ‘œ updateλ₯Ό 해쀄 수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ“Œ mutiple v-model

μœ„μ—μ„œ 배운 v-model μ§€μ •μœΌλ‘œ 이제 μ—¬λŸ¬κ°œμ˜ v-model을 받을 수 μžˆμŠ΅λ‹ˆλ‹€.

<template>
  <MyName v-model:first-name="name" v-model:last-name="lastName"/>
</template>
<template>
  <input type="text" :value="firstName" @input="onInputFirstName">
  <input type="text" :value="lastName" @input="onInputLastName">
</template>

<script>
export default {
  props: {
    firstName: {
      type: String,
      default: ''
    },
    lastName: {
      type: String,
      default: ''
    }
  },
  methods: {
    onInputFirstName(e) {
      this.$emit('update:first-name', e.target.value);
    },
    onInputLastName(e) {
      this.$emit('update:last-name', e.target.value);
    }
  }
}
</script>

πŸ“Œ Conclusion

μ΄λ²ˆμ—λŠ” v-model에 λŒ€ν•΄μ„œ μ•Œμ•„λ³΄μ•˜μŠ΅λ‹ˆλ‹€. vue2와 λ§Žμ€ λ³€ν™”κ°€ μžˆμ§€λŠ” μ•Šμ§€λ§Œ μƒˆλ‘œμš΄ κΈ°λŠ₯듀이 μΆ”κ°€λ˜μ–΄ ν¬μŠ€νŒ…μ„ μž‘μ„±ν•˜κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€. 항상 v-model은 μ™œ ν•œκ°œμ—¬μ•Όν• κΉŒ λΌλŠ” 의문이 μžˆμ—ˆλŠ”λ° μ΄λ ‡κ²Œ λ˜μ–΄ λ„ˆλ¬΄ λ°˜κ°€μ› μŠ΅λ‹ˆλ‹€. 그럼 λ‹€μŒ ν¬μŠ€νŒ…μ—μ„œ λ§Œλ‚˜μš”!

πŸ“Œ Reference

λ°˜μ‘ν˜•