@Sector567

Как сделать реактивность во Vue js?

Код: https://codepen.io/Gabar/pen/vYOgvVp
Суть работы кода такая:
- тыкаем по синему плюсику - рендерится инпут куда мы можем вписать "имя гостя", после этого данное поле отображается в таблице ниже
- тыкаем дважды по заголовку добавленного инпута и поле удаляется

Проблема:
В HTML, на строке 14 вписывание "Имени гостя" реализовано при помощи @input=""
В HTML, на строке 15 реализовано тоже самое, но при помощи v-model=""

Но в случае удаления, возникает проблема с первым способом - в итоговой таблице удаление происходит верно, а вот
в самих инпутах возникает путаница, здесь инпуты удаляются всегда с конца.

Пример:
- Пытаюсь удалить инпут с заголовком Guest 2 и значением 2, тыкая по заголовку 2 раза
- Видим, что в таблице ДВОЙКИ действительно нет (есть только 1 и 3), то есть удаление произошло корректно, но вот сами инпуты отображаются не корректно, а именно Guest 2 не исчез, а вместо него исчез Guest 3
5e54e56a47a3f020432545.png
5e54e57387d46918983530.png

Вопрос:
Почему так произошло и как это исправить?
P.S. если вместо @input="" на 14 строке использовать v-model="" из 15 строки, то все будет работать корректно.
  • Вопрос задан
  • 137 просмотров
Решения вопроса 2
groog
@groog
Я только учусь
Так вы же не привязываете входные значения вот они и не подставляются. Вот так все работает.
<input type="text" class="form-control" @input="onInput(index, $event)"  :value="guests[index]">

А в чем проблема с v-model? Почему не через него?

Произошло это потому, что vue минимизирует изменения в DOM, а вы никак не указали, что вам нужно именно это поле. Решения 2: либо как я выше указал, задавать значение для поля, либо использовать уникальные ключи
Ответ написан
Kozack
@Kozack Куратор тега Vue.js
Thinking about a11y
Проблема тут вот в чем:
У вас есть массив
['1', '2', '3']

Они так и выводятся
5e54e92f80bba605469646.png

Затем вы удаляете элемент под индексом 1
['1', '3']
Ниже в таблице выводятся эти числа так, как вы и ожидаете.

Но! После удаления, значение "3" находится под индексом "1". От сюда, и ваш label — Guest {{ index + 1 }} = Guest 2
А значение в поле не обновляется, потому что вы не привязали значение данных к полю — :value="name"

5e54ea4f0750d068321823.png

Собственно v-model это короткий формат записи :value="value" @input="value = newValue"

Рабочий вариант + строка для теста:
<input type="text" class="form-control" @input="onInput(index, $event)" :value="name">
Guest name: {{name}}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы