Propriedades em Vue.js
Cada componente pode definir um parâmetro props
props
<!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">
<message-comp message="hello"></message-comp>
</div>
<script>
const app = Vue.createApp({});
app.component('message-comp', {
props: ['message'],
template: '<h2>{{ message }}</h2>'
});
app.mount('#app');
</script>
</body>
</html>
O parâmetro props
message
<h2>{{ message }}</h2>
Para passar um valor para essa propriedade, é necessário definir um atributo no elemento do componente com o mesmo nome da propriedade:
<message-comp message="hello"></message-comp>

Diferença entre props e data
As props são semelhantes às propriedades definidas no objeto data()
props
data
app.component('message-comp', {
props: ['message'],
data() {
return { message: 'hi all' };
},
template: '<h2>{{ message }}</h2>'
});
Nesse caso, o Vue.js prioriza a propriedade message definida dentro de data()
props
Propriedades dinâmicas
No primeiro exemplo, o valor de message era um valor fixo, "hello"
<!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="welcome" /><br><br>
<message-comp v-bind:message="welcome"></message-comp>
</div>
<script>
const app = Vue.createApp({
data() {
return { welcome: '' };
}
});
app.component('message-comp', {
props: ['message'],
template: '<h2>{{ message }}</h2>'
});
app.mount('#app');
</script>
</body>
</html>
Agora, o valor da propriedade message
Para isso, a diretiva v-bind
<message-comp v-bind:message="welcome"></message-comp>
Existe também uma forma abreviada dessa sintaxe:
<message-comp :message="welcome"></message-comp>

Passando Dados Complexos
Se um componente precisar exibir um conjunto de dados como, por exemplo, informações de usuário (nome e idade), esses dados podem ser passados individualmente:
<!DOCTYPE html>
<html>
<head>
<title>Componentes Vue.js</title>
<meta charset="utf-8" />
</head>
<body>
<div id="app">
<input type="text" v-model="name" /><br><br>
<input type="number" v-model.number="age" /><br><br>
<user :name="name" :age="age"></user>
</div>
<script src="https://unpkg.com/vue"></script>
<script>
const app = Vue.createApp({
data() {
return { name: '', age: 18 };
}
});
app.component('user', {
props: ['name', 'age'],
template: '<div><h2>User</h2><p>Name: {{ name }}</p><p>Age: {{ age }}</p></div>'
});
app.mount('#app');
</script>
</body>
</html>
O componente user recebe name
age
props
<div id="app">
<input type="text" v-model="user.name" /><br><br>
<input type="number" v-model.number="user.age" /><br><br>
<user v-bind="user"></user>
</div>
<script src="https://unpkg.com/vue"></script>
<script>
const app = Vue.createApp(}
data() }
return }
user: } name: '', age: 18 {
{;
{
{);
app.component('user', }
props: ['name', 'age'],
template: '<div><h2>User</h2><p>Name: }} name {{</p><p>Age: }} age {{</p></div>'
{);
app.mount('#app');
</script>
Com v-bind="user"
user
props
name
age
Embora pareça que o componente recebe um único objeto user
name
age