J'ai une application où j'utilise Material UI et son fournisseur de thème (en utilisant JSS).
J'incorpore maintenant fullcalendar-react , qui n'est pas vraiment une bibliothèque React à part entière - c'est juste une fine enveloppe de composant React autour du code original fullcalendar.
C'est-à-dire que je n'ai pas accès à des choses comme les accessoires de rendu pour contrôler la façon dont il stylise ses éléments.
Cependant, il vous donne directement accès aux éléments DOM, via un rappel qui est appelé lors de leur rendu (par exemple, la méthode eventRender ).
Voici un sandbox de démonstration de base.
Maintenant, ce que je veux faire, c'est que les composants du calendrier complet (par exemple, les boutons) partagent le même aspect et la même sensation que le reste de mon application.
Une façon de le faire est que je pouvais remplacer manuellement tous les styles en regardant les noms de classe qu'il utilise et en implémentant le style en conséquence.
Ou - je pourrais implémenter un thème Bootstrap - comme suggéré dans leur documentation.
Mais le problème avec l'une ou l'autre de ces solutions est que:
- Ce serait beaucoup de travail
- J'aurais des problèmes de synchronisation, si j'apportais des modifications à mon thème MUI et que j'oubliais de mettre à jour le thème du calendrier, ils auraient l'air différents.
Ce que je voudrais faire, c'est:
- Convertissez comme par magie le thème MUI en thème Bootstrap.
- Ou créez un mappage entre les noms de classe MUI et les noms de classe de calendrier, quelque chose comme:
.fc-button = .MuiButtonBase-root.MuiButton-root.MuiButton-contained
.fc-button-primary= .MuiButton-containedPrimary
Cela ne me dérangerait pas d'avoir à masser les sélecteurs, etc. pour le faire fonctionner (par exemple. Par exemple - les boutons MUI ont deux portées internes, tandis que le calendrier complet n'en a qu'une). C'est surtout quand je change de thème - je ne veux pas avoir à le changer à deux endroits.
Utiliser quelque chose comme Sass avec sa @extend
syntaxe serait ce que j'ai en tête. Je pourrais créer le CSS complet du calendrier avec Sass assez facilement - mais comment Sass aurait-il accès au MuiTheme?
Je pourrais peut-être adopter l'approche inverse - dire à MUI 'Hé, ces noms de classe ici devraient être stylisés comme ces classes MUI'.
Avez-vous des suggestions concrètes sur la façon de résoudre ce problème?
la source
text-decoration
propriété au casque.style
balises MUI et de leur ajouter des.fc-
sélecteurs en fonction de la carte, mais ils ont des conflits dans les niveaux de base (tels quedisplay
,padding
etc.), donc je ne vois pas comment cela fonctionnera même si vous auriez le option pour le migrer dans scss. Par exemple: codesandbox.io/s/charming-sound-3xmj9Vous pouvez créer un mappage entre les noms de classe MUI et les noms de classe de calendrier en parcourant
ref
les. Il est possible que ce ne soit pas ce que certains appellent les "meilleures pratiques" ... mais c'est une solution :). Notez que j'ai mis à jour votre composant d'un composant fonctionnel vers un composant de classe, mais vous pouvez le faire avec des crochets dans un composant fonctionnel.Ajouter des références
Ajoutez un
ref
à l'élément MUI que vous souhaitez définir comme référence, dans votre cas, leButton
.Et un
ref
envelopperdiv
autour du composant que vous souhaitez mapper. Vous ne pouvez pas l'ajouter directement au composant car cela ne nous donnerait pas accès àchildren
.Classes de carte
De l'
componentDidMount()
ajout de la logique dont vous avez besoin pour cibler le nœud DOM correct (pour votre cas, j'ai ajouté la logique pourtype
etmatchingClass
). Exécutez ensuite cette logique sur tous les nœuds DOM FullCalendar et remplacez-leclassList
sur tous ceux qui correspondent.C'est peut-être un peu lourd, mais cela répond à vos exigences de preuve futures lorsque vous mettrez à jour l'interface utilisateur du matériel. Cela vous permettrait également de modifier
classList
lorsque vous le transmettez à un élément, ce qui présente des avantages évidents.Avertissements
Si le composant (mappé
FullCalendar
) a mis à jour les classes sur les éléments que vous ciblez (comme s'il avait ajouté.is-selected
à un bouton actuel) ou de nouveaux boutons après le montage, vous deviez trouver un moyen de suivre les modifications pertinentes et de réexécuter la logique.Je dois également mentionner que (évidemment) la modification des classes peut avoir des conséquences inattendues comme une rupture de l'interface utilisateur et vous devrez trouver un moyen de les corriger.
Voici le sandbox qui fonctionne: https://codesandbox.io/s/determ-frog-3loyf
la source