Maison >interface Web >js tutoriel >Composants React : classe vs fonctionnel.
Mon parcours React a commencé il y a quatre ans avec les composants fonctionnels et les Hooks. Puis est arrivé 'Siswe, un autre participant au bootcamp et notre passionné des composants de classe résidente. Alors que le reste d'entre nous collaborions sur des projets d'équipe avec des composants fonctionnels, 'Siswe s'accrochait aux composants de classe avec une loyauté inébranlable.
Considérez-les comme des briques Lego : vous pouvez les combiner de différentes manières pour créer des structures complexes. Ce sont des morceaux de code indépendants et réutilisables qui encapsulent l'interface utilisateur et la logique.
La réutilisation d'un composant au sein d'un autre composant ressemble généralement à ceci :
import MyComponent from './MyComponent'; function ParentComponent() { return ( <div> <MyComponent /> </div> ); }
Les composants de classe et les composants fonctionnels sont les deux principaux moyens de créer des composants dans React.
import React, { Component } from 'react'; class Counter extends Component { constructor(props) { super(props); this.state = { count: 0 }; } handleClick = () => { this.setState({ count: this.state.count + 1 }); }; render() { return ( <div> <p>You clicked {this.state.count} times</p> <button onClick={this.handleClick}>Click me</button> </div> ); } } export default Counter;
Il s'agit d'un composant de classe, créé à l'aide de classes JavaScript qui étendent la classe React.Component.
import React, { useState } from 'react'; function Counter() { const [count, setCount] = useState(0); const handleClick = () => { setCount(count + 1); }; return ( <div> <p>You clicked {count} times</p> <button onClick={handleClick}>Click me</button> </div> ); } export default Counter;
Il s'agit en revanche d'un composant fonctionnel, écrit comme une simple fonction JavaScript.
Les composants de classe gèrent leur propre état interne à l'aide de this.state. Ceci est généralement initialisé dans le constructeur, accessible à l'aide de l'objet this.state et mis à jour à l'aide de la méthode this.setState, comme indiqué dans le bloc de code ci-dessus.
Les composants fonctionnels étaient initialement apatrides. Mais avec l’introduction des Hooks, ils ont acquis la capacité de gérer la logique d’état et de cycle de vie. Utilisant le hook useState pour gérer l'état, il renvoie une paire de valeurs : l'état actuel et une fonction pour le mettre à jour, comme vu ci-dessus. Cela suffit pour une gestion simple de l’État. Pour une logique d'état plus complexe impliquant plusieurs sous-valeurs, ou lorsque l'état suivant dépend du précédent, vous souhaitez utiliser useReducer.
Par exemple :
import React, { useReducer } from 'react'; const initialState = { count: 0, step: 1, }; const reducer = (state, action) => { switch (action.type) { case 'increment': return { ...state, count: state.count + state.step }; case 'decrement': return { ...state, count: state.count - state.step }; case 'setStep': return { ...state, step: action.payload }; default: throw new Error(); } }; function Counter() { const [state, dispatch] = useReducer(reducer, initialState); const increment = () => dispatch({ type: 'increment' }); const decrement = () => dispatch({ type: 'decrement' }); const setStep = (newStep) => dispatch({ type: 'setStep', payload: newStep }); return ( <div> <p>Count: {state.count}</p> <p>Step: {state.step}</p> <button onClick={increment}>+</button> <button onClick={decrement}>-</button> <input type="number" value={state.step} onChange={(e) => setStep(Number(e.target.value))} /> </div> ); } export default Counter;
Ici, useReducer gère plusieurs valeurs d'état et une logique de mise à jour complexe de manière structurée et maintenable. Les crochets sont exclusivement destinés aux composants fonctionnels.
Ne modifiez ou ne mute jamais directement l'objet d'état, quel que soit le type de composant. Créez plutôt un nouvel objet avec les valeurs mises à jour. Cette approche permet à React de suivre efficacement les modifications et d'optimiser les nouveaux rendus.
Exemple de composant fonctionnel :
import React, { useState } from 'react'; function UserProfile() { const [user, setUser] = useState({ name: 'Jane Doe', age: 30 }); const handleNameChange = (newName) => { setUser({ ...user, name: newName }); // Create a new object with updated name }; return ( <div> <p>Name: {user.name}</p> <p>Age: {user.age}</p> <input type="text" value={user.name} onChange={(e) => handleNameChange(e.target.value)} /> </div> ); } export default UserProfile;
Exemple de composant de classe :
import React, { Component } from 'react'; class UserProfile extends Component { state = { user: { name: 'Jane Doe', age: 30 } }; handleNameChange = (newName) => { this.setState(prevState => ({ user: { ...prevState.user, name: newName } // Create a new object with updated name })); }; render() { return ( <div> <p>Name: {this.state.user.name}</p> <p>Age: {this.state.user.age}</p> <input type="text" value={this.state.user.name} onChange={(e) => this.handleNameChange(e.target.value)} /> </div> ); } } export default UserProfile;
Dans les deux exemples, nous mettons à jour la propriété name de l'objet utilisateur tout en préservant l'intégrité de l'objet d'origine. Cela garantit qu'un nouvel objet d'état est créé, préservant l'immuabilité et évitant les problèmes potentiels liés aux mises à jour d'état. Le respect de cela garantit un comportement prévisible, des optimisations de performances et un débogage plus facile.
L'approche fonctionnelle est généralement considérée comme plus concise et lisible, et elle suffit souvent pour des raisons de simplicité et d'efficacité. Cependant, les composants de classe offrent plus de contrôle sur la gestion des états et les méthodes de cycle de vie, en particulier lorsqu'il s'agit de logique complexe ou d'optimisation des performances. Cela signifie une meilleure structure pour organiser une logique complexe.
Le choix entre les composants de classe et les composants fonctionnels n'est pas toujours clair, car il n'y a pas de règle stricte. Évaluez les exigences de votre composant et optez pour le type qui correspond le mieux aux exigences de votre projet.
Avec quel composant aimez-vous le plus travailler ?
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!