Premiers pas avec React: Guide du débutant

React est une remarquable bibliothèque JavaScript qui a pris d'assaut la communauté des développeurs. En un mot, il est plus facile pour les développeurs de créer des interfaces utilisateur interactives pour les plates-formes Web, mobiles et de bureau. Aujourd'hui, des milliers d'entreprises dans le monde utilisent React, y compris de grands noms tels que Netflix et Airbnb.
Dans ce guide, je vais vous présenter React et plusieurs de ses concepts fondamentaux. Nous serons rapidement opérationnels avec l’outil Créer une application React, puis nous vous expliquerons étape par étape le processus de création d’une application React simple . Lorsque vous aurez terminé, vous aurez un bon aperçu des bases et serez prêt à passer à l'étape suivante de votre aventure React.
Prérequis
Avant de commencer à apprendre React, il est logique d'avoir une compréhension de base de HTML, CSS et JavaScript . Cela vous aidera également à avoir une compréhension de base de Node.js ainsi que du gestionnaire de paquets npm .
Pour suivre ce didacticiel, vous aurez besoin des deux Node et npm installé sur votre machine. Pour ce faire, rendez-vous sur la page de téléchargement de Node.js et récupérez la version dont vous avez besoin (npm est fourni avec Node). Vous pouvez également consulter notre tutoriel sur l'installation de Node à l'aide d'un gestionnaire de version .
Qu'est-ce que React?
React est une bibliothèque JavaScript pour la création de composants d'interface utilisateur. Contrairement aux frameworks plus complets tels que Angular ou Vue, React ne traite que la couche de vue, vous aurez donc besoin de bibliothèques supplémentaires pour gérer des choses telles que le routage, la gestion de l'état, etc. Dans ce guide, nous allons nous concentrer sur ce que React peut faire dès le départ.
Les applications React sont créées à l'aide de composants d'interface utilisateur réutilisables qui peuvent interagir les uns avec les autres. Un composant React peut être un composant basé sur une classe ou un composant de fonction. Les composants basés sur les classes sont définis à l'aide des classes ES6 tandis que les composants fonctionnels sont des fonctions JavaScript de base. Celles-ci ont tendance à être définies en utilisant une fonction de flèche mais elles peuvent également utiliser le mot clé function
. Les composants basés sur les classes implémenteront une fonction render
qui renvoie du JSX (extension de React de Regular JavaScript, utilisée pour créer des éléments React), tandis que les composants de fonction renverront directement JSX. Ne vous inquiétez pas si vous n'avez jamais entendu parler de JSX, car nous y reviendrons plus tard.
Les composants React peuvent être classés en avec état et apatride ] Composants. Le travail d’un composant sans état consiste simplement à afficher les données qu’il reçoit de son composant React parent. S'il reçoit des événements ou des entrées, il peut simplement les transmettre à son parent pour qu'il les gère.
Un composant avec état, par contre, est responsable du maintien d'une sorte d'état d'application. Cela peut impliquer de récupérer des données à partir d'une source externe ou de savoir si un utilisateur est connecté ou non. Un composant avec état peut répondre aux événements et aux entrées pour mettre à jour son état.
En règle générale, vous devriez essayer d'écrire des composants sans état lorsque cela est possible. Ceux-ci sont plus faciles à réutiliser, à la fois dans votre application et dans d’autres projets.
Comprendre le DOM virtuel
Avant d’arriver au codage, vous devez savoir que React utilise un DOM virtuel pour gérer rendu de page. Si vous connaissez jQuery, vous savez qu'il peut manipuler directement une page Web via le HTML DOM . Dans de nombreux cas, cette interaction directe pose peu ou pas de problèmes. Cependant, dans certains cas, tels que l'exécution d'une application Web en temps réel hautement interactive, les performances peuvent en prendre un coup.
Pour contrer cela, le concept de Virtual DOM (un in -memory représentation du vrai DOM) a été inventée et est actuellement appliquée par de nombreux frameworks d'interface utilisateur modernes, y compris React. Contrairement au DOM HTML, le DOM virtuel est beaucoup plus facile à manipuler et est capable de gérer de nombreuses opérations en quelques millisecondes sans affecter les performances de la page. React compare périodiquement le DOM virtuel et le DOM HTML. Il calcule ensuite un diff, qu'il applique au DOM HTML pour le faire correspondre au DOM virtuel. De cette façon, React garantit que votre application est rendue à une fréquence cohérente de 60 images par seconde, ce qui signifie que les utilisateurs ne subissent que peu ou pas de décalage.
Démarrez un projet Blank React
Conformément aux conditions préalables, je suppose que vous avez déjà un nœud environnement mis en place, avec une version à jour de npm (ou éventuellement Yarn ).
Ensuite, nous allons créer notre première application React en utilisant Create React App un script utilitaire officiel pour créer des applications React d'une seule page.
Installons ceci maintenant:
npm i -g create-react-app
Ensuite, utilisez-le pour créer une nouvelle application React.
create-react-app message-app
En fonction de la vitesse de votre connexion Internet, cette opération peut prendre un certain temps s'il s'agit de la première exécution de la commande create-react-app
. Un tas de paquets sont installés en cours de route, qui sont nécessaires pour mettre en place un environnement de développement pratique – y compris un serveur Web, un compilateur et des outils de test.
Si vous préférez ne pas installer trop de paquets dans le monde, vous pouvez également npx
qui vous permet de télécharger et d'exécuter un package sans l'installer:
npx i -g create-react-app
L'exécution de l'une ou l'autre de ces commandes devrait générer quelque chose de similaire à ce qui suit:
.. .
Succès ! Créé React-App sur C: Users mike projects github application de message
Dans ce répertoire, vous pouvez exécuter plusieurs commandes:
fil début
Démarre le serveur de développement.
fil build
Regroupe l'application dans des fichiers statiques pour la production .
test du fil
Démarre le coureur de test .
fil éjection
Supprime cet outil et copie les dépendances de construction, les fichiers de configuration
et des scripts dans le répertoire de l'application. Si vous faites cela, vous ne pouvez pas revenir en arrière !
Nous vous suggérons de commencer par taper:
cd message-app
fil début
Bon piratage !
Une fois le processus de configuration du projet terminé, exécutez les commandes suivantes pour lancer votre application React:
cd message-app
npm début
Vous devriez voir la sortie suivante:
.. ..
Compilé avec succès !
Vous pouvez maintenant afficher react-app dans le navigateur.
Local: http: // localhost: 3000
Sur votre réseau: http://192.168.56.1:3000
Notez que la version de développement n'est pas optimisée.
Pour créer une version de production, utilisez la version yarn .
Votre navigateur par défaut devrait se lancer automatiquement et vous devriez avoir un écran comme celui-ci:
Maintenant que nous avons confirmé que notre projet React de démarrage fonctionne sans erreur, nous allons jetez un œil à ce qui s'est passé sous le capot. Vous pouvez ouvrir le dossier message-app
à l'aide de votre éditeur de code préféré. Commençons par le fichier package.json
:
{
"name" : "message-app"
"version" : "0.1.0"
"private" : true
"dependencies" : {
"@ testing -library / jest-dom ": " ^ 4.2.4 "
" @ testing-library / react ": " ^ 9.3.2 "[19659033]
"@ testing-library / user-event" : "^ 7.1.2"
"react" : "^ 16.13.1 "
" react-dom ": " ^ 16.13.1 "
" react-scripts ": " 3.4.3 "
}
"scripts" : {
"start" : "react-scripts start"
"build ": " react-scripts build "
" test ": " react-scripts test "
" eject " : "react-scripts eject"
}
"eslintConfig" : {
"extend" : "react-app"
}
"liste des navigateurs" : {
"production" : [
"> 0,2%"
"not dead "
" not op_mini all "
]
" development ": [
" last 1 chrome version "[19659112] "1 dernière version de Firefox"
"1 dernière version de safari"
]
}
}
Comme vous pouvez le voir, Create React App a installé plusieurs dépendances pour nous. Les trois premiers sont liés à la React Testing Library qui (comme vous pouvez le deviner) nous permet de tester notre code React. Ensuite, nous avons react
et react-dom
les packages de base de toute application React, et enfin react-scripts
qui met en place l'environnement de développement et démarre un serveur (que vous venez de voir).
Puis viennent quatre scripts npm, qui sont utilisés pour automatiser les tâches répétitives:
start
démarre le serveur de développementbuild
crée un serveur prêt pour la production version de votre applicationtest
exécute les tests mentionnés ci-dessuseject
exposera l'environnement de développement de votre application
Cette commande finale mérite d'être développée. L'outil Create React App fournit une séparation claire entre votre code réel et l'environnement de développement. Si vous exécutez npm run eject
Create React App cessera de cacher ce qu'elle fait sous le capot et videra tout dans le fichier package.json
de votre projet. Bien que cela vous donne un contrôle plus fin sur les dépendances de votre application, je ne vous recommanderais pas de le faire, car vous devrez gérer tout le code complexe utilisé pour créer et tester votre projet. Si c'est le cas, vous pouvez utiliser personnaliser-cra pour configurer votre processus de construction sans l'éjecter.
Create React App est également pris en charge avec ESLint (comme on peut le voir sur la propriété eslintConfig
) et est configuré à l'aide de react-app Règles ESLint.
La propriété browser
du fichier package.json
vous permet de spécifier une liste de navigateurs pris en charge par votre application. Cette configuration est utilisée par les outils et transpileurs PostCSS tels que Babel .
L'une des fonctionnalités les plus intéressantes que vous allez adorer à propos de Create React App est qu'elle fournit le rechargement à chaud prêt à l'emploi. Cela signifie que toute modification que nous apportons au code entraînera l'actualisation automatique du navigateur. Les modifications apportées au code JavaScript rechargeront la page, tandis que les modifications apportées au CSS mettront à jour le DOM sans recharger.
Pour l'instant, arrêtons d'abord le serveur de développement en appuyant sur Ctrl + C . Une fois le serveur arrêté, supprimez tout sauf les fichiers serviceWorker.js
et setupTests.js
dans le dossier src
. Si vous souhaitez découvrir ce que font les techniciens de service, vous pouvez en savoir plus sur eux ici .
En dehors de cela, nous créerons tout le code à partir de zéro afin que vous puissiez tout comprendre à l'intérieur le dossier src
Présentation de la syntaxe JSX
Défini par la documentation React comme une «extension de syntaxe de JavaScript», JSX est ce qui facilite l'écriture de vos composants React. En utilisant JSX, nous pouvons transmettre des structures HTML ou des éléments React comme s'il s'agissait de valeurs JavaScript standard.
Voici un exemple rapide:
import React from 'react' ;
export default function App () {
const message = < h1 > Je suis un titre </ h1 > ;
return ( message ]) ;
}
Notez la ligne const message =
I'm a head
; . C’est JSX. Si vous essayez de l'exécuter dans un navigateur Web, cela vous donnera une erreur. Cependant, dans une application React, JSX est interprété par un transpilateur, tel que Babel, et rendu en code JavaScript que React peut comprendre.
Remarque: vous pouvez en savoir plus sur JSX dans notre tutoriel " An Introduction à JSX ».
Dans le passé, les fichiers React JSX avaient une extension de fichier .jsx
. De nos jours, l'outil Create React App génère des fichiers React avec une extension de fichier .js
. Alors que l'extension de fichier .jsx
est toujours prise en charge, les responsables de React recommandent d'utiliser .js
. Cependant, il existe un groupe opposé de développeurs React y compris moi-même, qui préfèrent utiliser l'extension .jsx
pour les raisons suivantes:
- In VS Code, Emmet est prêt à l'emploi pour les fichiers
.jsx
. Vous pouvez cependant configurer VS Code pour traiter tous les fichiers.js
commeJavaScriptReact
pour que Emmet fonctionne sur ces fichiers. - Il existe différentes règles de linting pour JavaScript standard et React JavaScript code.
Cependant, pour ce didacticiel, je vais respecter ce que Create React App nous donne et m'en tenir à la fin du fichier .js
.
Hello, World! dans React
Commençons par écrire du code. Dans le dossier src
de l'application de message nouvellement créée
créez un fichier index.js
et ajoutez le code suivant:
import React de 'react' ;
import ReactDOM from 'react-dom' ;
ReactDOM . render ( < h1 > Bonjour Monde < / h1 > document ]. getElementById ( 'root' ) ) ;
Redémarrez le serveur de développement en utilisant npm start
ou yarn start
. Votre navigateur doit afficher le contenu suivant:
Voici l'exemple React le plus élémentaire de "Hello World". Le fichier index.js
est la racine de votre projet où les composants React seront rendus. Laissez-moi vous expliquer comment fonctionne le code:
- Ligne 1: Le package React est importé pour gérer le traitement JSX.
- Ligne 2: Le package ReactDOM est importé pour rendre le composant React racine.
- Ligne 3: Appel à la fonction de rendu en passant:
: un élément JSXHello World
document.getElementById ('root')
: un conteneur HTML (l'élément JSX sera rendu ici).
Le conteneur HTML se trouve dans le fichier public / index.html
. À la ligne 31, vous devriez voir
. Ceci est connu sous le nom de nœud DOM racine car tout ce qu'il contient sera géré par le DOM virtuel React .
Bien que JSX ressemble beaucoup à HTML, il existe quelques différences importantes . Par exemple, vous ne pouvez pas utiliser un attribut de classe
car il s'agit d'un mot clé JavaScript. Au lieu de cela, className
est utilisé à sa place. De plus, les événements tels que onclick
sont épelés onClick
dans JSX. Modifions maintenant notre code Hello World:
const element = < div > Hello World < / div > ;
ReactDOM . render ( element document . getElementById ( 'racine' ) ) ;
J'ai déplacé le code JSX dans une variable constante nommée element
. J'ai également remplacé les balises h1
par des balises div
. Pour que JSX fonctionne, vous devez envelopper vos éléments dans une seule balise parent.
Jetez un œil à l'exemple suivant:
const element = < span ]> Bonjour < / span > < span > Jane < / span > ;
Le code ci-dessus ne fonctionnera pas. Vous obtiendrez une erreur de syntaxe indiquant que vous devez inclure les éléments JSX adjacents dans une balise englobante. Quelque chose comme ceci:
const element = < div >
< span > Bonjour [19659217] < / span >
< span > Jane < / span >
< / div > ;
Que diriez-vous d'évaluer les expressions JavaScript dans JSX? Facile. Utilisez simplement des accolades comme ceci:
const name = "Jane" ;
const element = < p > Bonjour { nom } < / p >
… ou comme ceci:
const user = {
firstName : 'Jane'
lastName : 'Doe'
}
const element = < p > Bonjour { utilisateur . firstName } { user . lastName } < / p >
Mettez à jour votre code et confirmez que le navigateur affiche «Hello, Jane Doe». Essayez d'autres exemples tels que {5 + 2}
. Maintenant que vous avez les bases de l'utilisation de JSX, allons-y et créons un composant React.
Déclaration des composants React
L'exemple ci-dessus était une manière simpliste de vous montrer comment ReactDOM.render ()
fonctionne. En général, nous encapsulons toute la logique du projet dans les composants React, qui sont ensuite passés à la fonction ReactDOM.render
.
Dans le dossier src
créez un fichier nommé App .js
et tapez le code suivant:
import React { Component } from 'react' ; [19659306] class App extend Component {
render () {
return (
< div >
Hello World Again !
< / div >
)
}
} [19659150] export par défaut App ;
Ici, nous avons créé un composant React en définissant une classe JavaScript qui est une sous-classe de React.Component
. Nous avons également défini une fonction de rendu qui renvoie un élément JSX. Vous pouvez placer du code JSX supplémentaire dans les balises
src / index.js
avec le code suivant afin de voir les changements reflétés dans le navigateur: import React from 'react' ;
import ReactDOM de 'react-dom' ;
import App from './ App' ; [19659186] ReactDOM . render ( < App / > document . getElementById ( 'racine' ) ) ;
Nous importons d'abord le composant App
. Ensuite, nous rendons App
en utilisant le format JSX, comme ceci:
. Ceci est nécessaire pour que JSX puisse le compiler en un élément qui peut être poussé vers le React DOM
. Après avoir enregistré les modifications, jetez un œil à votre navigateur pour vous assurer qu'il affiche le bon message.
Ensuite, nous verrons comment appliquer le style.
Styling JSX Elements
Il y a ] différentes manières de styliser les composants React . Les deux que nous allons examiner dans ce didacticiel sont:
- Style en ligne JSX
- Feuilles de style externes
Voici un exemple de la façon dont nous pouvons implémenter le style en ligne JSX:
render ( ) {
const headerStyle = {
couleur : '# ff0000'
textDecoration : 'underline'
}
return (
< div >
< h1 style = [19659033] { headerStyle } > Bonjour Monde Encore ! < / h1 >
< / div >
)
}
Le style React ressemble beaucoup au CSS classique, mais il y a quelques différences clés. Par exemple, headerStyle
est un littéral d'objet. Nous ne pouvons pas utiliser de points-virgules comme nous le faisons normalement. De plus, un certain nombre de déclarations CSS ont été modifiées afin de les rendre compatibles avec la syntaxe JavaScript. Par exemple, au lieu de text-decoration
nous utilisons textDecoration
. Fondamentalement, utilisez la casse camel pour toutes les clés CSS à l'exception des préfixes de fournisseur tels que WebkitTransition
qui doit commencer par une majuscule.
Nous pouvons également implémenter le style de cette façon:
return (
< div >
< h1 style = { { color : '# ff0000' [19659033] textDecoration : 'underline' } } > Hello World Again ! < ] / h1 >
< / div >
)
La deuxième méthode utilise des feuilles de style externes. Par défaut, les feuilles de style CSS externes sont déjà prises en charge. Si vous souhaitez utiliser un préprocesseur tel que Sass, veuillez consulter la documentation pour savoir comment le configurer.
Dans le dossier src
créez un fichier nommé App.css
et tapez le code suivant:
h1 {
font-size : 4 rem ;
}
Ajouter l'instruction d'importation suivante à src / App.js
en haut du fichier:
import './ App.css' ;
Après l'enregistrement, vous devriez voir le contenu du texte de votre navigateur changer considérablement de taille. Vous pouvez également utiliser des classes CSS comme celle-ci:
.header-red {
font-size : 4 rem ; [19659426] couleur : # ff0000 ;
texte-décoration : underline ;
}
Mettez à jour src / App.js
comme suit:
< h1 className = "header-red" > Bonjour Monde Encore une fois ! < / h1 >
Nous ne pouvons pas utiliser l'attribut HTML class
car il s'agit d'un mot clé JavaScript réservé. À la place, nous utilisons className
. Voici le résultat attendu.
Maintenant que vous avez appris à ajouter du style à votre projet React, allons-y et découvrons les composants React sans état et avec état. [19659464] Composants sans état ou avec état
Un composant sans état, également appelé composant muet, est simplement un composant qui affiche des informations. Il ne contient aucune logique pour manipuler les données. Il peut recevoir des événements de l'utilisateur, qui sont ensuite transmis au conteneur parent pour traitement.
Créez le fichier message-view.js
et copiez-y l'exemple de code suivant. Voici un exemple parfait d'un composant stupide (bien que techniquement il s'agisse plus d'un composant statique):
import React from 'react' ;
class MessageView extend React . Component {
render () {
return (
< ] div className = "message" >
< div className = "field" >
< span className = "label" > From : < / span >
< span className = "value" > John Doe < / span >
< / div >
< div className = "field" >
< span className = "label" > [19659191] État : < / span >
< span className = "value" > Non lu < / span >
< / div >
< div className = "champ content ">
< span className = " label "> Message : < / span >
< span className = "value" > Passez une bonne journée ! < / ] span >
< / div >
< / div >
)
}
}
export par défaut MessageView ;
Ensuite, ajoutez un style de base à src / App.css
avec le code suivant:
body {
background-color : # EDF2F7 [19659033];
couleur : # 2D3748 ;
font-family : -apple-system BlinkMacSystemFont [19659040] 'Segoe UI' Roboto Oxygen Ubuntu Cantarell 'Open Sans' [19659033] 'Helvetica Neue' sans-serif ;
}
h1 {
font-size : 2 rem ;
}
.container {
width : 800 px ;
margin : 0 auto ;
}
.message {
background-color : # F7FAFC [19659033];
width : 400 px ;
margin-top : 20 px ;
border- top : solid 2 px #fff ;
border-radius : 8 px ; [19659426] padding : 12 px ;
box-shadow : 0 10 px 15 px [19659428] -3 px rgba ( 0 0 0 0.1 ) 0 4 px 6 px -2 px rgba ( 0 [19659428] 0 0 0,05 ) ;
}
.field {[19659426] affichage : flex ;
justify-content : flex-start ;
margin-top : 2 px ;
}
.label {
font- weight : bold ;
font-size : 1 rem ;
width : 6 rem ;
}
.value {
color : # 4A5568 ;
}
.content .value {
font-style : italic ;
}
Enfin, modifiez src / App.js
pour que le fichier entier ressemble à ceci:
import React { Component } de 'react' ;
import './ App.css' ;
import MessageView from './ message-view ';
class App extend Component {
render () {
return [19659052] (
< MessageView / >
)
}
}
export default App ;
À présent, le code devrait être assez explicite, car j’ai déjà expliqué les concepts impliqués jusqu’à présent. Jetez un œil à votre navigateur maintenant, et vous devriez avoir le résultat suivant:
Nous avons mentionné précédemment que React offre à la fois des composants basés sur les classes et des fonctions. We can rewrite MessageView
using functional syntax like this:
import React from 'react';
export default function MessageView() {
return (
<div className="message">
<div className="field">
<span className="label">From: </span>
<span className="value">John Doe</span>
</div>
<div className="field">
<span className="label">Status: </ span>
<span className="value"> Unread</span>
</div>
<div className="field content">
<span className="label">Message: </span>
<span className="value">Have a great day!</span>
</div>
</div>
);
}
Take note that I’ve removed the Component
import, as this isn’t required in the functional syntax. This style might be confusing at first, but you’ll quickly learn it’s faster to write React components this way.
Also, with the advent of React hooksthis style of writing React components is becoming increasingly popular.
Passing Data via Props
You’ve successfully created a stateless React Component. It’s not complete, though, as there’s a bit more work that needs to be done for it to be properly integrated with a stateful component or container. Currently, the MessageView
is displaying static data. We need to modify it so that it can accept input parameters. We do this using something called props — data which we’re going to pass down from a parent component.
Start off by altering the MessageView
component like so:
import React from 'react';
class MessageView extends React.Component {
render() {
const message = this.props.message;
return(
<div className="message">
<div className="field">
<span className="label">From: </span>
<span className="value">{message.from}</span>
</div>
<div className="field">
<span className="label">Status: </span>
<span className="value">{message.status}</span>
</div>
<div className="field content">
<span className="label">Message: </span>
<span className="value">{message.content}</span>
</div>
</div>
)
}
}
export default MessageView;
The main thing to be aware of here is how we’re defining the message
variable. We’re assigning it a value of this.props.message
which we’ll pass down from a stateful parent component. In our JSX we can then reference our message
variable and output it to the page.
Now let’s create a parent component for our MessageView
. Make a new file message-list.js
and add the following code:
import React, { Component } from 'react';
import MessageView from './message-view';
class MessageList extends Component {
state = {
message: {
from: 'Martha',
content: 'I will be traveling soon',
status: 'read'
}
}
render() {
return(
<div className="container">
<h1>List of Messages</h1>
<MessageView message={this.state.message} />
</div>
)
}
}
export default MessageList;
Here, we’re using state to store an object containing our message. Part of the magic of React is that when the state object changes, the component will re-render (thus updating the UI).
Then, in our JSX, we’re passing the message
property of our state
object to the MessageView
component.
The final step is to update our App
component to render our new stateful MessageList
component, as opposed to the stateless MessageView
component:
import React, { Component } from 'react';
import MessageList from './message-list';
import './App.css';
class App extends Component {
render(){
return (
<MessageList />
)
}
}
export default App;
After saving the changes, check your browser to see the result.
Take a moment to make sure you understand what’s happening. We’re declaring a state
object in our (stateful) MessageList
component. A message
property of that object contains our message. In our render
function, we can pass that message to our (stateless) child component using something called props.
In the (stateless) MessageView
component, we can access the message using this.props.message
. We can then pass this value along to our JSX to render to the page.
Phew!
Prop Checking
As your application grows and data is being passed back and forth as props, it will be useful to validate that components are receiving the type of data they’re expecting.
Luckily, we can do this with the prop-types package. To see a quick example of this in action, change our MessageView
component as follows:
import React from 'react';
import PropTypes from 'prop-types';
class MessageView extends Component {
]
MessageView.propTypes = {
message: PropTypes.object.isRequired
}
export default MessageView;
This will cause your React app to complain if the message
prop is missing. It will also cause it to complain if the component receives anything other than an object.
You can try this out by changing the parent component’s state like so:
state = {
message: 'Not an object!'
}
Go back to your browser and open the console. You should see the following logged to the console:
Warning: Failed prop type: Invalid prop `message` of type `string` supplied to `MessageView`, expected `object`.
in MessageView (at message-list.js:13)
in MessageList (at App.js:9)
in App (at src/index.js:6)
Component Reuse
Now let’s see how we can display multiple messages using MessageView
instances. This is where React starts to shine, as it makes code reuse incredibly easy (as you’ll see).
First, we’ll change state.message
to an array and rename it to messages
. Then, we’ll use JavaScript’s map function to generate multiple instances of the MessageView
component, each corresponding to a message in the state.messages
array.
We’ll also need to populate a special attribute named key with a unique value such as id
. React needs this in order to keep track of what items in the list have been changed, added or removed.
Update the MessageList
code as follows:
class MessageList extends Component {
state = {
messages: [
{
_id: 'd2504a54',
from: 'John',
content: 'The event will start next week',
status: 'unread'
},
{
_id: 'fc7cad74',
from: 'Martha',
content: 'I will be traveling soon',
status: 'read'
},
{
_id: '876ae642',
from: 'Jacob',
content: 'Talk later. Have a great day!',
status: 'read'
}
]
}
render() {
const messageViews = this.state.messages.map(
message => <MessageView key={message._id} message={message} />
)
return(
<div className="container">
<h1>List of Messages</h1>
{messageViews}
</div>
)
}
}
Check your browser to see the results:
As you can see, it’s easy to define building blocks to create powerful and complex UI interfaces using React.
Refactor to Use React Hooks
Hooks are a recent edition to React, but they’re taking the React world by storm. In simplistic terms, they make it possible to take a React function component and add state (and other features) to it.
I’m going to finish this tutorial by refactoring our MessageView
component to make it a function component, which manages its state with React hooks. Please note this is only possible when using React v16.8 and above.
import React, { useState } from 'react';
import MessageView from './message-view';
export default function MessageList () {
const initialValues = [
{
_id: 'd2504a54',
from: 'John',
content: 'The event will start next week',
status: 'unread'
},
{
_id: 'fc7cad74',
from: 'Martha',
content: 'I will be traveling soon',
status: 'read'
},
{
_id: '876ae642',
from: 'Jacob',
content: 'Talk later. Have a great day!',
status: 'read'
}
];
const [messages] = useState(initialValues);
const messageViews = messages.map(
message => <MessageView key={message._id} message={message} />
);
return (
<div className="container">
<h1>List of Messages</h1>
{messageViews}
</div>
);
}
In the above example, I’ve replaced the state
object with the useState React hook. As the name suggests, this allows you to manage a component’s state.
Using hooks will help you avoid something called prop drilling when working on large projects. Prop drilling sees you passing props through multiple components (that ultimately have no need of that data) just to reach a deeply nested component.
We can also convert our MessageView
component to a function component:
import React from 'react';
import PropTypes from 'prop-types';
const MessageView = ({ message }) => {
const { from, status, content } = message;
return(
<div className="message">
<div className="field">
<span className="label">From: </span>
<span className="value">{from}</span>
</div>
<div className="field">
<span className="label">Status: </span>
<span className="value">{status}</span>
</div>
<div className="field content">
<span className="label">Message: </span>
<span className="value">{content}</span>
</div>
</div>
);
};
MessageView.propTypes = {
message: PropTypes.object.isRequired
}
export default MessageView;
Notice how we now receive the message prop in our component:
const MessageView = ({ message }) => {
...
}
This utilizes a technique called object destructuringwhich allows you to extract individual items from arrays or objects and place them into variables using a shorthand syntax.
We employ the same technique here, to grab the values we need from the message
object and avoid prefixing everything with message
:
const { from, status, content } = message;
And that’s the lot!
I don’t want to go into React hooks any further in this article, but just make you aware that they exist and that they’re becoming increasingly popular among the React community. If you’d like to learn more about hooks, please read our guide to getting started with React Hooks.
Demo
Here’s a live demo you can play with:
See the Pen
React Message App by SitePoint (@SitePoint)
on CodePen.
Where to Go from Here
We’ve now come to the end of this introductory guide. There’s a lot more React concepts that I haven’t been able to cover, such as data fetching, error handling, routing, working with forms, debugging. The list goes on …
The good news is that we have a lot of awesome React content on SitePoint Premiumas well as many great articles on our blog. I encourage you to check them out and build something great.
Source link