Refactoriser le code React, c'est comme transformer une cuisine chaotique en un paradis culinaire bien organisé. Il s'agit d'améliorer la structure, la maintenabilité et les performances de votre application sans modifier ses fonctionnalités. Que vous soyez aux prises avec des composants volumineux ou une logique d'état enchevêtrée, un refactor bien planifié transforme votre base de code en une machine élégante et efficace.
Ce blog découvre des scénarios de refactoring courants, fournit des solutions concrètes et vous permet de libérer le véritable potentiel de votre application React.
Je. Qu'est-ce que le refactoring et pourquoi est-ce important ?
Le refactoring améliore la structure de votre code sans modifier ses fonctionnalités. Il ne s'agit pas de corriger des bugs ou d'ajouter des fonctionnalités, il s'agit d'améliorer votre code pour les humains comme pour les machines.
Pourquoi refactoriser ?
- Lisibilité : Le débogage du code à 3 heures du matin devient beaucoup plus facile lorsqu'il se lit comme un bon roman plutôt que comme un puzzle énigmatique.
- Maintenabilité : Une base de code propre permet d'économiser des heures de temps d'intégration et d'accélérer les mises à jour.
- Performances : Un code plus propre se traduit souvent par des temps de chargement plus rapides et une expérience utilisateur plus fluide.
? Conseil de pro : Évitez les optimisations prématurées. Refactorisez lorsqu'il y a un besoin évident, comme améliorer l'expérience des développeurs ou résoudre les rendus lents.
II. Renifler les odeurs de code
Les odeurs de code sont des signaux subtils d'inefficacité ou de complexité. Ce ne sont pas des erreurs, mais elles indiquent des domaines à améliorer.
Odeurs courantes du code React
-
Composants gonflés
- Problème : Un seul composant gère trop de responsabilités, comme la récupération des données, le rendu et la gestion des événements.
function ProductPage() { const [data, setData] = useState([]); useEffect(() => fetchData(), []); const handleAddToCart = () => { ... }; return ( <div> {data.map(item => <productitem key="{item.id}" item="{item}"></productitem>)} <button onclick="{handleAddToCart}">Add to Cart</button> </div> ); }
- Solution : Divisez-le en composants plus petits et ciblés.
function ProductPage() { return ( <div> <productlist></productlist> <cartbutton></cartbutton> </div> ); } function ProductList() { const [data, setData] = useState([]); useEffect(() => fetchData(), []); return data.map(item => <productitem key="{item.id}" item="{item}"></productitem>); } function CartButton() { const handleAddToCart = () => { ... }; return <button onclick="{handleAddToCart}">Add to Cart</button>; }
-
Perçage d'hélices
- Problème : Passage des accessoires à travers plusieurs couches de composants.
<app> <productlist product="{product}"></productlist> </app>
- Solution 1 :Utiliser la composition.
<productlist> <productitem product="{product}"></productitem> </productlist>
- Solution 2 :Utilisez le contexte.
const ProductContext = React.createContext(); function App() { const [product, setProduct] = useState({ id: 1, name: 'Example Product' }); // Example state return ( <productcontext.provider value="{product}"> <productlist></productlist> </productcontext.provider> ); } function ProductList() { const product = useContext(ProductContext); return <productitem product="{product}"></productitem>; }
-
Enfer ternaire imbriqué
- Problème : Rendu conditionnel complexe utilisant des ternaires imbriqués.
return condition1 ? a : condition2 ? b : condition3 ? c : d;
- Solution : Refactorisez à l'aide de fonctions d'assistance ou d'instructions switch.
function renderContent(condition) { switch (condition) { case 1: return a; case 2: return b; case 3: return c; default: return d; } } return renderContent(condition);
-
Logique en double
- Problème : Répéter la même logique entre les composants.
function calculateTotal(cart) { return cart.reduce((total, item) => total + item.price, 0); }
- Solution : Déplacez la logique partagée vers des utilitaires réutilisables ou des hooks personnalisés.
function calculateTotalPrice(cart) { return cart.reduce((total, item) => total + item.price, 0); } function useTotalPrice(cart) { return useMemo(() => calculateTotalPrice(cart), [cart]); }
-
État excessif
- Problème : Gestion directe de l'état dérivé.
const [isLoggedIn, setIsLoggedIn] = useState(user !== null);
- Solution : Utilisez plutôt l'état dérivé.
const isLoggedIn = !!user; // Converts 'user' to boolean
III. Simplifier la gestion de l'État
La gestion de l'État est essentielle mais peut vite devenir chaotique. Voici comment le simplifier :
État dérivé : calculer, ne pas stocker
- Problème : Stockage de l'état redondant.
- Solution : Calculez les valeurs dérivées directement à partir de la source.
const [cartItems, setCartItems] = useState([]); const totalPrice = cartItems.reduce((total, item) => total + item.price, 0);
Utilisez useReducer pour un état complexe
- Problème : Plusieurs États interdépendants.
- Solution : Utilisez useReducer.
const initialState = { count: 0 }; function reducer(state, action) { switch (action.type) { case 'increment': return { count: state.count + 1 }; default: return state; } } const [state, dispatch] = useReducer(reducer, initialState);
Colocation d'État
- Problème : État global utilisé pour les données locales.
- Solution : Rapprochez l’état de l’endroit où il est nécessaire.
// Before: function App() { const [filter, setFilter] = useState(''); return <productlist filter="{filter}" onfilterchange="{setFilter}"></productlist>; } // After: function ProductList() { const [filter, setFilter] = useState(''); return <filterinput value="{filter}" onchange="{setFilter}"></filterinput>; }
IV. Composants de refactorisation
Les composants doivent faire un seul travail et bien le faire. Par exemple :
Un travail par composant
function MemberCard({ member }) { return ( <div> <summary member="{member}"></summary> <seemore details="{member.details}"></seemore> </div> ); }
V. Optimisation des performances
React Profiler
Utilisez le Profiler pour identifier les goulots d'étranglement. Accédez-y dans les outils de développement sous « Profiler ».
Mémoisation
Optimisez les calculs coûteux :
function ProductPage() { const [data, setData] = useState([]); useEffect(() => fetchData(), []); const handleAddToCart = () => { ... }; return ( <div> {data.map(item => <productitem key="{item.id}" item="{item}"></productitem>)} <button onclick="{handleAddToCart}">Add to Cart</button> </div> ); }
Remarque : Évitez d'abuser de la mémorisation pour les dépendances fréquemment mises à jour.
VI. Refactorisation pour la testabilité
Écrire des tests centrés utilisateur :
function ProductPage() { return ( <div> <productlist></productlist> <cartbutton></cartbutton> </div> ); } function ProductList() { const [data, setData] = useState([]); useEffect(() => fetchData(), []); return data.map(item => <productitem key="{item.id}" item="{item}"></productitem>); } function CartButton() { const handleAddToCart = () => { ... }; return <button onclick="{handleAddToCart}">Add to Cart</button>; }
VII. Touches finales pour la maintenabilité
- Organiser par fonctionnalité :
<app> <productlist product="{product}"></productlist> </app>
- Utiliser les importations absolues :
<productlist> <productitem product="{product}"></productitem> </productlist>
VIII. Aide-mémoire
Category | Tip |
---|---|
Code Smells | Split bloated components; avoid prop drilling. |
State Management | Use derived state; colocate state. |
Performance | Use Profiler; optimize Context values. |
Testing | Test behavior, not implementation details. |
Conseil
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Explication détaillée de la méthode de remplacement de la chaîne JavaScript et de la FAQ Cet article explorera deux façons de remplacer les caractères de chaîne dans JavaScript: le code JavaScript interne et le HTML interne pour les pages Web. Remplacer la chaîne dans le code JavaScript Le moyen le plus direct consiste à utiliser la méthode Remplace (): str = str.replace ("trouver", "remplacer"); Cette méthode remplace uniquement la première correspondance. Pour remplacer toutes les correspondances, utilisez une expression régulière et ajoutez le drapeau global G: str = str.replace (/ fi

Des fonctions JavaScript simples sont utilisées pour vérifier si une date est valide. fonction isValidDate (s) { var bits = s.split ('/'); var d = new Date (bits [2] '/' bits [1] '/' bits [0]); return !! (d && (d.getMonth () 1) == bits [1] && d.getDate () == Number (bits [0])); } //test var

Cet article explique comment utiliser jQuery pour obtenir et définir les valeurs de marge et de marge intérieures des éléments DOM, en particulier les emplacements spécifiques de la marge extérieure et des marges intérieures de l'élément. Bien qu'il soit possible de définir les marges intérieures et extérieures d'un élément à l'aide de CSS, l'obtention de valeurs précises peut être délicate. // installation $ ("div.header"). CSS ("marge", "10px"); $ ("div.header"). css ("padding", "10px"); Vous pourriez penser que ce code est

Cet article explore dix onglets jQuery exceptionnels et accordéons. La principale différence entre les onglets et les accordéons réside dans la façon dont leurs panneaux de contenu sont affichés et cachés. Plongeons ces dix exemples. Articles connexes: 10 plugins de l'onglet jQuery

Découvrez dix plugins jQuery exceptionnels pour élever le dynamisme et l'attrait visuel de votre site Web! Cette collection organisée offre diverses fonctionnalités, de l'animation d'image aux galeries interactives. Explorons ces outils puissants: Related Posts: 1

HTTP-Console est un module de nœud qui vous donne une interface de ligne de commande pour exécuter les commandes HTTP. C'est idéal pour le débogage et voir exactement ce qui se passe avec vos demandes HTTP, qu'elles soient faites contre un serveur Web, Web Serv

Ce tutoriel vous montre comment intégrer une API de recherche Google personnalisée dans votre blog ou site Web, offrant une expérience de recherche plus raffinée que les fonctions de recherche de thème WordPress standard. C'est étonnamment facile! Vous pourrez restreindre les recherches à Y

L'extrait de code jQuery suivant peut être utilisé pour ajouter des barres de défilement lorsque le contenu DIV dépasse la zone de l'élément de conteneur. (Pas de démonstration, veuillez le copier directement sur Firebug) // d = document // w = fenêtre // $ = jQuery var contentArea = $ (this), wintop = contentArea.scrollTop (), docheight = $ (d) .height (), winheight = $ (w) .height (), divheight = $ ('# c


Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Dreamweaver CS6
Outils de développement Web visuel

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Adaptateur de serveur SAP NetWeaver pour Eclipse
Intégrez Eclipse au serveur d'applications SAP NetWeaver.

mPDF
mPDF est une bibliothèque PHP qui peut générer des fichiers PDF à partir de HTML encodé en UTF-8. L'auteur original, Ian Back, a écrit mPDF pour générer des fichiers PDF « à la volée » depuis son site Web et gérer différentes langues. Il est plus lent et produit des fichiers plus volumineux lors de l'utilisation de polices Unicode que les scripts originaux comme HTML2FPDF, mais prend en charge les styles CSS, etc. et présente de nombreuses améliorations. Prend en charge presque toutes les langues, y compris RTL (arabe et hébreu) et CJK (chinois, japonais et coréen). Prend en charge les éléments imbriqués au niveau du bloc (tels que P, DIV),

Télécharger la version Mac de l'éditeur Atom
L'éditeur open source le plus populaire
