Задание 2: Реализовать добавление нового элемента (займа) в список (loan list) — при отправке формы должны передаваться значения amount и type, наверх эмитится событие с данными, родительский компонент добавляет новый объект (с id, amount, type) в массив, после чего форма сбрасывается (очищается).

Форма хранит amount/type, эмитит проверенные значения, а родитель создаёт id и добавляет запись. Ниже пример Vue 3 с локальным списком.

Короткий ответ

Что ответить на собеседовании

Форма хранит amount/type, эмитит проверенные значения, а родитель создаёт id и добавляет запись. Ниже пример Vue 3 с локальным списком.

Подробный разбор

Ответ с пояснениями

Форма хранит amount/type, эмитит проверенные значения, а родитель создаёт id и добавляет запись. Ниже пример Vue 3 с локальным списком.

Компонент LoanForm.vue:

<script setup>
import { ref } from 'vue';
const emit = defineEmits(['add']);
const amount = ref('');
const type = ref('');
const submit = () => {
  const value = Number(amount.value);
  const kind = type.value.trim();
  if (!Number.isFinite(value) || value <= 0 || !kind) return;
  emit('add', { amount: value, type: kind });
  amount.value = '';
  type.value = '';
};
</script>
<template>
  <form @submit.prevent="submit">
    <input v-model="amount" type="number" step="any" required aria-label="Сумма">
    <input v-model="type" required aria-label="Тип">
    <button>Добавить</button>
  </form>
</template>

В родительском script setup: const loans = ref([]); let nextId = 1; const addLoan = data => loans.value.push({ id: nextId++, ...data });, в шаблоне — <LoanForm @add="addLoan" />. Родитель импортирует ref и LoanForm. Счётчик подходит только для этого локального примера; постоянный id и бизнес-валидацию обычно обеспечивает backend. При асинхронном сохранении форму очищают после подтверждённого успеха.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее