VueJS - Components: Building Blocks of Modern Web Applications

Bonjour là-bas, futurs magiciens de Vue.js ! Je suis ravi de vous guider dans cette incroyable aventure dans le monde des composants Vue.js. En tant que quelqu'un qui enseigne la programmation depuis des années, je peux vous dire que comprendre les composants, c'est comme apprendre à utiliser des blocs LEGO - une fois que vous avez compris, vous pouvez construire des choses incroyables ! Alors, plongeons dedans et amusons-nous !

VueJS - Components

Qu'est-ce que les composants Vue.js ?

Les composants sont le cœur et l'âme des applications Vue.js. Pensez-y comme des morceaux de code réutilisables qui encapsulent HTML, CSS et JavaScript. tout comme vous pouvez utiliser différents blocs LEGO pour construire un château, vous pouvez utiliser différents composants pour construire une application web complexe.

Voici un exemple simple d'un composant Vue :

<template>
<div class="greeting">
<h1>{{ message }}</h1>
</div>
</template>

<script>
export default {
data() {
return {
message: "Bonjour, composant Vue !"
}
}
}
</script>

<style scoped>
.greeting {
color: bleu;
}
</style>

Décomposons cela :

  1. La section <template> contient la structure HTML de notre composant.
  2. La section <script> définit la logique et les données du composant.
  3. La section <style> (avec l'attribut scoped) contient le CSS qui s'applique uniquement à ce composant.

Créer et utiliser des composants

Maintenant que nous savons à quoi ressemblent les composants, créons-en un et utilisons-le dans notre application !

Étape 1 : Créer un nouveau composant

Créez un nouveau fichier appelé Greeting.vue dans le dossier components de votre projet :

<!-- Greeting.vue -->
<template>
<div class="greeting">
<h2>{{ greeting }}</h2>
</div>
</template>

<script>
export default {
data() {
return {
greeting: "Bienvenue dans Vue.js !"
}
}
}
</script>

<style scoped>
.greeting {
font-style: italic;
color: vert;
}
</style>

Étape 2 : Utiliser le composant dans votre application

Maintenant, utilisons ce composant dans notre fichier principal App.vue :

<!-- App.vue -->
<template>
<div id="app">
<h1>Mon application Vue.js</h1>
<Greeting />
</div>
</template>

<script>
import Greeting from './components/Greeting.vue'

export default {
name: 'App',
components: {
Greeting
}
}
</script>

Voici ce qui se passe :

  1. Nous importons le composant Greeting.
  2. Nous le enregistrons dans l'option components de notre composant App.
  3. Nous l'utilisons dans notre template avec l'étiquette <Greeting />.

Et voilà ! Vous venez de créer et d'utiliser votre premier composant Vue !

Props : Transmettre des données aux composants

Les props sont comme des tuyaux magiques qui vous permettent d'envoyer des données d'un composant parent à un composant enfant. Améliorons notre composant Greeting pour qu'il accepte un message personnalisé :

<!-- Greeting.vue -->
<template>
<div class="greeting">
<h2>{{ customGreeting }}</h2>
</div>
</template>

<script>
export default {
props: ['message'],
computed: {
customGreeting() {
return `${this.message} Bienvenue dans Vue.js !`
}
}
}
</script>

Maintenant, nous pouvons l'utiliser comme ceci dans notre App.vue :

<!-- App.vue -->
<template>
<div id="app">
<h1>Mon application Vue.js</h1>
<Greeting message="Bonjour, cher étudiant !" />
<Greeting message="Salutations, passionné de Vue !" />
</div>
</template>

C'est génial, non ? Nous pouvons réutiliser le même composant avec différents messages !

Émettre des événements : Communication enfant-parent

While props allow parent-to-child communication, events enable child-to-parent communication. It's like a child asking their parent for ice cream!

Let's create a Button component that emits an event when clicked:

<!-- Button.vue -->
<template>
<button @click="handleClick">{{ label }}</button>
</template>

<script>
export default {
props: ['label'],
methods: {
handleClick() {
this.$emit('button-clicked', 'The button was clicked!')
}
}
}
</script>

Now, let's use this in our App.vue:

<!-- App.vue -->
<template>
<div id="app">
<h1>My Vue.js App</h1>
<Button label="Click me!" @button-clicked="handleButtonClick" />
<p>{{ message }}</p>
</div>
</template>

<script>
import Button from './components/Button.vue'

export default {
name: 'App',
components: {
Button
},
data() {
return {
message: ''
}
},
methods: {
handleButtonClick(msg) {
this.message = msg
}
}
}
</script>

When the button is clicked, it emits an event that the parent component listens for and responds to. It's like a harmonious family conversation!

Slots : Contenu flexible des composants

Slots are like placeholders in your components that you can fill with whatever content you want. They're incredibly useful for creating flexible, reusable components.

Let's create a Card component with a slot:

<!-- Card.vue -->
<template>
<div class="card">
<div class="card-header">
<h3>{{ title }}</h3>
</div>
<div class="card-body">
<slot></slot>
</div>
</div>
</template>

<script>
export default {
props: ['title']
}
</script>

<style scoped>
.card {
border: 1px solid #ccc;
border-radius: 4px;
padding: 10px;
margin-bottom: 10px;
}
.card-header {
background-color: #f1f1f1;
padding: 5px;
}
</style>

Now we can use this Card component with different content:

<!-- App.vue -->
<template>
<div id="app">
<Card title="Welcome">
<p>Welcome to our Vue.js tutorial!</p>
</Card>
<Card title="About Components">
<ul>
<li>Components are reusable</li>
<li>They can have props</li>
<li>They can emit events</li>
</ul>
</Card>
</div>
</template>

<script>
import Card from './components/Card.vue'

export default {
name: 'App',
components: {
Card
}
}
</script>

Dynamic Components

Dynamic components allow you to switch between different components dynamically. It's like having a Swiss Army knife of components!

Let's create a simple example:

<!-- App.vue -->
<template>
<div id="app">
<button @click="currentComponent = 'Greeting'">Show Greeting</button>
<button @click="currentComponent = 'Button'">Show Button</button>
<component :is="currentComponent"></component>
</div>
</template>

<script>
import Greeting from './components/Greeting.vue'
import Button from './components/Button.vue'

export default {
name: 'App',
components: {
Greeting,
Button
},
data() {
return {
currentComponent: 'Greeting'
}
}
}
</script>

In this example, we use the <component> element with the is attribute to dynamically render either the Greeting or Button component based on which button is clicked.

Conclusion

Congratulations! You've just taken your first steps into the wonderful world of Vue.js components. Remember, like with any skill, practice makes perfect. Don't be afraid to experiment and build your own components. Before you know it, you'll be creating complex, interactive web applications with ease!

Here's a quick reference table of the component features we've covered:

Feature Description
Basic Structure Template, Script, and Style sections
Props Pass data from parent to child
Events Communication from child to parent
Slots Flexible content placeholders
Dynamic Components Switch between components on the fly

Keep coding, keep learning, and most importantly, have fun with Vue.js!

Credits: Image by storyset