pause - settimeout javascript
setTimeout en React Native (9)
Nunca llame a
setState
dentro del método derender
Nunca debe llamar a
setState
dentro del método de
render
.
¿Por qué?
llamar a
setState
finalmente
setState
el método de
render
nuevamente.
Eso significa que está llamando a setState (mencionado en su bloque de
render
) en un bucle que nunca terminaría.
La forma correcta de hacerlo es mediante el uso de hook
componentDidMount
en React, así:
class CowtanApp extends Component {
state = {
timePassed: false
}
componentDidMount () {
setTimeout(() => this.setState({timePassed: true}), 1000)
}
render () {
return this.state.timePassed ? (
<NavigatorIOS
style = {styles.container}
initialRoute = {{
component: LoginPage,
title: ''Sign In'',
}}/>
) : <LoadingPage/>
}
}
PS Utilice operadores ternarios para obtener un código más limpio, más corto y legible.
Estoy tratando de cargar una pantalla de inicio para una aplicación iOS integrada en React Native. Estoy tratando de lograr esto a través de estados de clase y luego una función setTimeout de la siguiente manera:
class CowtanApp extends Component {
constructor(props){
super(props);
this.state = {
timePassed: false
};
}
render() {
setTimeout(function(){this.setState({timePassed: true})}, 1000);
if (!this.state.timePassed){
return <LoadingPage/>;
}else{
return (
<NavigatorIOS
style = {styles.container}
initialRoute = {{
component: LoginPage,
title: ''Sign In'',
}}/>
);
}
}
}
La página de carga funciona por un segundo, y luego supongo que cuando setTimeout intenta cambiar el estado a verdadero, mi programa se bloquea: ''undefined no es un objeto (evaluando this.setState)''. He estado yendo a esto durante un par de horas, ¿alguna idea sobre cómo solucionarlo?
Cambia este código:
setTimeout(function(){this.setState({timePassed: true})}, 1000);
a lo siguiente:
setTimeout(()=>{this.setState({timePassed: true})}, 1000);
En ReactNative .53, lo siguiente funciona para mí:
this.timeoutCheck = setTimeout(() => {
this.setTimePassed();
}, 400);
''setTimeout'' es la función de la biblioteca ReactNative.
''this.timeoutCheck'' es mi variable para contener el objeto de tiempo de espera.
''this.setTimePassed'' es mi función para invocar en el tiempo de espera.
Error clásico de JavaScript.
setTimeout(function(){this.setState({timePassed: true})}, 1000)
Cuando
setTimeout
ejecuta
this.setState
, ya no se trata de
CowtanApp
, sino de
window
.
Si define la función con la notación
=>
, es6 lo enlazará automáticamente.
setTimeout(() => {this.setState({timePassed: true})}, 1000)
Alternativamente, puede usar
let that = this;
en la parte superior de su
render
, luego cambie sus referencias para usar la variable local.
render() {
let that = this;
setTimeout(function(){that.setState({timePassed: true})}, 1000);
Escribe una nueva función para settimeout. Por favor intente esto.
class CowtanApp extends Component {
constructor(props){
super(props);
this.state = {
timePassed: false
};
}
componentDidMount() {
this.setTimeout( () => {
this.setTimePassed();
},1000);
}
setTimePassed() {
this.setState({timePassed: true});
}
render() {
if (!this.state.timePassed){
return <LoadingPage/>;
}else{
return (
<NavigatorIOS
style = {styles.container}
initialRoute = {{
component: LoginPage,
title: ''Sign In'',
}}/>
);
}
}
}
Igual que el anterior, podría ayudar a algunas personas.
setTimeout(() => {
if (pushToken!=null && deviceId!=null) {
console.log("pushToken & OS ");
this.setState({ pushToken: pushToken});
this.setState({ deviceId: deviceId });
console.log("pushToken & OS "+pushToken+"/n"+deviceId);
}
}, 1000);
Parece haber un problema cuando la hora del teléfono / emulador es diferente a la del servidor (donde se está ejecutando el paquete nativo de reacción). En mi caso, hubo una diferencia de 1 minuto entre la hora del teléfono y la computadora. Después de sincronizarlos (no hizo nada lujoso, el teléfono se configuró en hora manual, y simplemente lo configuré para usar la red (sim) hora proporcionada), todo funcionó bien. This problema de github me ayudó a encontrar el problema.
Puede vincular
this
a su función agregando
.bind(this)
directamente al final de la definición de su función.
Reescribiría su bloque de código como:
setTimeout(function () {
this.setState({ timePassed: true });
}.bind(this), 1000);
const getData = () => { // some functionality } const that = this; setTimeout(() => { // write your functions that.getData() },6000);
La función Settimout simple se activa después de 6000 milisegundos