¿Cuál es la diferencia entre el estado de la aplicación y el estado local del componente en Clojurescript Om?


He pasado por el tutorial básico Om de David Nolen, pero todavía estoy un poco confundido acerca de la diferencia entre el estado de la aplicación y el estado local del componente. Cuando se hace referencia a cursores, ¿también se refiere a uno o a ambos?

Author: Zubair, 2014-04-05

1 answers

Como yo lo entiendo:

El estado de la aplicación es el estado "global" al que todos los componentes del árbol de componentes pueden acceder, a través de cursores. Este es el estado en el que se encuentra su aplicación y básicamente lo que está siendo renderizado por Om. Así, por ejemplo, si está escribiendo un programa de chat, el estado de la aplicación contendría una lista de usuarios en la conversación y todos los mensajes que se han enviado, o lo que sea.

Componente el estado local es un estado que es local a un solo componente y no se puede ver fuera de este componente. Se establece pasando {: init-state } a build, o implementando IInitState y devolviendo un mapa desde init-state - o ambos (en este caso, se enlazan juntos). David Nolen recomienda que el estado local solo se use para el estado transitorio, como si el ratón se presiona actualmente en un componente de arrastrar y soltar y que todos los demás estados deben ser estado de aplicación. Es decir, si tiene un widget de pestaña, la pestaña seleccionada actualmente debe configurarse en estado de la aplicación (no estado local!), pero si la pestaña se arrastra a una nueva ubicación, la posición actual y el estado del ratón se almacenarán (temporalmente - hasta que se complete la operación de arrastre) en el estado local del componente. Cosas como core.los canales asincrónicos también se pueden almacenar en estado local (aunque también los he almacenado (y he visto a otros hacer lo mismo) en estado compartido y datos adicionales; consulte más abajo para obtener detalles sobre ambos)

Los cursores solo se aplican al estado de la aplicación y son como ventanas en es para que los componentes más abajo del árbol puedan acceder solo a los datos a los que realmente necesitan acceder.

El estado de la aplicación siempre se accede a través de un cursor (app en el tutorial) y la modificación del estado de la aplicación se realiza a través de un cursor - tanto om/update! y om / transact! tome un cursor como su primer argumento. También puede configurar el átomo de estado de la aplicación directamente con reset! y swap!, pero David recomienda en contra de esto, ya que al hacer que se pierde en algunos de los más avanzados de Om características (como ser notificado de deltas de cambio).

El estado local se puede recibir a través de IRenderState o accediendo directamente a él con om/get-state. Puede establecer el estado local con om / set-state! y om / upate-state!. Los tres toman un objeto de respaldo de componente (owner en el tutorial).

También hay un tercer tipo de estado en Om: estado compartido. El estado compartido se pasa a om / root usando {: shared ...} opción y se puede acceder desde cualquier componente en el árbol bajo esa raíz, usando om / get-shared. La diferencia entre esto y el estado de la aplicación es que el estado de la aplicación es reducido a través de las rutas del cursor, es decir, es posible que los subcomponentes no tengan acceso a todo el estado de la aplicación, mientras que el estado compartido siempre es accesible. Además, modificar el estado de la aplicación hace que el componente se vuelva a renderizar mientras que el estado compartido no desencadena renderizaciones.

Como un aparte, en realidad hay un cuarto tipo también - puede pasar datos adicionales a los componentes a través de la compilación usando el {: opts ...} opcion. Estos son datos que viven fuera del ciclo de vida de Om/react, es decir, sus datos inmutables a los que puede acceder desde un componente, pero el componente no los administra de ninguna manera. Esto parece ser más útil para los datos de configuración.

 70
Author: Dan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-22 04:16:51