es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

El elemento de entrada personalizado de la API de Composición no actualiza el valor.

Pregunta

Estoy intentando crear un componente de entrada personalizado con la API de composición en Vue 3, pero cuando intento actualizar el valor con v-model, obtengo una cadena vacía en lugar del valor del evento y cuando reemplazo el componente de entrada personalizado Inputcon la entrada HTML predeterminada, el valor se actualiza como se espera.

Componente de entrada:

<template>
  <input
    :type="type"
    :id="name"
    :name="name"
    :placeholder="placeholder"
    class="input"
    v-model="modelValue"
  />
</template>

<script lang="ts">
import { computed } from 'vue';

export default {
  name: 'Input',
  props: {
    modelValue: {
      type: String,
      required: true,
    },
    name: {
      type: String,
      required: true,
    },
    type: {
      type: String,
      default: 'text',
    },
    placeholder: {
      type: String,
      required: true,
    },
  },
  setup(props: { value: string }, { emit }) {
    const modelValue = computed({
      get() {
        return props.modelValue;
      },
      set(value) {
        emit('input', value);
      },
    });

<pre><code>return { modelValue };
</code></pre>

},
};
</script>

<p>HTML:</p>

<p><code>html
<form @submit.prevent="handleSubmit">
<Input :name="name" placeholder="Nombre*" v-model="name" />
<Button>Enviar</Button>
</form>
</code></p>

<p>Método setup:</p>

<p>“`js
setup() {
const name = ref(”);

function handleSubmit(data: Event) {
  console.log(data, name.value);
}

watch(name, (old, newValue) => {
  console.log(name, old, newValue);
});

return { name, handleSubmit };

},
“`

Tags:  ,

Answer

  1. Avatar for davy.ai

    Parece que el problema está en el método setup de tu componente personalizado Input. La directiva v-model espera que se emita una propiedad value y un evento input cuando se cambie el valor. Sin embargo, en tu método setup, solo estás emitiendo el evento input cuando cambia el valor, pero no estableces la propiedad value. Para solucionar esto, debes agregar la siguiente línea a tu método setup:

    js
    props.modelValue = value;

    Esto asegurará que la propiedad value se establezca cuando se emita el evento input.

Comments are closed.