Entonces, ¿cómo se construyen típicamente? Si alguna vez has tenido que abordar este patrón en el pasado, podrías haber buscado formularios multistep o un wizard de formularios para X, donde X es el framework de elección para tu producto. Sé que definitivamente busqué una solución así al comenzar este viaje en Betterment.
Naturalmente, miré la documentación y ejemplos de Formic, el gestor de estado de formularios de elección para React en Betterment. Mirando el repositorio de Formic, podemos encontrar un ejemplo de un wizard multistep que crea un componente wizard abstracto con componentes hijo de pasos de wizard. Esto permite una buena composición al dividir un formulario grande, y podría reutilizarse a través de características siempre que usen el mismo diseño. Una desventaja notable es la falta de enrutamiento. Así que el paso actual en el flujo se pierde si la página se recarga.
Y podemos ver nuestro componente wizard de nivel superior aquí, donde tenemos un array de pasos, y tenemos algunas acciones de siguiente y anterior para movernos a través del wizard. Tenemos nuestro manejador de envío, que permitirá que este paso declare su propio envío, y avanzaremos al siguiente paso a menos que estemos en el último paso, en cuyo caso realizamos un envío final. Y todo se recoge bajo un único contexto de formato con pasos individuales mostrados y nuestros botones de retroceso y envío realizando ya sea las acciones anteriores o siguientes. Y luego, como dije antes, todo se compondrá bajo el único wizard, pasos de wizard, y luego cada paso declarando los campos en los que se recopilan los valores que les importan.
Ahora, en el mismo repositorio, podemos encontrar ejemplos de formularios multistep con enrutamiento, uno usando pasos numerados y el otro usando pasos nombrados. Los pasos numerados proporcionan un beneficio de composición más simple como el primer ejemplo, aunque los números no son muy útiles como nombres de ruta para comunicar la intención del paso. Con los pasos nombrados, se pierde la capacidad de personalizar la validación y el envío del formulario por paso. Así que podemos ver aquí ubicaciones de ruta específicas para cada página. Todavía tenemos una base de wizard y ahora un componente de página asociado para pasar a través de los hijos en lugar de un componente de paso. Todavía tenemos nuestras acciones de siguiente y anterior, algo de validación, manejar el envío, lo que nos hace avanzar al siguiente. Y luego tenemos algo de lógica para mostrar nuestro contexto de Formic de alto nivel, nuestro formulario, la página activa, y luego esa acción de retroceso y envío nuevamente, todo compuesto bajo una única ruta con un wizard y sus páginas de wizard individuales, recopilando todos los campos en los que les importa. Y podemos ver nuestras páginas nombradas aquí, que tienen componentes de página individuales, que ahora enlazan al siguiente o incluso al paso anterior dentro del wizard, todo recopilado como rutas individuales bajo el enrutador de alto nivel alrededor de un único formulario.
La mayor debilidad de cada uno de estos ejemplos es lo vinculados que están a FormRec, lo cual en última instancia tiene sentido ya que estos son ejemplos para esta biblioteca. Sin embargo, muchos enfoques encontrados en línea promoverán patrones similares, especialmente con pasos sin enrutamiento. Todos están generalmente enfocados en moverse secuencialmente o en el orden en que se declaran. No es fácil ver cómo se pueden integrar rutas condicionales. Mirando las bibliotecas construidas para este propósito, nada parecía resolver todas las preocupaciones de construir flujos en Betterment, así que fue cuando decidí resolverlo yo mismo. Para ayudar a dirigir el trabajo hacia la construcción de esta nueva solución, se me ocurrieron tres directrices principales. La primera mantiene la idea de que las buenas experiencias web tienen URLs y se alinean con los flujos impulsados por Rails existentes que construimos en el pasado. La segunda fue aprender de los flujos existentes que los hicieron complejos de mantener en general. La última provino de observar nuestras necesidades en Betterment, y cómo los wizards pueden recopilar información pero no siempre es requerida por paso. Así que esta es la Dream API que vamos a implementar. Se parece mucho a lo que vimos antes con los ejemplos de Formic, donde tenemos un wizard de alto nivel y componentes de paso individuales que presentarán un conjunto de campos o lo que deseen hacer, y estos tienen nombres en lugar de números o estar sin nombre en absoluto.
Comments