Estou tentando aprender Vue e quero construir um componente pai de lista de compras (meu exercício de treinamento). O pai gerenciará o estado e ele contém dois componentes filhos: 1) a tabela com produtos e preços para cada produto 2) o formulário para adicionar um novo item.
Eu tenho o seguinte ShoppingListComponent.vue
:
<template>
<table>
<thead>
<tr>
<th>Product</th>
<th>Price</th>
</tr>
</thead>
<tbody>
<tr v-for="product in products" :key="product.id">
<td>{{ product.name }}</td>
<td>{{ product.price }}</td>
</tr>
</tbody>
</table>
</template>
<script setup lang="ts">
import type { Product } from './models';
interface Props {
products: Product[];
}
defineProps<Props>();
</script>
A interface do produto é simplesmente:
export interface Product {
id: number;
name: string;
price: number;
}
O AddProductFrom.vue
:
<!-- I use quasar ->
<template>
<div class="row q-gutter-sm">
<q-input filled v-model="product.name" label="Name" />
<q-input filled v-model="product.price" label="Price />
<q-btn color="black" text-color="white" label="Add" @click="$emit('addRow', product)" />
</div>
</template>
<script setup lang="ts">
import { ref } from 'vue';
import { type Product } from './models';
const product = ref<Product>({
id: 1,
name: '',
price: 0,
});
defineEmits<{
addRow: [item: Product];
}>();
</script>
Isso "funciona" e adiciona uma linha à tabela, mas ainda há algum tipo de referência porque quando adiciono um produto e altero o conteúdo do formulário, os dados na tabela também mudam.
O que eu quero é poder adicionar um produto, limpar o formulário e adicionar um novo produto (o que você esperaria). Como posso resolver isso?
Acho que é melhor mover o novo objeto de produto para o pai e gerenciá-lo lá enquanto o fornece ao formulário por meio de uma propriedade:
Parque infantil
Quando você atualizou os campos do formulário após a emissão, ele modificou o objeto que já estava no array products do pai (já que era a mesma referência). Ao criar um novo objeto na emissão e redefinir o formulário, você garante que cada produto adicionado seja um objeto distinto, e o formulário comece do zero a cada vez.