Grace
grace's dev_note
Grace
전체 방문자
오늘
어제
  • 분류 전체보기
    • FrontEnd
      • Next.js
      • React
      • ReactNativ..
      • Vue
    • Javascript
      • 러닝 자바스크립트
      • 모던 자바스크립트
    • CS
    • DataScienc..
      • Data Struc..
      • LeetCode
    • BackEnd
      • Express
      • Node.js
      • Nest.js
    • DevOps
      • Docker
    • 매일메일
    • 회고
    • 코드캠프

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • React Native
  • vue-query
  • nest.js
  • node.js
  • 자바스크립트
  • backend
  • 함수
  • vitejs
  • 번들러
  • 알고리즘
  • postgres
  • Vite
  • Express
  • PostgreSQL
  • tanstack
  • pinia
  • Vue3
  • Vue.js
  • javascript
  • Vue

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Grace

grace's dev_note

FrontEnd/Vue

[Vue3] v-model props

2023. 4. 20. 16:21

props는 read-only reactive object입니다.
즉, 조회만 가능한 반응형 객체이며, computed 같은 반응성 체크는 가능하지만 props를 직접 수정하는 것은 불가능합니다.

v-model을 props로 사용해주기 위해서 vue3는 내부적으로 v-model의 양방향 바인딩을 단방향 바인딩으로 캐스팅해줍니다.

<script setup>
import { ref } from 'vue'

const value = ref()
<script>

<template>
<Child v-model="value" />
<template>

위의 코드에서 우리는 Child라는 자식 컴포넌트에 v-model을 바인딩(props 사용)해주고 싶습니다. 이 때, 다른 props를 넘겨주는 것처럼 변수값을 넘겨주는 것이 아니라 단순히 v-model을 사용하는 것처럼 그대로 사용해주면 해당 코드는 아래와 같이 컴파일러에 의해 변환됩니다.

<Child
  :modelValue="value"
  @update:modelValue="newValue => value = newValue"
/>

자식 컴포넌트에서는 이를 사용해주기 위해 아래와 같이 구현해주어야 합니다.

<script setup>
defineProps(['modelValue'])
defineEmits(['update:modelValue'])
</script>

<template>
<input
  :value="modelValue"
  @input="$emit('update:modelValue', $event.target.value)"
/>
</template>

혹은 아래와 같이 computed를 사용해 직접 반응형 객체를 만들어 v-model을 바인딩 할 수도 있습니다.

<script setup>
import { computed } from 'vue'

const props = defineProps(['modelValue'])
const emit = defineEmits(['update:modelValue'])

const value = computed({
  get() {
    return props.modelValue
  },
  set(value) {
    emit('update:modelValue', value)
  }
})
</script>

<template>
  <input v-model="value" />
</template>

참고: https://vuejs.org/guide/components/v-model.html

저작자표시 비영리 변경금지 (새창열림)

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

[Vue-Query] useQuery  (0) 2023.04.20
[Vue-Query] @tanstack/vue-query  (0) 2023.04.20
[Vue] Vue-Daum-Postcode  (0) 2023.04.18
[Pinia] Actions  (0) 2023.04.18
[Pinia] Getters  (0) 2023.04.18
    'FrontEnd/Vue' 카테고리의 다른 글
    • [Vue-Query] useQuery
    • [Vue-Query] @tanstack/vue-query
    • [Vue] Vue-Daum-Postcode
    • [Pinia] Actions
    Grace
    Grace
    기술 및 회고 블로그

    티스토리툴바