Настройка сценария vue 3 связывает v-модель с несколькими флажками дочернего пользовательского компонента

Я просмотрел много примеров того, как выполнить двустороннюю привязку данных модели, но примеры с текстовым вводом встречаются повсюду. Работаю по той же схеме и получаю ошибки.

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 модели (не одна), которые связаны в родительском компоненте.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
262
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Похоже, это проблема с типом данных 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}"

Нет. Это не работает.

Сергей 16.09.2022 21:31
Ответ принят как подходящий

Когда вы испускаете $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 Это моя цель.

Сергей 16.09.2022 21:31

насколько я знаю, вы не можете упростить намного больше, чем это, когда v-модель прикреплена к пользовательскому компоненту. Вы должны привязать входное значение, и вы должны использовать излучение. v-модель с примитивными значениями определенно проще в обращении, но объекты и массивы требуют больше специальной работы.

yoduh 16.09.2022 21:57

Пожалуйста! Если ваша проблема решена, отметьте ответ как правильный. Спасибо!

yoduh 17.09.2022 00:15

Другие вопросы по теме