[Vue3] V-Model 사용시 Refs와 Definemodel의 차이점

Frog_log·2024년 11월 3일

Vue 3에서는 다양한 반응형 상태 관리 방식이 제공되며, 그중에서도 v-model, ref, 그리고 defineModel은 데이터를 다루는 데 중요한 역할을 합니다. 이 글에서는 각 개념의 역할과 차이점을 설명하고, 각각을 언제 사용하는 것이 적절한지에 대해 다룹니다.

1. V-Model이란?

v-model은 Vue에서 양방향 바인딩을 쉽게 구현하기 위해 사용되는 디렉티브입니다. v-model을 사용하면 HTML 입력 요소와 Vue의 데이터가 자동으로 동기화됩니다. 예를 들어, 사용자가 입력한 텍스트가 Vue의 데이터 속성에 자동으로 반영되고, 반대로 Vue의 데이터 속성이 변경되면 입력 필드에도 즉시 반영됩니다.

<template>
  <input v-model="username" placeholder="사용자 이름을 입력하세요" />
</template>

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

export default {
  setup() {
    const username = ref('');
    return { username };
  },
};
</script>

위 예시에서 v-model을 사용하여 username이란 변수와 "input" 요소의 값을 양방향으로 바인딩합니다. 사용자가 "input" 에 값을 입력하면 username 변수에 즉시 반영됩니다.


[ Vue3 공식 문서에서 제시된 V-model 사용방법 ]


Refs와 DefineModel의 차이점은 무엇인가?

다음은 이 글을 작성하게 된 이유입니다. 공식 문서에서는 Definemodel을 사용하여 model을 형성하고, 이를 바탕으로 html입력요소와 바인딩을 진행하고 있습니다. 하지만, 어떤 경우에 Refs를 사용하고, 어떤 경우에 defineModel()을 통해 model을 정의해야 하는지에 대해 정리하고 싶었습니다.

ref란?

ref는 Vue의 Composition API에서 반응형 상태를 만들기 위해 사용하는 함수입니다. ref로 생성한 변수는 단일 값에 대해 반응형 속성을 가지며, Vue가 그 값을 추적하여 값이 변경될 때마다 컴포넌트를 다시 렌더링합니다. 주로 단일 컴포넌트 내부에서의 상태 관리에 사용됩니다.

ref를 사용하여 입력 필드에 반응형 상태를 설정할 수 있습니다.

defineModel이란?

defineModel은 Vue 3에서 자식 컴포넌트가 부모 컴포넌트로부터 전달받는 데이터를 양방향 바인딩할 수 있도록 하는 함수입니다. 주로 부모와 자식 컴포넌트 간의 데이터 바인딩을 위해 사용되며, 부모가 전달한 데이터를 자식이 수정할 수 있게 합니다.

예를 들어, 부모 컴포넌트에서 v-model을 통해 username을 자식 컴포넌트에 전달하고, 자식 컴포넌트는 defineModel을 통해 이 값을 받을 수 있습니다.

ref와 defineModel의 차이점

  • ref: 주로 단일 컴포넌트 내의 상태 관리에 사용됩니다. 입력 필드의 값을 반응형으로 관리하거나 컴포넌트 내부의 데이터를 바인딩할 때 사용됩니다.

  • defineModel: 주로 부모-자식 컴포넌트 간의 데이터 바인딩을 위해 사용됩니다. 자식 컴포넌트에서 부모의 데이터를 직접 수정해야 할 때 사용하며, v-model을 통해 양방향 바인딩을 제공합니다.

언제 무엇을 사용해야 할까?

단일 컴포넌트 내부에서의 상태 관리가 필요하면 ref를 사용합니다. 예를 들어, 로그인 폼에서 사용자 ID와 비밀번호를 반응형으로 관리하는 경우 ref를 사용하는 것이 적합합니다. 부모-자식 컴포넌트 간의 양방향 바인딩이 필요하다면 defineModel을 사용합니다. 자식 컴포넌트가 부모로부터 받은 데이터를 수정할 필요가 있을 때 유용합니다.

profile
신입 개발자

0개의 댓글