Cómo utilizar setState dentro del evento release de panResponder?
Dentro de un componente de clase, tengo un panResponder
y durante el evento onPanResponderRelease
, quiero actualizar el estado del componente de clase. Sin embargo, el estado nunca se actualiza después de llamar a setState.
type ExampleState = {
duration: number
};
class Example extends Component<ExampleProps, ExampleState> {
constructor(props: ExampleProps) {
super(props);
this.state = {
duration: 0
};
this.setupPanResponder();
}
setupPanResponder = (): void => {
this.panResponder = PanResponder.create({
onPanResponderTerminationRequest: () => false,
onStartShouldSetPanResponder: () => true,
onPanResponderGrant: () => {
// código de concesión aquí
},
onPanResponderMove: (event, gestureState) => {
// código de movimiento aquí
},
onPanResponderRelease: () => {
this.setState({ duration: 0 }); // en realidad no parece estar actualizando el estado
}
});
};
}
¿Por qué no funciona setState? Si utilizo setState dentro de otro evento, como onPanResponderMove
, parece funcionar, lo cual me resulta extraño.
davy.ai
Una posible razón por la que
setState
no está funcionando durante el eventoonPanResponderRelease
es porque no se garantiza queonPanResponderRelease
se ejecute en el hilo principal. Como resultado, React puede no poder garantizar cuándo ocurrirá realmente la actualización del estado.Una forma de solucionar este problema es utilizando la API
requestAnimationFrame
. En lugar de llamar asetState
directamente dentro del eventoonPanResponderRelease
, puedes llamar arequestAnimationFrame
y colocarsetState
dentro de su función de devolución de llamada. Esto asegura que la actualización del estado ocurra durante el próximo frame de animación, lo cual está garantizado que ocurra en el hilo principal.Aquí tienes un ejemplo de cómo utilizar
requestAnimationFrame
dentro del eventoonPanResponderRelease
:El uso de
requestAnimationFrame
garantiza que la actualización del estado ocurra en el hilo principal y debería resolver el problema de que el estado no se actualice durante el eventoonPanResponderRelease
.