Dans React, existe-t-il de réelles différences entre ces deux implémentations? Certains amis me disent que le FirstComponent est le modèle, mais je ne vois pas pourquoi. Le SecondComponent semble plus simple car le rendu n'est appelé qu'une seule fois.
Première:
import React, { PropTypes } from 'react'
class FirstComponent extends React.Component {
state = {
description: ''
}
componentDidMount() {
const { description} = this.props;
this.setState({ description });
}
render () {
const {state: { description }} = this;
return (
<input type="text" value={description} />
);
}
}
export default FirstComponent;
Seconde:
import React, { PropTypes } from 'react'
class SecondComponent extends React.Component {
state = {
description: ''
}
constructor (props) => {
const { description } = props;
this.state = {description};
}
render () {
const {state: { description }} = this;
return (
<input type="text" value={description} />
);
}
}
export default SecondComponent;
Mise à jour: j'ai changé setState () en this.state = {} (merci joews), Cependant, je ne vois toujours pas la différence. Est-ce que l'un est meilleur que l'autre?
javascript
reactjs
components
Levy Moreira
la source
la source
this.state = { isVisible: props.isVisible }
c'est logique. Dépend de la façon dont l'application distribue l'état de l'interface utilisateur.Réponses:
Il convient de noter qu'il s'agit d'un anti-modèle pour copier des propriétés qui ne changent jamais en état (accédez simplement à .props directement dans ce cas). Si vous avez une variable d'état qui changera éventuellement mais commence par une valeur de .props, vous n'avez même pas besoin d'un appel de constructeur - ces variables locales sont initialisées après un appel au constructeur du parent:
Ceci est un raccourci équivalent à la réponse de @joews ci-dessous. Il semble ne fonctionner que sur les versions plus récentes des transpilateurs es6, j'ai eu des problèmes avec cela sur certaines configurations de webpack. Si cela ne fonctionne pas pour vous, vous pouvez essayer d'ajouter le plugin babel
babel-plugin-transform-class-properties
, ou vous pouvez utiliser la version non abrégée de @joews ci-dessous.la source
Vous n'avez pas besoin d'appeler
setState
un composantconstructor
- il est idiomatique de définirthis.state
directement:Voir React docs - Ajout d'un état local à une classe .
Il n'y a aucun avantage à la première méthode que vous décrivez. Il en résultera une deuxième mise à jour immédiatement avant de monter le composant pour la première fois.
la source
setState
si vous le mutez à tout autre moment, sinon les modifications risquent de ne pas s'afficher.super(props)
dans le constructeur. Discussion sur SOMise à jour de React 16.3 alpha introduite
static getDerivedStateFromProps(nextProps, prevState)
( docs ) en remplacement decomponentWillReceiveProps
.https://reactjs.org/docs/react-component.html#static-getderivedstatefromprops
Il est statique, donc il n'a pas d'accès direct à
this
(cependant il a accès àprevState
, qui pourrait stocker des choses normalement attachées parthis
exemplerefs
)modifié pour refléter la correction de @ nerfologist dans les commentaires
la source
getDerivedStateFromProps
(marquez la lettre majuscule dans les accessoires) et les paramètres sontnextProps
,prevState
(pasnextState
): reactjs.org/docs/…getDerivedStateFromProps
est toujours appelé avant le rendu initial?Vous pouvez utiliser le formulaire court comme ci-dessous si vous souhaitez ajouter tous les accessoires pour indiquer et conserver les mêmes noms.
la source
définir les données d'état à l'intérieur du constructeur comme ceci
cela ne fonctionnera pas si vous définissez la méthode side componentDidMount () via les accessoires.
la source
la source
state = props
. Plus d'informations ici: github.com/facebook/react/pull/11658#issuecomment-419677176vous pouvez utiliser la
key
valeur pour réinitialiser l'état en cas de besoin, passer des accessoires pour indiquer que ce n'est pas une bonne pratique, car vous avez un composant non contrôlé et contrôlé en un seul endroit. Les données doivent être gérées en un seul endroit lire ce https://reactjs.org/blog/2018/06/07/you-probably-dont-need-derived-state.html#recommendation-fully-uncontrolled-component-with-a -cléla source
Vous pouvez utiliser componentWillReceiveProps.
la source
VOUS DEVEZ ÊTRE PRUDENT lorsque vous initialisez à
state
partirprops
du constructeur. Même s'il étaitprops
changé pour un nouveau, l'état ne serait pas changé car le montage ne se reproduirait plus.getDerivedStateFromProps
Existe donc pour cela.la source