Vuetify und Vue.js: v-radio-group übernimmt modelValue nach Toggle nicht

5. November 2023 von Michael Nissen · 

Die Situation

Für eine Web-App unter anderem zur Erfassung von Fragebögen setze ich in einem Kundenprojekt auf Vue.js und Vuetify in Verbindung mit vee-validate.

Im Fragebogen gibt es mehrere Fragen, die dieselbe Struktur nutzen. Sinnvollerweise kommt dann eine Komponente zum Einsatz, die einfach mit Copy-Paste wiederverwendet werden kann:

<Question>Wie leicht/schwer war es normalerweise für Sie, eine Vertretung für einen Abend zu finden?</Question>
<EasynessRadio v-model="vertretung_kurz.value.value" :error-messages="vertretung_kurz.errorMessage.value" />

<Question>Wie leicht/schwer war es normalerweise für Sie, eine Vertretung für einen Urlaub zu finden?</Question>
<EasynessRadio v-model="vertretung_urlaub.value.value" :error-messages="vertretung_urlaub.errorMessage.value" />

Die dazugehörige Komponente sieht so aus:

<script setup>
const props = defineProps(['modelValue', 'errorMessages'])
const emit = defineEmits(['update:modelValue'])
</script>

<template>
    <v-radio-group :value="modelValue" @input="$emit('update:modelValue', $event.target.value)" :error-messages="errorMessages">
        <v-radio value="sehr_einfach" label="sehr einfach"></v-radio>
        <v-radio value="eher_einfach" label="eher einfach"></v-radio>
        <v-radio value="weder_noch" label="weder leicht noch schwer"></v-radio>
        <v-radio value="eher_schwer" label="eher schwer"></v-radio>
        <v-radio value="sehr_schwer" label="sehr schwer"></v-radio>
        <v-radio value="unmöglich" label="unmöglich"></v-radio>
    </v-radio-group>
</template>

Das Problem

Der Fragebogen besteht aus mehreren Seiten. Wurde eine Seite aufgerufen und ging der Nutzer dann zurück zur Vorseite, waren die jeweiligen Radio Buttons nicht mehr angehakt. Die jeweiligen Fragen wurden dabei nicht nur mit v-show ausgeblendet, sondern mit v-if aus dem DOM entfernt. Die entsprechenden Fragebogen-Werte waren allerdings weiterhin vorhanden. Nur v-radio-group hat die "Standardwerte" nicht mehr übernommen.

Die Lösung

Vuetify verwendet eine leicht andere Syntax als Vue.js. Gemäß der Vue.js-Dokumentation wird v-model für eigene Komponenten so übergeben:

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

Für Vuetify und insbesondere die radio-group sowie radio-Komponenten muss das Ganze aber so aussehen:

<v-radio-group :model-value="modelValue" @update:modelValue="$emit('update:modelValue', $event)" :error-messages="errorMessages">

Es muss also:

  • :model-value statt :value
  • @update:modelValue="$emit('update:modelValue', $event)"

verwendet werden.

Weitere Hinweise dazu gibt es in diesem Stackoverflow-Thread.

Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Sie haben Fragen oder möchten ein Angebot anfordern?

Jetzt Kontakt aufnehmen
crosslist