Parent Component ile Child Component arasında v-model ilişkisi kurmak

VueJS’te componentler arasında iletişim kurmanın onlarca yolu var. v-model bu yollardan oldukça kullanışlı olanı. HTML inputlardaki bilgileri reaktif bir şekilde yakalamak için v-model kullanarak ‘two way binding’ kurarız. Peki HTML input dışında kendi oluşturduğumuz componentle de v-model ile iletişim kurabilir miyiz, evet.

Safa Gayret

--

Senaryo gereği, tüm HTML inputları sarmalayan bir Child Componente ihtiyacımız olsun. Örnek olması amacıyla Parent’ta input kullanacağımız zaman, klasik HTML input kullanmak yerine kendi oluşturduğumuz <child /> elementini kullanmayı arzu ediyoruz.

Canlı demo: https://vue-parent-child-component-vmodel.netlify.app/

GitHub repo: https://github.com/gayret/vue-parent-child-component-vmodel

Hadi başlayalım

Öncelikle components klasörü altında Child.vue adlı bir dosya oluşturalım.

VueJS, parent componentle iletişim kuracak child componentin modelValue adında bir prop bekliyor olmasını istiyor. modelValue adlı prop üst componentte v-model ile bağlanmış state ile doğrudan ilişki kurabiliyor.

Child.vue<script setup>
const props = defineProps({
modelValue: String,
})
</script>

Yakaladığımız bu prop ile Child.vue içerisinde oluşturacağımız reaktif state’i ilişkilendirelim.

const value = ref(props.modelValue)

value adlı state’imizi template içerisindeki bir input’la two way binding yapalım.

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

Böylece Child.vue içerisindeki input, modelValue adlı prop’taki bilgiyle eşitlendi. Ancak henüz bu input içerisindeki bilginin değişimini Parent Component’e iletmiyoruz. Input’taki her değişimi takip etmek için VueJS’in watch reserved fonksiyonunu kullanabileceğimiz gibi, input’a @input eventListener’ı da ekleyerek aynı sonuca ulaşabiliriz. Bu örnekte watch ile yapıyorum.

Input’taki her değişimi Parent’a dağıtmanın tek yolu emit etmek. Bunun için emit fonksiyonunu define edelim. update:modelValue Parent Component tarafından otomatik olarak yakalanır.

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

Artık watch ile her değişimi Parent Component’e dağıtabiliriz.

watch(value, (newVal) => {
emit('update:modelValue', newVal)
})

Hepsi bu kadar, oluşturduğumuz Child adlı Component’i herhangi bir Component içerisine import edip v-model ile iletişim kurdurabiliriz.

Parent.vue<child v-model="someThing" />

GitHub repo: https://github.com/gayret/vue-parent-child-component-vmodel

--

--