Ayant ce code à l'esprit:
var Component = React.createClass({
getInitialState: function () {
return {position: 0};
},
componentDidMount: function () {
setTimeout(this.setState({position: 1}), 3000);
},
render: function () {
return (
<div className="component">
{this.state.position}
</div>
);
}
});
ReactDOM.render(
<Component />,
document.getElementById('main')
);
L'état n'est-il pas censé changer seulement après 3 secondes? Cela change immédiatement.
Mon objectif principal ici est de changer l'état toutes les 3 secondes (avec setInterval()
), mais comme cela ne fonctionnait pas, j'ai essayé setTimeout()
, ce qui ne fonctionne pas non plus. Des lumières à ce sujet? Merci!
javascript
reactjs
jbarradas
la source
la source
foo(bar())
alorsbar
est exécuté en premier et sa valeur de retour est transmise àfoo
.foo()
ici est exactement à exécuterbar
après le délai d'expiration souhaité. Ou ai-je complètement tort et il s'exécute tout de suite, et ne renvoie la valeur qu'après l'heure souhaitée?bar
, ne pas l'appeler et transmettre sa valeur de retour. Vous attendiez-vous à ce que le comportement defoo(bar())
change, en fonction defoo
se passe? Ce serait vraiment étrange.Réponses:
Faire
Sinon, vous passez le résultat de
setState
àsetTimeout
.Vous pouvez également utiliser les fonctions fléchées ES6 pour éviter l'utilisation du
this
mot-clé:la source
setTimeout(() => {this.setState({ position: 1 })}, 3000)
@PositiveGuy ne sait pas si vous avez fait des recherches vous-même depuis que cette question a été publiée, mais au cas où vous ne l'auriez pas fait: l'exemple original de Daniel doit.bind(this)
restreindre lethis
contexte àsetState
- sinon ,this
fera automatiquement référence au contexte dans lequel il est invoqué (dans ce cas, l'anonymefunction
étant passé àsetTimeout
). Les fonctions fléchées ES6, cependant, ont une portée lexicale - elles se limitentthis
au contexte dans lequel elles sont appelées.Ce qui précède fonctionnerait également car la fonction de flèche ES6 ne change pas le contexte de
this
.la source
this
.Chaque fois que nous créons un timeout, nous devons l'effacer sur componentWillUnmount, s'il n'a pas encore été déclenché.
la source
Je sais que c'est un peu vieux, mais il est important de noter que React recommande d'effacer l'intervalle lorsque le composant se démonte: https://reactjs.org/docs/state-and-lifecycle.html
J'aime donc ajouter cette réponse à cette discussion:
la source
setState
est appelé immédiatement en raison de la parenthèse! Enveloppez-le dans une fonction anonyme, puis appelez-le:la source
Vous n'avez pas dit qui a appelé setTimeout
Voici comment appeler timeout sans appeler de fonctions supplémentaires.
1. Vous pouvez le faire sans effectuer de fonctions supplémentaires.
Utilise function.prototype.bind ()
setTimeout prend l'emplacement de la fonction et la conserve dans le contexte.
2. Une autre façon de faire la même chose même en écrivant encore moins de code.
Utilise probablement la même méthode de liaison à un moment donné
Le setTimeout prend uniquement l'emplacement de la fonction et la fonction a déjà le contexte? Quoi qu'il en soit, ça marche!
REMARQUE: ils fonctionnent avec toutes les fonctions que vous utilisez dans js.
la source
Votre portée de code (
this
) sera votrewindow
objet, pas votre composant de réaction, et c'est pourquoisetTimeout(this.setState({position: 1}), 3000)
se plantera de cette façon.Cela vient de javascript pas de React, c'est la fermeture de js
Donc, afin de lier votre portée actuelle du composant react, procédez comme suit:
Ou si votre navigateur prend en charge es6 ou que vos projets prennent en charge la compilation de es6 en es5, essayez également la fonction arrow, car arrow func est de résoudre ce problème:
la source
Il existe 3 façons d'accéder à la portée à l'intérieur de la fonction 'setTimeout'
Première,
La deuxième consiste à utiliser la fonction de flèche ES6, car la fonction de flèche n'avait pas de portée (ceci)
Le troisième est de lier la portée à l'intérieur de la fonction
la source
Vous avez fait une erreur de déclaration de syntaxe, utilisez la déclaration setTimeout appropriée
la source