Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

115
Vistas
Por qué la acción mobX no activa la reproducción del componente React

Tengo un comportamiento extraño de MobX.

Aquí está mi tienda en el archivo store.tsx . Puedes encontrarlo también como sandbox .

 import { action, makeObservable, observable} from "mobx"; export default class ViewStore { currentProjectId: string | undefined = undefined; constructor() { makeObservable(this, { currentProjectId: observable, setCurrentProjectId: action, }); } setCurrentProjectId = (projectId: string | undefined) => { this.currentProjectId = projectId; }; }

Y aquí está mi componente.

 import React from "react"; import { observer } from "mobx-react-lite"; import { useParams } from "react-router-dom"; import ViewStore from "./store"; interface Props { localStore: ViewStore; } interface UrlParams { projectId: string; } function AppManageProject({ localStore }: Props) { const urlParams = useParams<UrlParams>(); if (localStore.currentProjectId !== urlParams.projectId) { localStore.setCurrentProjectId(urlParams.projectId); return <></>; } return ( <div>{localStore.currentProjectId}</div> ); } export default observer(AppManageProject);

La página es parte de una aplicación más grande y se accede a ella desde la ruta /<project id> . Cuando navega por primera vez a, por ejemplo, /prj1 , se ejecuta el bloque if, por lo que el currentProjectId observable se establece en "prj1" a través de la acción setCurrentProjectId . Espero que el cambio del observable desencadene una nueva representación, donde ahora urlParams.projectId === localStore.currentProjectId . Pero el componente en realidad no se vuelve a renderizar.

En el sandbox , desde la impresión en la consola, puede ver que ingresa en el bloque if, pero la representación no se activa.

Tenga en cuenta que si en lugar de llamar a la acción setCurrentProjectId directamente, uso una devolución de llamada, por ejemplo, setTimeout(() => localStore.setCurrentProjectId(urlParams.projectId), 0) entonces todo funciona.

Pensando que la devolución de llamada funciona porque usa una función de flecha, también traté de reemplazar

 localStore.setCurrentProjectId(urlParams.projectId)

con una llamada a una función de flecha:

 ( () => localStore.setCurrentProjectId(urlParams.projectId) ) ()

Pero esto tampoco funciona.

¿Alguien tiene alguna explicación/solución de lo que está pasando? Gracias

about 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Por alguna razón, MobX no vuelve a renderizar los componentes si actualiza algún elemento observable dentro de la función de renderizado. No sé exactamente por qué, pero los efectos secundarios dentro de la función de renderizado son un mal patrón de todos modos, por lo que tiene sentido que no funcione.

Lo que puede hacer para que su código sea más idiomático es usar el gancho useEffect para los efectos secundarios, así:

 function AppManageProject({ localStore }: Props) { const urlParams = useParams<UrlParams>(); useEffect(() => { localStore.setCurrentProjectId(urlParams.projectId); }, [urlParams.projectId]); if (localStore.currentProjectId !== urlParams.projectId) { return <></>; } return <div>{localStore.currentProjectId}</div>; }
about 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda