Comment formater son texte sur des composants React

Comment formater son texte sur des composants React
Alexandre P. dans Dev - mis à jour le 15-12-2024

Apprenez à formater proprement vos templates string en React et améliorer la lisibilité de vos composants frontend.

Si vous faîtes du frontend ReactJS, il est fort probable d'avoir du code qui ressemble à ceci :

<div className="flex flex-col items-center w-full px-20 mt-20">
      <div className="flex items-center pb-8">
        {Object.keys(totalSell).map((currency: string) => {
          return (
            <Badge
              key={currency}
              color={
                totalSell[currency] - totalBuy[currency] > 0 ? "green" : "red"
              }
              title={`Total Buy: ${totalBuy[currency].toFixed(2)} - 
              Total Sell: ${totalSell[currency].toFixed(2)}`}
              className="text-3xl"
            >
              {currency}:{" "}
              {(totalSell[currency] - totalBuy[currency]).toFixed(2)}
            </Badge>
          );
        })}
      </div>

Fonctionnellement tout est OK, ce composant s'affiche bien etc.

Mais vous ne trouvez pas cela perturbant d'avoir autant de balise dans une partie qui est sensé être composé que de strings ? 🤔

Lorsque je vois ça, il me faut un peut plus de temps pour me projeter sur ce à quoi cela peut ressembler au rendu. Aussi, je me dis que le code pourrait être bien plus lisible et structuré pour nos collègues. 💡

Quelque chose qui ressemble à ceci par exemple :

<div className="flex items-center pb-8">
        {Object.keys(totalSell).map((currency: string) => {
          return (
            <Badge
              key={currency}
              color={
                totalSell[currency] - totalBuy[currency] > 0 ? "green" : "red"
              }
              title={new TextFormatter(
                `Total Buy: %totalBuy% - Total Sell: %totalSell%`
              ).format({
                totalBuy: totalBuy[currency].toFixed(2),
                totalSell: totalSell[currency].toFixed(2),
              })}
              className="text-3xl"
            >
              {new TextFormatter(`%currency%: %balance%`).format({
                currency,
                balance: (totalSell[currency] - totalBuy[currency]).toFixed(2),
              })}
            </Badge>
          );
        })}
      </div>

Et pour arriver à ce résultat, je vais créer une classe TextFormatter comme ceci :

class TextFormatter {
  text: string;

  constructor(text: string) {
    this.text = text;
  }

  toString() {
    return this.text;
  }

  format(
    obj: Record<string, string | number>,
    options = { openTag: "%", closeTag: "%" }
  ) {
    let result = this.text;
    for (let key of Object.keys(obj)) {
      result = result.replace(
        new RegExp(`${options.openTag}${key}${options.closeTag}`, "g"),
        obj[key].toString()
      );
    }
    return result;
  }
}

export default TextFormatter;

Vous pouvez personnaliser les tags sur la méthode format en second paramètre :

new TextFormatter(`{{currency}}: {{balance}}`).format({
  currency,
  balance: (totalSell[currency] - totalBuy[currency]).toFixed(2),
}, { openTag: '{{', closeTag: '}}' })

Je ne vous cache pas que je garde tout de même, une préférence pour un texte sans brackets, donc j'éviterai de l'utiliser sous cette forme.

Voilà je pense qu'avec cela, vous serez en mesure de faire du texte plus lisible dans vos composants React. 😉

Bon code à vous !

#react#text#library

user picture

Alexandre P.

Développeur passionné depuis plus de 20 ans, j'ai une appétence particulière pour les défis techniques et changer de technologie ne me fait pas froid aux yeux.


Votre vie privée

Nous utilisons des cookies pour améliorer votre expérience sur notre site, analyser notre trafic et personnaliser les publicités. En cliquant sur "Accepter", vous consentez à l'utilisation de tous les cookies. Vous pouvez également choisir de refuser en cliquant sur le bouton "Refuser".