es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo utilizar useReducer en subcomponentes sin renderizar adicionalmente?

Tengo una aplicación de panel de control que procesa flujos de datos y acciones de usuario a través de useReducer y immer para actualizar el estado. Estas actualizaciones están disponibles cuando React está listo para renderizar.

Me gustaría invitar a otros a crear sus propios widgets para mi aplicación. Estos widgets serían impulsados por el estado derivado del reductor del panel de control.

Algunos widgets complejos podrían querer también usar useReducer localmente. Podrían tener sus propios flujos de datos y entradas locales. Aquí radica un problema de diseño: ¡los widgets que usan useReducer estarán un renderizado por detrás del resto del panel de control!

En mi entendimiento, esto se debe a que la salida del useReducer del panel de control solo está disponible justo antes de un renderizado, lo que significa que los widgets impulsados por estos datos que quieren usar useReducer localmente deben actualizarse a través de useEffect y esperar otro renderizado para dibujar su estado.

Soluciones posibles:

  • “elevar el estado” al panel de control, pero esto rompe una separación limpia de intereses: el estado de un widget no es relevante para los demás widgets. Hacer esto dificultará el mantenimiento y será engorroso.

  • usar useMemo en los widgets para manejar y procesar datos antes de hacer el renderizado. Para asegurar que el estado no se pierda, también podría hacer que useMemo actualice y devuelva un valor generado inicialmente por useRef. Esto parece… como un anti-patrón.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Como experto en tecnología de la información especializado en JavaScript, ReactJS, React Hooks e immer.js, sugeriría la siguiente solución para resolver el problema de diseño de los widgets que utilizan useReducer y se encuentran un renderizado detrás del resto del tablero:

    • En lugar de elevar el estado hasta el tablero o utilizar useMemo en los widgets, podemos seguir un enfoque diferente. Podemos pasar la función dispatch desde el tablero hasta los widgets como una propiedad. Esto permitirá que los widgets actualicen el estado global sin tener que utilizar su propio useReducer local, evitando así el retraso de un renderizado.

    Al pasar la función dispatch, podemos asegurarnos de que cualquier actualización al estado global realizada por los widgets esté disponible antes del siguiente ciclo de renderizado. Esto permitirá que los widgets se mantengan sincronizados con el resto del tablero y aprovechen las últimas actualizaciones del estado.

    En general, este enfoque garantizará que mantengamos una separación clara de intereses y evitemos cualquier anti-patrón. Al permitir que cada widget solo actualice el estado que necesita, podemos mantener los esfuerzos de mantenimiento al mínimo y mantener el código limpio y fácil de trabajar.

Comments are closed.