Maison >interface Web >js tutoriel >Refactoring React : apprivoiser le chaos, un composant à la fois
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.
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.
? 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.
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.
function ProductPage() { const [data, setData] = useState([]); useEffect(() => fetchData(), []); const handleAddToCart = () => { ... }; return ( <div> {data.map(item => <ProductItem key={item.id} item={item} />)} <button onClick={handleAddToCart}>Add to Cart</button> </div> ); }
function ProductPage() { return ( <div> <ProductList /> <CartButton /> </div> ); } function ProductList() { const [data, setData] = useState([]); useEffect(() => fetchData(), []); return data.map(item => <ProductItem key={item.id} item={item} />); } function CartButton() { const handleAddToCart = () => { ... }; return <button onClick={handleAddToCart}>Add to Cart</button>; }
<App> <ProductList product={product} /> </App>
<ProductList> <ProductItem product={product} /> </ProductList>
const ProductContext = React.createContext(); function App() { const [product, setProduct] = useState({ id: 1, name: 'Example Product' }); // Example state return ( <ProductContext.Provider value={product}> <ProductList /> </ProductContext.Provider> ); } function ProductList() { const product = useContext(ProductContext); return <ProductItem product={product} />; }
return condition1 ? a : condition2 ? b : condition3 ? c : d;
function renderContent(condition) { switch (condition) { case 1: return a; case 2: return b; case 3: return c; default: return d; } } return renderContent(condition);
function calculateTotal(cart) { return cart.reduce((total, item) => total + item.price, 0); }
function calculateTotalPrice(cart) { return cart.reduce((total, item) => total + item.price, 0); } function useTotalPrice(cart) { return useMemo(() => calculateTotalPrice(cart), [cart]); }
const [isLoggedIn, setIsLoggedIn] = useState(user !== null);
const isLoggedIn = !!user; // Converts 'user' to boolean
La gestion de l'État est essentielle mais peut vite devenir chaotique. Voici comment le simplifier :
const [cartItems, setCartItems] = useState([]); const totalPrice = cartItems.reduce((total, item) => total + item.price, 0);
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);
// Before: function App() { const [filter, setFilter] = useState(''); return <ProductList filter={filter} onFilterChange={setFilter} />; } // After: function ProductList() { const [filter, setFilter] = useState(''); return <FilterInput value={filter} onChange={setFilter} />; }
Les composants doivent faire un seul travail et bien le faire. Par exemple :
function MemberCard({ member }) { return ( <div> <Summary member={member} /> <SeeMore details={member.details} /> </div> ); }
Utilisez le Profiler pour identifier les goulots d'étranglement. Accédez-y dans les outils de développement sous « Profiler ».
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} />)} <button onClick={handleAddToCart}>Add to Cart</button> </div> ); }
Remarque : Évitez d'abuser de la mémorisation pour les dépendances fréquemment mises à jour.
Écrire des tests centrés utilisateur :
function ProductPage() { return ( <div> <ProductList /> <CartButton /> </div> ); } function ProductList() { const [data, setData] = useState([]); useEffect(() => fetchData(), []); return data.map(item => <ProductItem key={item.id} item={item} />); } function CartButton() { const handleAddToCart = () => { ... }; return <button onClick={handleAddToCart}>Add to Cart</button>; }
<App> <ProductList product={product} /> </App>
<ProductList> <ProductItem product={product} /> </ProductList>
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. |
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!