Fermer

août 7, 2019

Une application Expense avec React et TypeScript


Les types sont désormais l'un des sujets les plus discutés dans toutes les communautés de développeurs. Les gens commencent à aimer taper leur code et à l’adapter en priorité dans leurs projets. En tapant notre code, nous obtenons un code plus sûr, plus concis et exempt d’erreurs basiques et stupides que nous pourrions rencontrer en développement.

Après avoir créé une application dans React avec TypeScript, vous trouverez TypeScript si agréable, ne voudrez pas commencer un autre projet sans cela. Nous pouvons très facilement configurer une application moderne en utilisant React et TypeScript – nous pouvons utiliser create-react-app et y ajouter TypeScript. Commençons donc avec notre application de dépenses.

Mise en route

Pour démarrer notre application de dépenses, nous allons utiliser create-react-app et ajouter un - texte dactylographié à la fin. . Donc, dans votre terminal, exécutez la commande suivante:

 créer-réagir-application dépenses-app --typescript 

Maintenant que nous avons notre projet, nous allons installer certaines dépendances dont nous aurons besoin. Nous utiliserons formik et yup pour notre validation de formulaire, et dinero.js pour formater nos valeurs. Pour que yup et dinero.js travaillent avec TypeScript, nous devons ajouter les définitions TypeScript pour chaque dépendance. Donc, dans votre terminal, exécutez la commande suivante:

 fil add formik yup @ types / yup dinero.js @ types / dinero.js 

Maintenant que tout est configuré, nous allons créer les composants pour notre application. Créons donc notre structure de dossiers.

Helpers

Premièrement, nous allons configurer la structure de dossiers de notre projet. Nous allons avoir la structure suivante:

 depenses-app
|
| - construire
| - node_modules
| - public
| | - favicon.ico
| | - index.html
| | - manifest.json
| - src
| | - composants
| | - Ajouter
| | - Budget
| | - Dépenses
| | - aides
| | - types
| | - crochets
| - .gitignore
| - package.json
| - tsconfig.json
| - README.md 

Ceci va être notre structure de dossiers. Dans notre dossier types nous allons créer un fichier index.ts . Et à l'intérieur de ce fichier, nous créerons une interface pour chaque dépense dont nous aurons besoin:

 interface d'exportation Dépense {
  type: chaîne;
  valeur: nombre;
  description: string;
} 

Nous avons donc maintenant une interface pour chaque Dépense que nous allons créer plus tard. Chaque dépense peut avoir les propriétés, de type value et description .

À l'intérieur du dossier de . , créez un crochet personnalisé appelé useBudget . Créez également un fichier, useBudget.ts dans lequel nous importerons le crochet useState de React et notre interface Expense :

 import {useState} de 'réagir';
importer {Expense} de '../types/index';

Next, créons un hook personnalisé appelé useBudget :

 const useBudget = () => {
  const [expenses, setExpenses] = useState ([]);
  // ...

Notre application de dépenses ressemblera beaucoup à une tâche: nous aurons une fonction pour ajouter une dépense et une fonction pour supprimer une dépense. Aussi simple que cela. Créons une fonction appelée addExpense () pour ajouter une dépense:

 const addExpense = (dépense: Dépense) => {
  const newExpenses = [...expenses, { expense }];
  setExpenses (newExpenses);
  console.log (newExpenses);

Comme dans cette fonction, nous allons créer une fonction permettant de supprimer une dépense, appelée deleteExpense () :

 const deleteExpense = (index: number) => {
  const newExpenses = [...expenses];
  newExpenses.splice (index, 1);
  setExpenses (newExpenses);

Notre crochet personnalisé final useBudget devrait ressembler à ceci:

 const useBudget = () => {
  const [expenses, setExpenses] = useState ([]);
  const addExpense = (dépense: Dépense) => {
    const newExpenses = [...expenses, { expense }];
    setExpenses (newExpenses);
    console.log (newExpenses);
  };
  const deleteExpense = (index: number) => {
    const newExpenses = [...expenses];
    newExpenses.splice (index, 1);
    setExpenses (newExpenses);
  };
  return {dépenses, addExpense, deleteExpense};

Maintenant que nous avons créé notre crochet personnalisé, nous allons dans le dossier helpers et créons deux (2) fichiers: formatExpense.ts et . .ts . formatExpense.ts contiendra une fonction permettant de formater des valeurs:

 importer Dinero de 'dinero.js';

const formatExpense = (montant: nombre) =>
  Dinero ({montant}). SetLocale ("en-US"). ToFormat ();
export default formatExpense; 

Assez simple. Nous avons importé Dinero et créé une fonction appelée formatExpense . Nous avons passé un montant comme argument à cette fonction et l'avons formaté dans le fichier en-US .

Passons maintenant au totals.ts et à l'intérieur de ce fichier allons avoir deux fonctions: totalValue () et totalAmount () . La fonction totalValue () va nous renvoyer la valeur totale de chaque valeur que nous avons, qu'il s'agisse d'un revenu ou d'une dépense. Alors maintenant, dans notre fichier, importons notre fonction formatExpense () que nous avons créée précédemment et créons notre totalValue () :

 import formatExpense depuis './formatExpense';

export const totalValue = (dépenses: n'importe lequel, type: chaîne de caractères) => {
  montant constant = dépenses
    .filter (({dépense}: tout) => dépense.type === type)
    .map (({dépenses}) => dépense.valeur)
    .reduce ((previousValue, currentValue) => previousValue + currentValue, 0);

  const formattedAmount = formatExpense (montant);
  renvoyer formattedAmount;

Dans cette fonction, nous avons deux arguments: les dépenses indiquent que nous allons réussir, et le type de valeur - soit un + qui signifie revenu ou a - qui signifie dépense. Après cela, nous allons renvoyer la valeur totale formatée à l'aide de la fonction formatExpense que nous avons créée.

Créons maintenant notre autre fonction appelée totalAmount qui va s'afficher. nous retourner le montant total que nous avons. Cela ressemblera beaucoup au précédent, créons donc notre fonction:

 export const totalAmount = (dépenses: quelconque) => {
  const totalIncomes = dépenses
    .filter (({dépenses}: aucun) => dépense.type === "+")
    .map (({dépenses}) => dépense.valeur)
    .reduce ((previousValue, currentValue) => previousValue + currentValue, 0);
  const totalExpenses = dépenses
    .filter (({dépense}: tout) => dépense.type === "-")
    .map (({dépenses}) => dépense.valeur)
    .reduce ((previousValue, currentValue) => previousValue + currentValue, 0);
  const totalAmount = formatExpense (totalIncomes - totalExpenses);
  return totalAmount;

Nous obtenons la valeur de notre revenu total et de nos dépenses totales et nous calculons leur montant total.

Maintenant que toutes nos fonctions d’aide sont prêtes, commençons par créer nos composants React. 19659036] Components

Passons maintenant à notre fichier principal, index.tsx dans notre dossier src et insérons le code suivant:

 import React, {Fragment} de 'réagir';
importer ReactDOM de 'react-dom';
importer l'application depuis './components/App';
importer * en tant que serviceWorker à partir de './serviceWorker';

ReactDOM.render (document.getElementById ('racine')); 

Maintenant que nous avons nos index.tsx tous configurés, passons à nos composants. dossier et créez un fichier App.tsx pour notre composant React principal. À l'intérieur de ce fichier App.tsx nous allons importer notre crochet personnalisé useBudget et le transmettre comme support à nos autres composants:

 import Réagissez à partir de 'react' ;
import Budget depuis './Budget/Budget';
importer Ajouter depuis './Add/Add';
importer Dépenses de './Prix/Frais';
importer useBudget de '../hooks/useBudget';

const App = () => {
  const {dépenses, addExpense, deleteExpense} = useBudget ();
  revenir (
    
); }; export default App;

Nous passons nos dépenses au composant Ajouter et dépenses, ainsi qu'à nos fonctions permettant d'ajouter et de supprimer une dépense. Passons maintenant à notre dossier Budget et, à l'intérieur de celui-ci, créez un fichier appelé Budget.tsx et mettez le code suivant:

 import React from 'react';
valeur d'importation de './Value/Value';
import Disponible à partir de './Available/Available';
import Montant de './Montre / Montant';
import {Dépenses} de '../../types/index';
import {totalValue, totalAmount} from '../../helpers/totals';

interface BudgetProps {
  dépenses: dépenses [];
}

budget const: React.FC  = ({dépenses}) => (
  
); export default default;

Dans notre budget nous avons trois composants: Available qui affichera le mois actuel, Value qui sera affiché soit la composante qui affiche le montant total que nous avons et une composante Montant qui va donner une valeur spécifique pour chaque type de revenus, à savoir dépense ou dépense que nous avons.

Alors maintenant, dans le budget Pour créer un dossier pour chaque composant: Available Value et Montant . Dans le dossier Value créez un fichier nommé Value.tsx et saisissez le code suivant:

 import React from 'react';

interface ValueProps {
  valeur: nombre;
}

const Valeur: React.FC  = ({valeur}) => (
  

{valeur}

) export default Value;

Maintenant, dans notre dossier Available créons un fichier nommé Available.tsx et insérons le code suivant:

 import React from 'react';

interface AvailableProps {
  mois: chaîne;
}

const Disponible: React.FC  = ({month}) => (
  

Budget disponible en {mois}:

) export default

Ensuite, dans notre dossier Montant créons un fichier nommé Montant.tsx et insérons le code suivant:

 import Réagissez à partir de 'react';
importer AmountValue de './AmountValue/AmountValue';
importer AmountType de './AmountType/AmountType';

interface AmountProps {
  montant: nombre;
  type: chaîne;
}

const Amount: React.FC  = ({montant, type}) => (
  
); export default Amount;

Et dans notre dossier, nous allons créer un dossier appelé AmountValue et un fichier à l'intérieur de ce dossier appelé AmountValue.tsx . Dans ce fichier, nous allons mettre le code suivant:

 import React from 'react';

interface AmountValueProps {
  montantValeur: nombre;
}

const AmountValue: React.FC  = ({montantValue}) => (
  

{montantValeur}

) export default AmountValue;

Nous sommes toujours dans le dossier Amount et nous allons créer le dernier dossier: AmountType . Créons également un fichier appelé AmountType.tsx avec le code suivant:

 import React from 'react';

interface AmountTypeProps {
  quantitéType: chaîne;
}

const AmountType: React.FC  = ({montantType}) => (
  

{amountType}

) export default default AmountType;

Avec le dossier Budget prêt, créez un fichier nommé Add.tsx dans le dossier Add . Dans ce fichier, nous allons utiliser formik et yup pour valider notre formulaire. Nous allons donc importer des éléments et créer des interfaces à utiliser dans notre formulaire:

 import Réagissez de 'réagir';
importer * comme Yup de 'yup';
import {withFormik, FormikProps} de 'formik';

interface FormValues ​​{
  type: chaîne;
  valeur: nombre;
  description: string;
}

interface OtherProps {
  frais: tous;
  addExpense: (dépense: Dépense) => any;
}

interface MyFormProps {
  frais: tous;
  addExpense: (dépense: Dépense) => any;
} 

Ensuite, nous allons créer un composant appelé InnerForm :

 const InnerForm = (accessoires: OtherProps & FormikProps ) => {
  const {
    valeurs,
    les erreurs,
    touché,
    handleChange,
    handleBlur,
    handleSubmit,
    est soumis
  } = props;

  revenir (
    
);

Dans le même fichier, ajoutons la validation de formulaire à l'aide de yup :

 const Add = withFormik  ({
  mapPropsToValues: () => ({
    type: "",
    valeur: 0,
    la description: ""
  }),
  validationSchema: Yup.object (). shape ({
    type: Yup.string (). required ("Nome 'obrigat'rio"),
    valeur: Yup.numéro (). requis ("Valeur obrigat'ria"),
    description: Yup.string (). required ("Description obrigat'ria")
  }),
  handleSubmit (
    {type, valeur, description}: FormValues,
    {props, setSubmitting}
  ) {
    setTimeout (() => {
      props.addExpense ({type, valeur, description});
      setSubmitting (false);
    }, 1000);
  }
}) (InnerForm);

export default Ajouter; 

Bien, notre formulaire est prêt à l'emploi. Alors maintenant, nous allons créer la dernière partie de notre application. Passons à notre dossier Dépenses . À l’intérieur de ce dossier, créez un fichier nommé Expense.tsx et deux autres dossiers: Income et Expense . . Dans notre fichier Expense.tsx mettons le code suivant:

 import React from 'react';
import Revenu de './Income/Income';
importer Dépenses de './Expense/Expense';

interface ExpensesProps {
  frais: tous;
  deleteExpense: (index: number) => any;
}

const Dépenses: React.FC  = ({dépenses, deleteExpense}) => (
  
); dépenses par défaut d'exportation;

Dans le dossier Income nous allons créer un fichier nommé Income.tsx et un dossier appelé IncomeItem . Dans Income.tsx mettons le code suivant:

 import Réagissez à partir de 'react';
importer IncomeItem à partir de './IncomeItem/IncomeItem';

interface IncomeProps {
  frais: tous;
  deleteExpense: any;
}

const Income: React.FC  = ({
  les frais,
  deleteExpense
}) => {
  const revenus = dépenses.filtre (({dépense}: aucune) => dépense.type === "+");
  revenir (
    

Income

{incomes.map (({dépenses}: aucun, index: nombre)> => (                    ))}       
); }; export default Income;

Maintenant, dans le dossier IncomeItem créons un fichier IncomeItem.tsx et insérons le code suivant:

 import React from 'react';
import formatExpense from '../../../../helpers/formatExpense';

interface IncomeItemProps {
  numéro d'index;
  type: chaîne;
  valeur: nombre;
  description: string;
  deleteExpense: (index: number) => any;
}

const IncomeItem: React.FC  = ({
  indice,
  type,
  valeur,
  la description,
  deleteExpense
}) => (
  
deleteExpense (index)}>     

{description}

{formatExpense (value)}

); export default IncomeItem;

Maintenant, passons à notre dossier Dépenses et créons un fichier Expense.tsx :

 import Réagissez à partir de 'réagir';
importer ExpenseItem de './ExpenseItem/ExpenseItem';

interface ExpenseProps {
  dépenses: ficelle;
  deleteExpense: (index: number) => any;
}

const Dépense: React.FC  = ({
  les frais,
  deleteExpense
}) => {
  const newExpenses = depenses.filter (({depense}: any) => depense.type === "-");
  revenir (
    

Dépense

{newExpenses.map (({dépense}: aucune, index: nombre)) => (                    ))}       
); }; export default Expense;

Enfin, le dernier composant de notre application! Créons un dossier appelé ExpenseItem et à l'intérieur de ce dossier, créons un fichier nommé ExpenseItem.tsx et insérons le code suivant:

 import React from 'rea';
import formatExpense from '../../../../helpers/formatExpense';

interface ExpenseItemProps {
  numéro d'index;
  type: chaîne;
  valeur: nombre;
  description: string;
  deleteExpense: (index: number) => any;
}

const ExpenseItem: React.FC  = ({
  indice,
  type,
  valeur,
  la description,
  deleteExpense
}) => (
  
deleteExpense (index)}>     

{description}

{formatExpense (value)}

); export default ExpenseItem;

Création d'applications avec KendoReact

Maintenant que notre application fonctionne correctement, si vous souhaitez créer une interface magnifique et magnifique, vous pouvez consulter KendoReact . KendoReact est une bibliothèque de composants d'interface utilisateur complète pour React, construite avec des composants réactifs et de grande qualité.

Elle comprend tous les composants nécessaires pour une application de base simple à une application complexe, ainsi avec KendoReact . vous pouvez vous concentrer sur l'essentiel dans votre application et ne plus essayer de créer des composants d'interface utilisateur complexes.

Conclusion

Dans cet article, nous avons créé dès le début une application de gestion des dépenses avec React et TypeScript. Composants, et également utilisé React Hooks pour traiter avec notre gestion de l'état. Ceci est une application simple, juste pour montrer à quel point React avec TypeScript peut être puissant.





Source link