Teniendo este código en mente:
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')
);
¿No se supone que el estado cambiará solo después de 3 segundos? Está cambiando de inmediato.
Mi objetivo principal aquí es cambiar el estado cada 3 segundos (con setInterval()
), pero como no estaba funcionando, lo intenté setTimeout()
, que tampoco funciona. ¿Alguna luz sobre esto? ¡Gracias!
javascript
reactjs
jbarradas
fuente
fuente
foo(bar())
así,bar
se ejecuta primero y se pasa su valor de retornofoo
.foo()
aquí es exactamente para ejecutarbar
después del tiempo de espera deseado. ¿O estoy completamente equivocado y se ejecuta de inmediato y solo devuelve el valor después del tiempo deseado?bar
, no llamarlo y pasar su valor devuelto. ¿Esperabafoo(bar())
que cambiara el comportamiento de , dependiendo de lo quefoo
esté haciendo? Eso sería realmente extraño.Respuestas:
Hacer
De lo contrario, está pasando el resultado de
setState
asetTimeout
.También puede utilizar las funciones de flecha de ES6 para evitar el uso de
this
palabras clave:fuente
setTimeout(() => {this.setState({ position: 1 })}, 3000)
@PositiveGuy no estoy seguro si ha investigado esto por su cuenta desde que se publicó esta pregunta, pero en caso de que no lo haya hecho: el ejemplo original de Daniel debe.bind(this)
restringir elthis
contexto asetState
; de lo contrario ,this
automáticamente se referirá al contexto en el que se invoca (en este caso, el anónimo al quefunction
se pasasetTimeout
). Sin embargo, las funciones de flecha de ES6 tienen un ámbito léxico : se restringenthis
al contexto en el que se llaman.Lo anterior también funcionaría porque la función de flecha ES6 no cambia el contexto de
this
.fuente
this
.Cada vez que creamos un tiempo de espera, deberíamos borrarlo en componentWillUnmount, si aún no se ha disparado.
fuente
Sé que esto es un poco antiguo, pero es importante notar que React recomienda borrar el intervalo cuando el componente se desmonta: https://reactjs.org/docs/state-and-lifecycle.html
Entonces me gusta agregar esta respuesta a esta discusión:
fuente
setState
se invoca inmediatamente debido al paréntesis! Envuélvalo en una función anónima, luego llámelo:fuente
No dijiste quién llamó a setTimeout
Aquí se explica cómo se llama al tiempo de espera sin llamar a funciones adicionales.
1. Puede hacer esto sin realizar funciones adicionales.
Utiliza function.prototype.bind ()
setTimeout toma la ubicación de la función y la mantiene en el contexto.
2. Otra forma de hacer lo mismo incluso escribiendo menos código.
Probablemente use el mismo método de enlace en algún momento
¿El setTimeout solo toma la ubicación de la función y la función ya tiene el contexto? De todos modos, ¡funciona!
NOTA: Estos funcionan con cualquier función que use en js.
fuente
Su alcance de código (
this
) será suwindow
objeto, no su componente de reacción, y es por eso quesetTimeout(this.setState({position: 1}), 3000)
se bloqueará de esta manera.Eso viene de javascript, no de React, es un cierre de js
Entonces, para vincular el alcance del componente de reacción actual, haga esto:
O si su navegador es compatible con es6 o sus proyectos son compatibles con la compilación de es6 a es5, pruebe también la función de flecha, ya que la función de flecha es para solucionar 'este' problema:
fuente
Hay 3 formas de acceder al alcance dentro de la función 'setTimeout'
Primero,
El segundo es usar la función de flecha ES6, porque la función de flecha no tenía alcance (esto)
El tercero es vincular el alcance dentro de la función
fuente
Hizo un error de declaración de sintaxis, use la declaración setTimeout adecuada
fuente