Me gustaría preguntar por qué mi estado no cambia cuando hago un evento onclick. Hace un tiempo busqué que necesito vincular la función onclick en el constructor pero aún así el estado no se actualiza. Aquí está mi código:
import React from 'react';
import Grid from 'react-bootstrap/lib/Grid';
import Row from 'react-bootstrap/lib/Row';
import Col from 'react-bootstrap/lib/Col';
import BoardAddModal from 'components/board/BoardAddModal.jsx';
import style from 'styles/boarditem.css';
class BoardAdd extends React.Component {
constructor(props){
super(props);
this.state = {
boardAddModalShow: false
}
this.openAddBoardModal = this.openAddBoardModal.bind(this);
}
openAddBoardModal(){
this.setState({ boardAddModalShow: true });
// After setting a new state it still return a false value
console.log(this.state.boardAddModalShow);
}
render() {
return (
<Col lg={3}>
<a href="javascript:;" className={style.boardItemAdd} onClick={this.openAddBoardModal}>
<div className={[style.boardItemContainer,style.boardItemGray].join(' ')}>
Create New Board
</div>
</a>
</Col>
)
}
}
export default BoardAdd
javascript
reactjs
ecmascript-6
Lotería de Sydney
fuente
fuente
setState
no devuelve una promesa. Si funcionó, solo funcionó porqueawait
introduce un "tick" asincrónico en la función, y sucedió que la actualización de estado se procesó durante ese tick. No esta garantizado. Como dice esta respuesta , debe usar la devolución de llamada de finalización (si realmente necesita hacer algo después de que se actualice el estado, lo cual es inusual; normalmente, solo desea volver a renderizar, lo que sucede automáticamente).Respuestas:
Esta devolución de llamada es realmente complicada. Simplemente use async await en su lugar:
fuente
setState
no devuelve una promesa.setState
no devuelve una promesa, por lo que NO se debe esperar. Dicho esto, creo que puedo ver por qué esto funciona para algunas personas, porque await coloca el funcionamiento interno de setState en la pila de llamadas antes que el resto de la función, por lo que se procesa primero y, por lo tanto, parece que el estado ha sido conjunto. Si setState tenía o implementa nuevas llamadas asincrónicas, esta respuesta fallaría. Para implementar esta función correctamente, puede usar esto:await new Promise(resolve => this.setState({ boardAddModalShow: true }, () => resolve()))
async this.setState({})
resolvió mi problema? Teníamos código de trabajo, se ha hecho más desarrollo pero nada cambió esa parte de la aplicación. Solo uno de los dos objetos en setState se estaba actualizando, por lo que la funcionalidad devuelta asincrónica y ahora ambos objetos se están actualizando correctamente. No tengo ni idea de qué diablos estaba mal.Su estado necesita algo de tiempo para mutar y, dado que se
console.log(this.state.boardAddModalShow)
ejecuta antes de que el estado mute, obtiene el valor anterior como salida. Entonces necesitas escribir la consola en la devolución de llamada a lasetState
funciónsetState
es asincrónico. Significa que no puede llamarlo en una línea y asumir que el estado ha cambiado en la siguiente.Según los documentos de React
¿Por qué harían
setState
asyncfuente
Afortunadamente
setState()
recibe una devolución de llamada. Y aquí es donde obtenemos el estado actualizado.Considere este ejemplo.
Entonces, cuando se activa la devolución de llamada, this.state es el estado actualizado.
Puede obtener
mutated/updated
datos en la devolución de llamada.fuente
initMap()
, por ejemploDado que setSatate es una función asincrónica, debe consolar el estado como una devolución de llamada como esta.
fuente
setState()
no siempre actualiza inmediatamente el componente. Puede realizar la actualización por lotes o aplazarla hasta más tarde. Esto hace que leer this.state inmediatamente después de llamar asetState()
un error potencial. En su lugar, usecomponentDidUpdate
o unasetState
devolución de llamada (setState(updater, callback)
), cualquiera de los cuales está garantizado para activarse después de que se haya aplicado la actualización. Si necesita establecer el estado en función del estado anterior, lea sobre el argumento del actualizador a continuación.setState()
siempre dará lugar a una re-renderización a menos queshouldComponentUpdate()
devuelva falso. Si se están utilizando objetos mutables y no se puede implementar la lógica de representación condicionalshouldComponentUpdate()
, llamarsetState()
solo cuando el nuevo estado difiere del estado anterior evitará repeticiones innecesarias.El primer argumento es una función de actualización con la firma:
state
es una referencia al estado del componente en el momento en que se aplica el cambio. No debe mutarse directamente. En cambio, los cambios deben representarse mediante la construcción de un nuevo objeto basado en la entrada del estado y los accesorios. Por ejemplo, supongamos que quisiéramos incrementar un valor en el estado por props.step:fuente
Si desea realizar un seguimiento del estado que se está actualizando o no, la otra forma de hacer lo mismo es
De esta manera, puede llamar al método "_stateUpdated" cada vez que intente actualizar el estado para la depuración.
fuente
setState()
es asincrónico. La mejor manera de verificar si el estado se está actualizando sería en elcomponentDidUpdate()
y no poner unconsole.log(this.state.boardAddModalShow)
despuésthis.setState({ boardAddModalShow: true })
.según React Docs
fuente
Según React Docs
Ejemplo:
fuente
Para cualquiera que intente hacer esto con ganchos, necesita
useEffect
.Salida:
fuente
cuando estaba ejecutando el código y comprobando mi salida en la consola, mostraba que no estaba definido. Después de buscar y encontrar algo que funcionó para mí.
Agregué este método en mi código después de constructor (). Consulte el ciclo de vida del flujo de trabajo nativo de React.
https://images.app.goo.gl/BVRAi4ea2P4LchqJ8
fuente
fuente
Sí, porque setState es una función asincrónica. La mejor manera de establecer el estado justo después de escribir el estado establecido es utilizando Object.assign así: Por ejemplo, si desea establecer una propiedad isValid en true, hágalo así
Puede acceder al estado actualizado justo después de escribir esta línea.
fuente