Commencez avec Redux Thunk

Feb 6, 2026
Comment
Get started with Redux Thunk [DIX] [DIX] [DIX] [dix]
[DIX]

L'État est une Grande Partie d'une demande Révisissante, c'est pourquoi Redux Est Générement Associé à Celui-Ci. CES Données Proviennent Souvent de Données de Données, Qui Nécessite Une Demande et une Réponse. Verser des applications Countryes, la communication de la cette Peut-être Consvere. Il Peut-Être Difficile d'Essayer De Gérer Uniquement dans les composants Réactif.

[DIX]

CELA INTOOLITUIT ÉMÉMENT DE NOUVEAUX Problèmes - QUE SE Passe-T-IL Sile Charge Charge Lentiment Ou NE SE CHARGE PAS DU TOUT? Chaque Compostante Traitant des Données Asynchrones Dévir Contenir UNE Logique Pour Gérer CES Scénarios.

ONU 'THUNK' EST UN CONCEPTEUR QUI PEUT A INIDER À CETTE SITY. CHAQUE THUNK EST UNE FONCTION QUI RETOURNE UNE AUTRE FONCTION. Cette Fonction Peut alors d'estre appelée à UN POINT ULTIRIEUR, UN PUU COMBE NON Rappel. SI NOUS POUVONS ENVOYER UN THUNK AU LIEU D'UN OBJET D'ACTION, NOUS POUVONS AJOUTER UNE LOGIQUE SUPPLÉMENTAIRE EN RÉACTION À UN AUTRE ÉVÉNEMENT.

REDUX THUNK EST UNE BIBLIOTHÈQUE QUE SE FUNCTION ENTRE LES ACTIONS Expédiées et le Réducteur. LORSQUES VOIT UN ONU THUNK EST EXPÉDIÉ, IL Passe-Offres Méthodes dans la Fonction Retournée Retournée Utilee Pour Envoyer d'Autres Actions, commémes non Événement de Réussite ou d'Erreur.

  • 20 plugins jQuery brillants

Dans les intérieurs CE Didacticiel, NOUS UTILISERONS THUNKS POUR VOUS ARTIDE À TIRE À TIRER DANS DONES D'UN SERVEUR PLUTOT Q'À PARTIR D'UN FICHIER JSON, Travaillant Avec Photosphare - Application photo-commentaire Alimée Par Redux.

[DIX]

VOUS AVEZ ONU NOUVEAU PROJET DE SITE DE SITE, MAIS IL Y BESIN DE RETENANT SIMPLE? VOICI NOS GUIDES AU MEILLEUR Générateur de site Web ET Hébergement Web Service des Nations Unies. Partager des Fichiers AVEC D'AUTRES? Obtenir votre stockage en ligne Droit.

Téléchargez les Fichiers Pour le tutoriel CE.

01. Installer des déparences

Get started with Redux Thunk: Install dependencies

[DIX] [DIX]
Exécuteur Les Deux Servers et Les Leisser Faire Leurs Affaires

Il Y a Deux Parties de CE Projet - Le Site Front End et Le Servertur d'Extrémité Arrière Fonctionnement. BIEN QUE LE DIDACTICIEL SE CONCENTRE SUR LE FRONT-END, NOUS AVONS BESOIN D'UN SERVEUR EN COURS D'EXÉCUT POUR ALLER Chercher Les Photos. Téléchargez les FICHIERS DE PROJET ET INSTALLENTZ LES DÉPENDANCES POUR LE SITE ET LE SERVEUR. Exécutez les Serverrs pour les Deux et Laisez-les Courir en Arrière-Plan.

 / * Terminal de l'ONU à l'INTÉRIEUR / SITE * /
& gt; maigre
& gt; Début de Fil
/ * Terminal de l'ONU à l'INTÉRIEUR / SERVEUR * /
& gt; maigre
& gt; LE FIL COMMENCE 

02. Configureur Le Midassiciel

Redux Thunk Est Un Nations Unies middleware - Fonctionnalité Qui est ASSIS ENTRE LES ACTIONS ET LES RÉCUCTEURS QUI PUUVENT CHANGER LA FAÇON DONT CES ACTIONS SE COMPORTEMENT. REDUX PREND EN CHARISE PLUSIEURS ENSEMBLES DE MIDENTAILLAIRE COVRANT L'ENSUELLE DE L'APPLICATION. ILS Sont Ajoutés Lorsque Le Magasin est Créé en utillistant Le compositeur Méthode. Ajoter middleware au Créditore Méthode Dans Index.js.

 Importateur {ApplyMidDleware, compose}
de "redx";
Importateur Thunk de "Redux-thunk";
[...]
Const Store = Creeestore (
rootReducer,
compositeur(
applyMiddleware (Thunk),
devtools
)
); 

03. Configureur Les Créateurs d'Action

La Première a choisi à Faire Est de Charger Les Photos Dans La Galerie. Comme des Actions Ordinaires, NOUS Avons Besoin de Créateurs d'Action Pour les Différents État d'Aussi Aussi Asynchrone Prendra. La Plupart Auront début , Succès ET Erreur Actions. Cuzz-CI OnseSé Redux Savoir Ce que Le JavaScript est occupé à faire. Nuque Actions / Photos / Photos.Js , Mise En Place de Trois Créateurs d'Action Pour CES Différents État.

 Export const loadgalleryStart = () = & gt; ({
Type: load_gallery_start});
Export const loadgallerySuccess =
photos = & gt; ({
Type: load_gallery_success,
Photos
});
Export const loadgalleryERror = () = & gt; ({
Type: load_gallery_error}); 

04. Créer Un Thunk pour le contrôle

Thunks Fonctionne exactement La Même a choisi les Créateurs d'action. Nous Expédiations Toujours la Valeur de Retour, Mais Cette Fois-Ci, IL Renvoine Un Fonction au lieu d'ONU Objet. Le Middleware Que Nous Avons Confons Configuré PRÉCÉMENT PASSERA UNE MÉTHODE D'ÉXPÉRIEUR DANS LA FONCTION RENVOYÉE. CELA NOUS PERMETER D'ENVOYER PLUS D'ACTIONS À REDUX APRÈS LA PREMIÈRE ENVOI. Créer Un loadgallery Méthode Qui Renvoie Une Fonction. Pour l'Instant, Demandez-Lui d'Envoyer une action pour Montrer que la galerie Est-la Galerie Est Toujours en Cours de chargement.

 Export const loadgallery = () = & gt;
Dispatch = & GT; {
Dispatch (loadgalleryStart ());
}; 

05. Chargeur Les Donnes du Serveur

NOUS SOMMES PRÊTS ENTREENANT À COMMENDURE À ALLER CHERCHER DU SERVEUR QUE NOUS AVONS MIS EN PLACE AU DEBUT. NOUS POUVONS LE FAIR EN UTILISANT axios - UN PAQUET CONÇU POUR TRAVAILLER AVEC DES DIFFÉRENTES SUR DES DIFFÉRENTES DIFFÉRENTES. Importateur axios ET FAIR UNE Demande Versez les Photos Dans loadgallery . SI LA PROMESSE RÉSOUT, Envoyez L'Action de Réussite et ne pas EXPÉDIER L'Action d'Erreur. Avec Cela, La Structure du Thunk Est complète.

 Importateur Axios de "Axios";
[...]
Renvoyer Axios
.GET ("http: // localhost: 3001 / photos")
.Ce (Réponse = & GT; Expédition (
loadgallerySuccy (Réponse.data)))
.Catch (() = & GT; Expédition (
LOADGALLERYERROR ())); 

06. Envoi du Thunk

Get started with Redux Thunk: Dispatch the thunk

[DIX] [DIX]
ONU Thunk Non Envoyé Est Un Morceau Inutile de la Malbouffe

Le Thunk Ne Fera Rien Jusqu'à CE Qu'il Soit Expédié. NOUS POUVONS LE FAIR DANS UNE COMPOSANTE RÉAGISSANTE COMPTE TOUTE AUTRE Action. Un moment de Bon moment pour Commencer à chargeur Les Photos Est Lorsque L'Utilisateur Vise La Galerie Principale. NOUS POUVONS UTILISER RECOIR COMPOSANTDIDMOUNT LA MÉTHODE DE CYCLE DE VIE EN TANT QUE DÉCLENCHEUR, APRES AVOIR VÉRIMÉS LA GALERIE N'EST PAS DÉJÀ CHARGÉE. Nuque Composants / Conteneur / Galerie / Galerie.js Expédier Un loadgallery action en l'ajout à MapDispatchtoprops ET L'APPELANT DANS COMPOSANTDIDMOUNT .

 ComponentDidMount () {
si (! this.props.photosloaded) {
cela.props.loadGallery ();
}
}
Exportateur const de mapdispatchtoprops =
 Dispatch = & GT; ({
LoadGallery: () = & GT;
Dispatch (loadgallery ()),
}); 

07. Ajouter des photos sur Le Succès

Get started with Redux Thunk: Add photos on success

[DIX] [DIX]
UNE FOIS QUES DES PHOTOS SORE ARRIVÉES, ILS SONT PASSÉS À LA COMPOSANTTE GALERIE

Lorsque les photos Sont revenus du serveur, nous Envoyons Un Load_gallery_success Action AVEC Les photos. NOUS DevONS L'Obtenir Dans l'État à Travers Le Photos Réducteur. SE Diriger vers vers Réducteurs / Photos / Photos.Js ET AJOUTER UN CAS POUR L'ACTION DE SUCKÈS. La Charge Utile Contien Toute Les photos Sous Forme de Tableau. UNE FOIS QUE L'État EST MIS À JOUR, LE SÉLEUR Photo Passe les photos à la Composante de la Galerie à Afficher.

 Case Load_Gallery_Success:
Action de retour.photos; 

08. Configurez l'utilisateur d'interface

Actuelle, Les Photos Apparaissant Soudainement Après Leurrerie. Sur un Connexion plus Lente, l'utilisateur Examinera Un Écran Vide Jusqu'à la Fin de la Demande, SI Cela Le Fort Jamais. Les Actions Que Nous Envoyons Aux Photos De Chargement Égyptement Estre Prises DANS LE RÉCUCTEUR D'INTERFACE UTILISATEUR AFINE DE MONTENIR L'INTERFACE À JOUR AVEC CE QUE JE PASSE. METTRE À JOUR LES INDIQUÉS DE LA CHARGE ET D'ERREUR DANS LE REDUCTTEUR D'INTERFACE UTILISATEUR À Réducteur / UI / UI.JS .

 Case LOAD_GALLERY_Error:
Retour {... Etat,
Chargement: faux, erreur: true};
CAS LOAD_GALLERY_START:
Retour {... Etat,
Chargement: vrai, erreur: faux};
CAS LOAD_GALLERY_SUCCESS:
Retour {... Etat,
Chargement: faux}; 

09. AJOUTER LE SÉLECTEUR DE LA CHARGE ET D'ERREUR

Comme les photos de la galerie Elles-Mêmes, Nous Avons Besoin de Sélecteurs Pour Obtenir Les Différentes Valeurs des étoiles d'Ui de Redux. Nous Pouvons Les Transmettre à la Galerie, Qui Rendront Ensuite des Éléments Différents Si l'ONU OU L'AUTRE Est VRAI. Nuque Sélecteurs / UI / UI.JS , Ajoter Quelques Fonctions pour Obtenir Les Valeurs.

Export const isgalleryerored =
 état = & gt; state.ui.Error;
Export const isgalleryloading =
 état = & gt; state.ui.loading; 

10. Ajouter des Données à la GalerieContainer

Avec les Sélecteurs Prêtés, ILS autonome Ajustant Ajustés à la Galerie Conteneur Composant. Les AJOUTANT ICI SIMNIFIE QUE LE COMPOSANT RESPONSABLE DE L'AFFICHAGE DE LA GALERIE N'A PAS BESOIN DE SAVOIR Commentaire Les Donnes Sont Arrivées. SE Diriger vers vers conteneur / galerie / galerie.js et ajouter les Sélecteurs à MapstationToprops . Faits des Constantes Pour les Valeurs d'Areder à Afficher l'Étape SUIVANTE.

 const {erreur, chargement,
 Photos} = Ceci.Props;
[...]
Exportateur const Mapstationtoprops =
 état = & gt; ({
ERREUR: ISGALLERRRANDREDRED (Etat),
Chargement: isgalleryloading (état),
 }); 

11. Afficher l'État de chargement et d'Erreur

[DIX]

Get started with Redux Thunk: Show loading and error state

[DIX] [DIX]
Assurez-vous QUE LES COMPOSANTS D'ERREUR ET DE CHARGEMENT Apparaissent en Cas de Besoin

Bien que nous NOUS AYONS L'ERREUR ET LE CHARGEMENT DES ACCESSOIRES, IL N'Y A ACTULTEMENT AUCUN INTERFACE UTILISATEUR VERRE INDIQUER QUAND ILS SON SONT Actifs. CES ACCESSOIRES SON DES VALEURS BOOLÉENNES, CE QUI SIMIFIE QUE NOUS POUVONS BASCULER L'AFFICHAGE DES COMPOSANTS QUAND ILS SON SON VRAIS. METTRE À JOUR LA MÉTHODE DE RENDU POUR VOUS ASSURATEUR QUE LA LA & lt; ERROR & GT; ET & lt; chargement et gt; Les composants roulaient au lieu de la galerie en Cas de Besoin.

 Si (Erreur) {
RETOUR & LT; Erreur / & GT ;;
}
Si (chargement) {
RETOUR & LT; chargement / & gt ;;
} 

12. Fetch La Galerie à Nouveau

AVEC LA GALERIE CHARGÉE, NOUS POUVONS PASSER À UNE Photo Individuelle. FR CLIQUANT SUR L'UNE DES DES PHOTOS ET RAFRAÎCRIR LA PAGE NE CHARGE PAS LA PHOTO DE SAUVEGARDE, CAR IL N'Y A Pas Encore sur Cette Page Versez Chargeur La Galerie. Éveillé conteneur / photo / photo.js ET CHARGER LA GALERIE DANS COMPOSANTDIDMOUNT comme le Galerie Composant. Le Photos de la Chargee Vérifiez que vous, N'ESSAREREREZ PAS DE CHARGER LES PHOTOS SI ELES ÉTAIENT DÉJÀ CHARGÉES DANS LA GALERIE.

 Si (! Ça.Props.photosloaded) {
cela.props.loadGallery ();
} 

13. AJOUTER UN NOUVEAU COMMENTAIRE

Get started with Redux Thunk: Add a new comment

[DIX] [DIX]
Utilisez le addnewcommendemendance Fonction Procéder à Ajouter des commentations

L'utilisateur Peut CLIQUER sur la photo Où ILS Veilent Laufers Un commentataire. Le compositeur de photo de photo VA Courir Le addnewcommendemendance Fonction de Dépôt LORSQUE CELA SE PRODUIT. À l'Intérieur de addnewcommendemendance Fonction, Calculez Le Point où l'utilisateur a Cliqué sur la photo. LE SERVEUR NÉCESSITE UNE VALEUR DE POURCENTAGE ENTITIÈRE RONDE LORSQUESQUES EST ENREGRÉ.

 Const Photo = E.Target
 .getboundingClientRect ();
const top = e.clientex - photo.left;
const gauuche = e.clienty - Photo.Top;
const toppc = maths.round ((Haut /
 photo.width) * 100);
const Gaucherpc = math.Round ((Gauche /
 photo.height) * 100); 

14. DITES À REDUX SUR LE COMMENTAIRE

AVEC LA POSITION Calculée, NOUS Devons Devons Superite Dire à Redux sur Le Commentaire Afin Qui Puisse Afficher le Formulaire de commentataire. Il existe Déjà une action Configurée Pour Ajouter Le Nouveau Commentaire à l'Écran. Ajouteur addnewcommendemendance nuque MapDispatchtoprops ET Appelez-le Après AVOIR Calculé La Position du Clic.

 Ceci.Props.AddNewComment (
 Toppc, Gaucher);
[...]
Exportateur const de mapdispatchtoprops =
 Dispatch = & GT; ({
addnewcommendement: (Haut, Gauche) = & GT;
Dépêche (addNewComment (Haut, Gauche)),
});

15. Teller La Photo du Nouveau Commentaire

LORSQUES DE NOUVELLES INFORMATIONS DE COMMENTAIRE SON TENDER À RECHUX, NOUS DevONS LE DevONS LE TRANSPÉTRES DANS LE COMPOSANT DE PRÉSENTATION Photo. Cela Lui Permet de Montre Le Formulaire à la position de la Cette. Pointe le GetNewComment Sélectreur, ajustz-le à MapstationToprops et transmettre l'CEDER à & lt; photo & gt; .

 Exporteur ConstToStaxoprops =
 (État, accessoires) = & gt; ({
NOUVEAUCOMMENT: GetNewComment (State),
});
& lt; Photo [...] NewComment = {
 cela.props.Newgment} / & gt; 

16. Appelez Thunk en commentaires

Get started with Redux Thunk: Call thunk in comment

[DIX] [DIX]
Créez ONU THUNK pour AJOUTER UN COMMENTAIRE À UNE Photo

En Cliquant sur la photo maintenante, Fera Apparáître Le Nouveau Formulaire de commentataire. Ceci est Son Propres Composant Connectés. Lorsque Le Formulaire Est Soumis, Il appelle Une Envoyer un commentataire Fonctionner Fonction et EST PASSÉ. C'est Un Thunk Qued Ferons. S'ouvrir CONNUTEUR / NOUVEAUCOMMENT / NOUVELCOMMENT.JS et ajouter le thunk à MapDispatchtoprops . Passeur Cela Dans Le Composant Présentant Rendu.

 & lt; Nouveau commentaire [...]
 Soumettre-Commentaire = {SpumitComment} / & GT;
Exportateur const de mapdispatchtoprops =
 Dispatch = & GT; ({
SpumetCommente: commentataire = & gt; envoi (
Soumettre (commentataires))
});

17. RECUEILLIR DU CONTENU POUR THUNK

Le Thunk à Ajouter Un nouveau commentataire UNE STRUCTURE SIMILAIRE À LA RÉCUPÉRATION DE LA GALERIE, Y COMPREND UNE ACTION DE DÉPART, DE SUCS SUCLÈS ET D'ERREUR. Il y un argument de l'ONU Supprenmentaire transmis danse Thunk - Le escarpadère Fonction. Permet Cela Un Accès Direct à l'État Actuel Afin de Saisir des Données. Créer le Envoyer un commentataire nuque Actions / NOUVEAUCOMMENT / NOUVELCOMMENT.JS . Chaque Commencer Est Associé à une photo et à un utilisateur. Pour le tutoriel, L'ID UTILISATEUR EST CODÉ DUR DANS LA utilisateur Réducteur.

 Export Const SubmitComment = commentataire
 = & gt; (Dispatch, GetState) = & GT; {
Expédition (SubmitCommermentStart ());
const Actuellehooid =
GetCurrentPhotoid (GetState ());
const utilisateur =
GetCurrentatuser (GetState ());
const {gauche, top} =
GetNewComment (GetState ());
}; 

18. Posez la Demande

AVEC TOUTES LES DONNÉES NÉCESSAIRES EN PLACE, NOUS POUVONS SOUMETTRE LE COMMENTAIRE. Axios un ONU Publier Méthode verser TRAITER AVEC Publier Les Demandes, AVEC Le DUXIÈME ARGUMENT ÉTANT LES DONNÉES À ENVOYER DANS CETTE Demande. Ajoutez la Demande au Thunk, en passant des Données dans l'Étui de serpent Pour le correspondre à ce que le serveur.

 Renvoyer Axios
.Publier (
"http: // localhost: 3001 / commentataires", {
user_id: user.id,
photo_id: Couranthotoïïbe,
commentateur,
gauche,
Hauteur
}) 

19. Gérer Le Succès et L'Erreur

Si la Promesse d'Axios Résout ou Rejet, nous devons Dree à l'application à ce sujet. S'IL EST RÉSOLU AVEC Succès, Le serveur transmettra le Contenu du commentataire. NOUS Devtions Transmettre CELA AVEC L'ACTION DE RÉUSSITE. S'IL EST REJETÉ, INCENDIZEZ UNE Action d'Erreur. METTRE À JOUR LA PROMESSE AVEC alors ET Capturer Blocs.

 .chen (({Data: {
 id, commentataire, gauche, top}}) = & gt;
envoi (
Soumettre des chances (
id, commentataire, gauche, Haut,
Utilisateur, ActuelPhotoïïde)
)
)
.Catch (() = & GT; Expédition (
 SubmitCommermentError ())); 

20. AJOUTER UN COMMENTAIRE À LA PHOTO

Get started with Redux Thunk: Add comment to photo

[DIX] [DIX]
Modificateur Les Photos Réducteur Afin Que Les Commentaires Apparaissent Immédiité

À L'Heure d'Heure Actuelle, UNE FOIS QUE LE COMMENTAIRE EST AJOUTE AVEC Succès, Il est Effacé de l'Écran Mais N'est Pas Visible Tant Que la page Vous Rafraîchit. NOUS POUVONS METTRE À JOUR LES PHOTOS RÉCHUCTEUR POUR OBTENIR LE NOUVECH COMMENTAIRE ET L'AJOTEUR À SON Tableau de Commentaires, à Afficher comme le ReSTE D'ENTRE EUX. Ouvrez le Réducteur / des Photos / des Photos.Js et Ajoutez Un Cas Pour Gérer L'Action. Créez UNE Copie de l'État pour vous VOUS Assurer que vous NOUS NE NE NE MUTATEZ PAS Accidentellement L'État existant.

 CAS SOUMETTRE_COMMENT_SUCCESS:
const {id, commentataire, Haut, Gauche,
utilisateur, photodide} = action.payload;
const Newstate = json.parse (
JSON.Stringify (État));
Const photo = newstate.find (
photo = & gt; photo.id === photoïde);
photo.comments.push ({
Id, commentataire, gauche, haut, utilisateur
});
Retournetate de retour; 

21. CACHER LES AUTRES COMMENTAIRES

Enfin, SI UN AUTRE COMMENTAIRE EST OVERT ET QUE L'UTILISATEUR SOUHAITE AJOUHAITE AJOUTER UNNVEAU COMMENTAIRE, L'interface Utilisateur Devient Tropbrebree. NOUS DevRions Cacher La Boîte de Commentaire SI NOUVEAU COMMENTAIRE EST EN COURS DE COMPOSITION. NOUS POUVONS Accrocher à l'existant Add_new_comment action pour effacer le commentataire Évaluer. SE Diriger vers vers Réducteur / ui / ui.js ET AJOUTER UN CAS POUR CELA.

 Affaire add_new_commande:
revenir {
... Etat,
COMMENTOPEN: Non Défini
};

Article CET A Été Publié à l'Origine Dans Le Numérro 283 de Creative Web Design Magazine Concepteur web . Achetez le Numéro 283 ICI or Abonnez-vous à la concepteur Web ICI .

Articles Liènes:

  • 5 API JavaScript Génial
  • Développeur des composants RéactifS Rétactes Réutilisables
  • 9 des Meilleurs Cadres JavaScript
[DIX] [DIX]
[DIX]

Comment - Most Popular Articles

22 meilleurs outils de conception UI

Comment Feb 6, 2026

[DIX] [DIX] [DIX] [dix] (Crédit d'image: invision) [DIX] UNE Sélection des Meilleu..


Comment scénario dans Photoshop

Comment Feb 6, 2026

[DIX] [DIX] [DIX] [dix] (Crédit d'image: Mark Evan Lim) [DIX] Le Storyboarding Dans..


Comment ajouter des polices de Photoshop

Comment Feb 6, 2026

[DIX] [DIX] [DIX] [dix] (Crédit d'image: Adobe) [DIX] Polices dans Photosh..


Comment rechercher Photoshop quelqu'un dans une image

Comment Feb 6, 2026

[DIX] [DIX] [DIX] [dix] (Crédit d'image: Future, Matt Smith) [DIX] Appommendre à s..


Krita Tutoriels: Apprenez les bases du logiciel d'art numérique

Comment Feb 6, 2026

Page 1 sur 2: Didacticiel Krita: DU COUVERTURE VOLEUR CHEMIN AUTOUR [DIX] [dix] Didacticiel Krita: DU COUVERTURE VOLEUR CHEMIN AUTOUR ..


Comment redimensionner une image dans Photoshop

Comment Feb 6, 2026

[DIX] [DIX] [DIX] [dix] [DIX] Savoir Redimensionnerner Une image dans Photoshop est une compétition Fond..


Créer des textures fantomatiques avec des techniques mixtes-médiatiques

Comment Feb 6, 2026

[dix] [dix] [dix] [dix] Quand je suis d'abord passé d'un flux de travail traditionnel à un illustra..


Comment mélanger des crayons de couleur

Comment Feb 6, 2026

Apprendre à mélanger des crayons de couleur vous aidera à obtenir davantage de vos outils. Plutôt que de compter sur l'individu, la couleur plate de chaque crayon, nous pouvons les mélan..


Catégories