Considere el siguiente código:
<div id="demo">
<select v-model="selected" number>
<option v-for="opt in options" :value="$index" number>{{opt}}</option>
</select>
</div>
En <select>
, el valor de cada opción está vinculado con $index
. Si realizamos splice()
en options
, como options.splice(0,1)
, $index
no se sincroniza correctamente con las opciones.
Por ejemplo, dejemos que options=['a','b']
y el HTML renderizado se vea como (pero no realmente):
<div id="demo">
<select selectedIndex="0">
<option value="0">a</option>
<option value="1">b</option>
</select>
</div>
Después de options.splice(0,1)
, luego options=['b']
, pero el HTML renderizado se convierte en:
<div id="demo">
<select selectedIndex="0">
<option value="1">b</option>
</select>
</div>
El valor de la opción 'b' no se convierte en 1, que debería ser 0 debido a $index
. Puede que esto no sea un error, pero es un poco extraño.
A continuación se muestra la demostración en vivo de este problema:
https://jsfiddle.net/peteranny/trwp98g9/4/
Simplemente agregue un atributo seleccionado en su plantilla selected="{{$index == selected}}"
Actualizo la demostración aquí https://jsfiddle.net/trwp98g9/5/
@peteranny ¿Puedes aclarar cuál fue el comportamiento esperado?
Después de options.splice (0,1), entonces options = ['b'], pero el HTML renderizado se convierte en:
<option value="1">b</option>
No obtengo el mismo resultado que el que proporcionó desde aquí:
Antes de hacer clic en eliminar:
Después de hacer clic:
El valor de la opción 'b' no se convierte en 1, que debería ser 0 debido a $ index
Entonces, ¿en qué debería convertirse exactamente? El valor de 'b' era 1 antes de hacer clic y se convirtió en 0 después de hacer clic.
@fnlctrl Um, gracias por su prueba. Creo que hice la pregunta incorrecta.
Según sus pruebas, el valor de 'b' se convirtió en 0 después de hacer clic.
Mi verdadera pregunta es: ahora que el valor de 'b' era 0, ¿por qué <select>
no seleccionó 'b' de todos modos?
Como se ve en su imagen, <select>
no seleccionó ninguna opción, mientras que <select>
debe seleccionar la opción con el valor 0.
(Y es por eso que supuse que el valor de 'b' no cambió).
@peteranny Puede ser un error porque selected
permaneció 0 mientras que options
cambió, y se supone que el dom debe reflejar este cambio, pero no estoy seguro.
Por ahora, puede intentar agregar selected
prop como sugirió @defcc , (tenga en cuenta que el enlace de bigote para props / attrs está obsoleto en 2.0, así que use :selected="$index == selected"
lugar)
O puede agregar un track-by
prop a <options>
, lo que probablemente hizo que vue pensara que es seguro actualizar el valor seleccionado en dom. https://jsfiddle.net/74ncq90w/
Probado en 2.0 y funcionó como se esperaba: https://jsfiddle.net/dycmgzcm/
Así que estoy marcando esto como un error de 1.x
Cerrar los problemas de 1.x como 1.x ahora está al final de su vida útil y solo recibirá parches de seguridad críticos.
Comentario más útil
Probado en 2.0 y funcionó como se esperaba: https://jsfiddle.net/dycmgzcm/
Así que estoy marcando esto como un error de 1.x