Après avoir passé un peu de temps à apprendre React, je comprends la différence entre les deux paradigmes principaux de la création de composants.
Ma question est de savoir quand utiliser lequel et pourquoi? Quels sont les avantages/compromis de l'un sur l'autre?
Cours ES6:
import React, { Component } from 'react';
export class MyComponent extends Component {
render() {
return (
<div></div>
);
}
}
Fonctionnel:
const MyComponent = (props) => {
return (
<div></div>
);
}
Je pense fonctionnel à chaque fois qu’il n’ya aucun état à manipuler par ce composant, mais est-ce tout?
Je devine si j’utilise des méthodes de cycle de vie, il serait peut-être préférable d’utiliser un composant basé sur les classes.
Vous avez la bonne idée Allez avec fonctionnel si votre composant ne fait pas beaucoup plus que prendre dans certains accessoires et rendre. Vous pouvez les considérer comme des fonctions pures, car elles restitueront et se comporteront toujours de la même manière, avec les mêmes accessoires. En outre, ils ne se soucient pas des méthodes de cycle de vie ou ont leur propre état interne.
Parce qu'ils sont légers, l'écriture de ces composants simples en tant que composants fonctionnels est plutôt standard.
Si vos composants nécessitent davantage de fonctionnalités, telles que le maintien de l'état, utilisez plutôt les classes.
Plus d'infos: https://facebook.github.io/react/docs/reusable-components.html#es6-classes
Essayez toujours d'utiliser des fonctions sans état (composants fonctionnels) autant que possible. Il existe des scénarios dans lesquels vous devrez utiliser une classe React régulière:
shouldComponentUpdate
Il y a maintenant une classe React appelée PureComponent
que vous pouvez étendre (au lieu de Component
) qui implémente sa propre shouldComponentUpdate
qui prend en charge la comparaison des accessoires superficiels pour vous. en savoir plus
UPDATE mars 2019
https://overreacted.io/how-are-function-components-different-from-classes/
UPDATE de février 2019:
Avec l'introduction de React hooks , il semble que les équipes React veulent que nous utilisions des composants fonctionnels chaque fois que cela est possible (ce qui correspond mieux à la nature fonctionnelle de JavaScript).
Leur motivation:
1.) It’s hard to reuse stateful logic between components
2.) Complex components become hard to understand
3.) Classes confuse both people and machines
Un composant fonctionnel avec crochets peut faire presque tout ce qu'un composant de classe peut faire, sans les inconvénients mentionnés ci-dessus.
Je recommande de les utiliser dès que vous le pouvez.
Réponse originale
Les composants fonctionnels ne sont pas plus légers que les composants basés sur des classes, "ils fonctionnent exactement comme des classes". - https://github.com/facebook/react/issues/5677
Le lien ci-dessus est un peu daté, mais la documentation de React 16.7.0 indique que les composants fonctionnels et de classe:
"sont équivalents du point de vue de React." - https://reactjs.org/docs/components-and-props.html#stateless-functions
Il n'y a pratiquement pas de différence entre un composant fonctionnel et un composant de classe qui implémente simplement la méthode de rendu, à l'exception de la syntaxe.
À l'avenir (citant le lien ci-dessus) "nous [React] pourrions ajouter de telles optimisations."
Si vous essayez d’améliorer les performances en éliminant les rendus inutiles, les deux approches fournissent une assistance. memo
pour les composants fonctionnels et PureComponent
pour les classes.
- https://reactjs.org/docs/react-api.html#reactmemo
- https://reactjs.org/docs/react-api.html#reactpurecomponent
C'est vraiment comme tu veux. Si vous voulez moins de passe-passe, allez fonctionnel. Si vous aimez la programmation fonctionnelle et n'aimez pas les cours, optez pour la fonctionnalité. Si vous voulez une cohérence entre tous les composants de votre base de code, optez pour les classes. Si vous êtes fatigué de passer des composants fonctionnels aux composants basés sur les classes lorsque vous avez besoin de quelque chose comme state
, optez pour les classes.
A partir de React 16.8, le terme Composants fonctionnels sans état est trompeur et doit être évité car ils ne sont plus sans état ( React.SFC déconseillé) , Dan Abramov sur React.SFC ), ils peuvent avoir un état, ils peuvent avoir des crochets (qui agissent comme des méthodes de cycle de vie) ainsi, ils chevauchent plus ou moins les composants de classe.
Composants basés sur la classe
Composants fonctionnels:
Pourquoi je préfère les composants Funtional
componentDidMount
, componentDidUpdate
et componentWillUnmount
.Réagissez motivation pourquoi utiliser des crochets (c'est-à-dire des composants fonctionnels)