Passando Arrays e Objetos para Componentes no Vue.js
No Vue.js, objetos e arrays podem ser passados para um componente por meio de props
. Isso ajuda a estruturar melhor a aplicação, mantendo a lógica de dados separada da apresentação.
Enviando Objetos
A seguir, um exemplo onde um objeto é passado para um componente:
<!DOCTYPE html>
<html>
<head>
<title>Componentes Vue.js</title>
<meta charset="utf-8" />
<script src="https://unpkg.com/vue"></script>
</head>
<body>
<div id="app">
<input type="text" v-model="user.name" /><br /><br />
<input type="number" v-model.number="user.age" /><br /><br />
<user-info :user="user"></user-info>
</div>
<script>
const app = Vue.createApp({
data() {
return {
user: {
name: "Tom",
age: 18,
},
};
},
});
app.component("user-info", {
props: ["user"],
template: `<div>
<h2>User</h2>
<p>Name: {{ user.name }}</p>
<p>Age: {{ user.age }}</p>
</div>`,
});
app.mount("#app");
</script>
</body>
</html>
O componente recebe os dados por meio da propriedade user, que contém um objeto com as propriedades name
e age
. No template do componente, essas propriedades podem ser acessadas diretamente.
Se nenhum valor for passado para a propriedade user
(<user-info></user-info>
), ela será undefined
, resultando em um erro. Para evitar isso, é possível definir um valor padrão utilizando a opção default
. No caso de objetos e arrays, essa opção deve ser uma função que retorna o valor inicial.
O código abaixo define um valor padrão para user
:
app.component("user-info", {
props: {
user: {
type: Object,
default() {
return {
name: "Bob",
age: 22,
};
},
},
},
template: `<div>
<h2>User</h2>
<p>Name: {{ user.name }}</p>
<p>Age: {{ user.age }}</p>
</div>`,
});
Se user
não for fornecido como props
, o componente usará o valor padrão definido.
Enviando Arrays
O mesmo princípio se aplica a arrays. No exemplo a seguir, um array é passado para um componente:
<!DOCTYPE html>
<html>
<head>
<title>Componentes Vue.js</title>
<meta charset="utf-8" />
<script src="https://unpkg.com/vue"></script>
</head>
<body>
<div id="app">
<users-list :users="users"></users-list>
</div>
<script>
const app = Vue.createApp({
data() {
return {
users: [
{ name: "Tom", age: 18 },
{ name: "Bob", age: 23 },
{ name: "Alice", age: 21 },
],
};
},
});
app.component("users-list", {
props: ["users"],
template: `<ul>
<li v-for="user in users">
<p>Name: {{ user.name }}</p>
<p>Age: {{ user.age }}</p>
</li>
</ul>`,
});
app.mount("#app");
</script>
</body>
</html>
O componente recebe um array users
, onde cada elemento é um objeto. A diretiva v-for
permite iterar sobre o array para exibir os dados.
Também é possível definir um valor padrão para users
, garantindo que o componente funcione corretamente caso não receba um array:
app.component("users-list", {
props: {
users: {
type: Array,
default() {
return [];
},
},
},
template: `<ul>
<li v-for="user in users">
<p>Name: {{ user.name }}</p>
<p>Age: {{ user.age }}</p>
</li>
</ul>`,
});
Caso users
não seja passado como props
, o componente usará um array vazio por padrão, evitando erros.
Documentação oficial: