# Vinculación de Entradas de Formularios
# Uso Básico
Puede utilizar la directiva v-model
para crear vinculaciones de datos de doble direcciones (two-way data binding) en elementos input, textarea y select de un formulario. La directiva busca automáticamente la manera correcta de actualizar el elemento según el tipo de entrada. Aunque un poco mágico, v-model
es esencialmente azúcar de sintaxis para actualización de datos a través de eventos de entradas del usuario, además de mostrar un cuidado especial para algunos casos de borde.
Note
v-model ignorará los atributos iniciales de value
, checked
o selected
encontrados en cualquier elemento de formulario, Siempre tratará los datos de la actual instancia activa como la fuente de verdad. Debería declarar el valor inicial del lado de JavaScript, dentro de la opción data
de su componente.
v-model
internamente utiliza propiedades distintas y emitir eventos distintos para distintos elementos de entrada:
- Los elementos de texto y textarea utilizan propiedad
value
y eventoinput
; - checkbox y radio utilizan propiedad
checked
y eventochange
; - Los campos de select utilizan propiedad
value
y eventochange
.
Note
Para los idiomas que requieren un IME (opens new window) (chino, japonés, coreano, etc.), notará que el v-model
no se actualiza durante la composición del IME. Si también desea responder a estas actualizaciones, utilice un escuchador de evento input
y la vinculación de value
en vez de utilizar v-model
.
# Texto
<input v-model="message" placeholder="edit me" />
<p>El mensaje es: {{ message }}</p>
2
See the Pen Manejar formularios: básicos sobre v-model by Vue (@Vue) on CodePen.
# Textos Multilínea
<span>El mensaje multilínea es:</span>
<p style="white-space: pre-line;">{{ message }}</p>
<br />
<textarea v-model="message" placeholder="introducir múltiples líneas"></textarea>
2
3
4
See the Pen Manejar formularios: textarea by Vue (@Vue) on CodePen.
Interpolación sobre textarea no funcionará. Utilice v-model
en su lugar.
<!-- mal -->
<textarea>{{ text }}</textarea>
<!-- bien -->
<textarea v-model="text"></textarea>
2
3
4
5
# Checkbox
Un solo checkbox con valor booleano:
<input type="checkbox" id="checkbox" v-model="checked" />
<label for="checkbox">{{ checked }}</label>
2
See the Pen Manejar formularios: checkbox by Vue (@Vue) on CodePen.
Múltiples checkbox, vinculados a la misma matriz:
<div id="v-model-multiple-checkboxes">
<input type="checkbox" id="jack" value="Jack" v-model="checkedNames" />
<label for="jack">Jack</label>
<input type="checkbox" id="john" value="John" v-model="checkedNames" />
<label for="john">John</label>
<input type="checkbox" id="mike" value="Mike" v-model="checkedNames" />
<label for="mike">Mike</label>
<br />
<span>Nombres marcados: {{ checkedNames }}</span>
</div>
2
3
4
5
6
7
8
9
10
Vue.createApp({
data() {
return {
checkedNames: []
}
}
}).mount('#v-model-multiple-checkboxes')
2
3
4
5
6
7
See the Pen Manejar formularios: múltiples checkbox by Vue (@Vue) on CodePen.
# Radio
<div id="v-model-radiobutton">
<input type="radio" id="one" value="One" v-model="picked" />
<label for="one">One</label>
<br />
<input type="radio" id="two" value="Two" v-model="picked" />
<label for="two">Two</label>
<br />
<span>Picked: {{ picked }}</span>
</div>
2
3
4
5
6
7
8
9
Vue.createApp({
data() {
return {
picked: ''
}
}
}).mount('#v-model-radiobutton')
2
3
4
5
6
7
See the Pen Manejar formularios: radio by Vue (@Vue) on CodePen.
# Select
Un solo select:
<div id="v-model-select" class="demo">
<select v-model="selected">
<option disabled value="">Seleccione una opción por favor:</option>
<option>A</option>
<option>B</option>
<option>C</option>
</select>
<span>Seleccionado: {{ selected }}</span>
</div>
2
3
4
5
6
7
8
9
Vue.createApp({
data() {
return {
selected: ''
}
}
}).mount('#v-model-select')
2
3
4
5
6
7
See the Pen Manejar formularios: select by Vue (@Vue) on CodePen.
Note
Si el valor inicial de su expresión v-model
no coincide con ninguna de las opciones, el elemento <select>
se renderizará en un estado “no seleccionado”. En iOS, esto hará que el usuario no pueda seleccionar el primer elemento porque iOS no dispara un evento de cambio en este caso. Por lo tanto, se recomienda proporcionar una opción deshabilitada con un valor vacío, como se muestra en el ejemplo anterior.
Selección de múltiples elementos (vinculados a una matriz):
<select v-model="selected" multiple>
<option>A</option>
<option>B</option>
<option>C</option>
</select>
<br />
<span>Seleccionado: {{ selected }}</span>
2
3
4
5
6
7
See the Pen Manejar formularios: selección de múltiples elementos vinculados a una matriz by Vue (@Vue) on CodePen.
Opciones dinámicas renderizadas con v-for
:
<div id="v-model-select-dynamic" class="demo">
<select v-model="selected">
<option v-for="option in options" :value="option.value">
{{ option.text }}
</option>
</select>
<span>Seleccionado: {{ selected }}</span>
</div>
2
3
4
5
6
7
8
Vue.createApp({
data() {
return {
selected: 'A',
options: [
{ text: 'Uno', value: 'A' },
{ text: 'Dos', value: 'B' },
{ text: 'Tres', value: 'C' }
]
}
}
}).mount('#v-model-select-dynamic')
2
3
4
5
6
7
8
9
10
11
12
See the Pen Manejar formularios: select con opciones dinámicas by Vue (@Vue) on CodePen.
# Vinculación de Valor
Para opciones de radio, checkbox y select, los valores vinculados de v-model
son usualmente cadenas de caracteres estáticas (o booleanos para checkbox):
<!-- `picked` es una cadena de caracteres "a" cuando está chequeado -->
<input type="radio" v-model="picked" value="a" />
<!-- `toggle` es o `true` o `false` -->
<input type="checkbox" v-model="toggle" />
<!-- `selected` es una cadena de caracteres "abc" cuando se selecciona la primera opción -->
<select v-model="selected">
<option value="abc">ABC</option>
</select>
2
3
4
5
6
7
8
9
10
Pero a veces es posible que queramos vincular el valor a una propiedad dinámica en la actual instancia activa. Podemos utilizar v-bind
para lograrlo. Además, el uso de v-bind
nos permite vincular el valor de entrada a valores que no son cadenas de caracteres.
# Checkbox
<input type="checkbox" v-model="toggle" true-value="yes" false-value="no" />
// cuando está marcado:
vm.toggle === 'yes'
// cuando está desmarcado:
vm.toggle === 'no'
2
3
4
Tip
Los atributos de true-value
y de false-value
no afectan el atributo value
del la entrada, ya que los navegadores no incluyen checkbox desmarcados en los envíos de formularios. Para garantizar que uno de los dos valores se envie en un formulario (por ejemplo, “yes” o “no”), use entradas de radio en su lugar.
# Radio
<input type="radio" v-model="pick" v-bind:value="a" />
// cuando está marcado:
vm.pick === vm.a
2
# Select
<select v-model="selected">
<!-- objeto literal en línea -->
<option :value="{ number: 123 }">123</option>
</select>
2
3
4
// cuando está seleccionado:
typeof vm.selected // => 'object'
vm.selected.number // => 123
2
3
# Modificadores
# .lazy
Por defecto, v-model
sincroniza la entrada con los datos después de cada evento input
(con la excepción de la composición IME descrito anteriormente). En lugar de esto, puede agregar el modificador lazy
para realizar la sincronización después del evento change
:
<!-- sincronizado después de "change" en lugar de "input" -->
<input v-model.lazy="msg" />
2
# .number
Si desea que la entrada del usuario se convierten automáticamente en un número, puede agregar el modificador number
al v-model
de la entrada manejada:
<input v-model.number="age" type="text" />
Esto suele ser útil cuando el tipo de la entrada es text
. Si el tipo es number
, Vue puede automáticamente convertir el valor de la cadena de caracteres original a un número, así no necesita agregar el modificador .number
al v-model
. Si el valor no se puede analizar con parseFloat()
, se retorna el valor original.
# .trim
Si desea que las entradas del usuario se recorten automáticamente, puede agregar el modificador trim
al v-model
de la entrada manejada:
<input v-model.trim="msg" />
# v-model
con Componentes
Si aún no está familiarizado con los componentes de Vue, puede omitir esto por ahora.
Los tipos de entradas nativas de HTML no siempre satisfarán sus necesidades. Afortunadamente, los componentes de Vue le permiten crear entradas reutilizables con un comportamiento completamente personalizado. ¡Estos componentes también funcionan con v-model
! Para aprender más, lea acerca de entradas personalizadas en la guía de componentes.