Je sais que définir un état sur componentDidMount
est un anti-modèle et qu'un état devrait être défini sur componentWillMount
, mais supposons que je veuille définir la longueur du nombre de balises li
comme état. Dans ce cas, je ne peux pas définir l'état sur componentWillMount
car les balises li
n'ont peut-être pas été montées au cours de cette phase. Alors, quelle devrait être la meilleure option ici? Est-ce que ça ira si je mets l'état sur componentDidMount
?
Appeler setState
dans componentDidMount
n'est pas un anti-modèle. En fait, ReactJS en fournit un exemple dans leur documentation :
Vous devez renseigner les données avec les appels AJAX dans la méthode de cycle de vie composantDidMount. Cela vous permet d'utiliser setState pour mettre à jour votre composant lorsque les données sont récupérées.
componentDidMount() {
fetch("https://api.example.com/items")
.then(res => res.json())
.then(
(result) => {
this.setState({
isLoaded: true,
items: result.items
});
},
// Note: it's important to handle errors here
// instead of a catch() block so that we don't swallow
// exceptions from actual bugs in components.
(error) => {
this.setState({
isLoaded: true,
error
});
}
)
}
Selon la React Documentation, il est tout à fait possible d'appeler setState()
à partir de la fonction componentDidMount()
.
render()
sera appelé deux fois, ce qui est moins efficace qu'un seul appel, mais cela ne pose aucun problème.
Vous pouvez trouver la documentation ici:
https://reactjs.org/docs/react-component.html
Voici l'extrait de la documentation:
Vous pouvez appeler setState () immédiatement dans composantDidMount (). Cela déclenchera un rendu supplémentaire, mais cela se produira avant que le navigateur ne mette à jour l'écran. Cela garantit que même si la render () sera appelée deux fois dans ce cas, l’utilisateur ne verra pas l’état intermédiaire. Utilisez ce modèle avec prudence car il provoque souvent des problèmes de performances ...
Si vous transmettez des accessoires à un composant et que vous souhaitez mettre à jour l'état en fonction d'accessoires, vous devez utiliser setTimeout ou setInterval, ou envoyer des demandes AJAX.
this.state = {
favourite: null,
job_applied: null,
}
componentDidMount() {
setTimeout(() => {
if (this.props.wishlist == true) {
this.setState({ favourite: true });
}
if (this.props.job_applied == true) {
this.setState({ job_applied: true });
}
}, 300)
}