Я просмотрел много примеров того, как выполнить двустороннюю привязку данных модели, но примеры с текстовым вводом встречаются повсюду. Работаю по той же схеме и получаю ошибки.
const models = ref({
teams: {
items: usePage().props.value.teams,
selected: [],
isCheckAll: false,
},
});
<template>
<LineTeamsIndex
v-model:selected-items = "models.teams.selected"
v-model:isCheckAll = "models.teams.isCheckAll"
:teams = "$page.props.teams"
@checkAll = "checkAll"
>
</LineTeamsIndex>
</template>
ребенок
<script setup>
defineEmits(["update:selectedItems", "update:isCheckAll", "checkAll"]);
const props = defineProps({
teams: Object,
selectedItems: Object,
isCheckAll: Boolean,
});
</script>
<template>
<template v-slot:body>
<tr v-for = "team in $page.props.teams.data" :key = "team.id">
<td>
<div class = "form-check font-size-16">
<input
:id = "team.id"
:value = "team.id"
:checked = "selectedItems.includes(team.id)"
@change = "
$emit(
'update:selectedItems',
$event.target.value
)
"
class = "form-check-input"
type = "checkbox"
/>
</div>
</td>
<td>{{ team.id }}</td>
<td>
{{ team.name }}
</td>
</tr>
</template>
</template>
Вот часть кода, относящаяся к массиву SelectedItems. Требуется двусторонняя привязка через встроенную v-модель. Но это либо не работает, либо я получаю сообщение об ошибке несоответствия данных "[Vue warn]: Invalid prop: проверка типа не удалась для prop "SelectedItems". Ожидаемый объект, получена строка со значением "88"". Подскажите, как правильно перенести (использовать) встроенную v-model vue 3 для добавления данных в массив и удаления с помощью лаконичного кода? При том, что в дочернем компоненте у меня 2 модели (не одна), которые связаны в родительском компоненте.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Похоже, это проблема с типом данных prop. Вы говорите, что selectedItems должен быть Javascript Object, когда передаете его в качестве реквизита, но вместо этого вы передаете String.
Либо измените ожидаемый тип данных:
defineEmits(["update:selectedItems", "update:isCheckAll", "checkAll"]);
const props = defineProps({
teams: Object,
selectedItems: String, // This is changed to 'String'
isCheckAll: Boolean,
});
или вместо этого передать значение как объект:
v-model:selected-items = "{slectedItems: models.teams.selected}"
Когда вы испускаете $event.target.value, это строковое значение флажка (равное team.id), но v-модель — это массив, и вы не можете присвоить строку массиву. Вместо этого вам нужно создать массив со всеми значениями флажков, которые должна содержать v-модель.
Вместо того, чтобы испускать из шаблона, вызовите метод на @change:
<input
:id = "team.id"
:value = "team.id"
:checked = "selectedItems.includes(team.id)"
@change = "updateSelection($event.target.value)"
class = "form-check-input"
type = "checkbox"
/>
В методе сделайте неглубокую копию массива реквизита. Нажмите или соедините обновленное значение флажка с/из массива. Отправьте этот массив вместе с вашим событием @update:selectedItems. Я также включил один способ обновления isCheckAll v-модели.
const updateSelection = checkboxVal => {
const selectedItemsCopy = [...props.selectedItems];
const index = selectedItemsCopy.indexOf(checkboxVal);
if (index !== -1) {
selectedItemsCopy.splice(index, 1);
} else {
selectedItemsCopy.push(checkboxVal);
}
emit('update:selectedItems', selectedItemsCopy);
if (selectedItemsCopy.length === props.teams.data.length) {
emit('update:isCheckAll', true);
} else {
emit('update:isCheckAll', false);
}
};
Привет. Спасибо. Но можно ли это сделать простыми способами, без написания собственных функций? Дело в том, что вы можете написать свою функцию и привязать ее к событию. В хелпе показан простой способ без написания отдельного кода для функций-обработчиков, используется только привязка v-model и назначается массив. vuejs.org/guide/essentials/forms.html#checkbox Это моя цель.
насколько я знаю, вы не можете упростить намного больше, чем это, когда v-модель прикреплена к пользовательскому компоненту. Вы должны привязать входное значение, и вы должны использовать излучение. v-модель с примитивными значениями определенно проще в обращении, но объекты и массивы требуют больше специальной работы.
Пожалуйста! Если ваша проблема решена, отметьте ответ как правильный. Спасибо!
Нет. Это не работает.