La siguiente función miembro rellena de forma asincrónica un objeto de folder_structure con datos falsos:
fake(folders_: number, progress_callback_: (progress_: number) => void = (progress_: number) => null): Promise<boolean> { return new Promise((resolve, reject) => { for (let i_ = 0; i_ < folders_; i_++) { progress_callback_(i_ / folders_ * 100.); this.add(this.id(), faker.address.city() + i_, random_choice(this.folder_structure_id())); } progress_callback_(folders_ / folders_ * 100.); resolve(true); }) } Utiliza una devolución de llamada para actualizar el progreso dentro del ciclo for que luego se usa para actualizar el estado (una barra de progreso) desde dentro de una función useEffect() con una matriz de dependencia vacía.
let [progress_state_, set_progress_state_] = useState<number>(0); let [fake_done_, set_fake_done_] = useState<boolean>(false); useEffect(() => { if (fake_) folder_structure_.fake(fake_, (progress_) => { set_progress_state_(progress_) }).then(value => set_fake_done_(value)); }, []) if (!fake_ || fake_done_) etc etc Sin embargo, el estado no se actualiza (el registro del progreso en la consola parece funcionar bien). ¿Alguna idea sobre si es posible actualizar un estado desde useEffect ?
La razón por la que su useEffect no funciona es que no se llama al cambio de estado de estado de progress_state_ .
En vez de
useEffect(() => { ... }, [])Prueba esto en su lugar
useEffect(() => { ... }, [progress_]) Agregar progress_ a la matriz de dependencias significa que se llamará a useEffect cada vez que cambie progress_ . Si lo deja como una matriz de dependencia vacía, useEffect solo se llama al principio cuando el código se monta en el DOM.
Aquí hay una buena explicación sobre las matrices de dependencia: https://devtrium.com/posts/dependency-arrays
Abordando su pregunta final: Sí, es posible actualizar el estado desde useEffect .
Para comprender la raíz de su problema principal, me gustaría ver cómo está realizando su registro. ¿Está iniciando sesión desde fake() o desde su función render() ?