Skip to content

El Motor de Renderizado

Sistema que controla cómo se renderiza cada tipo de componente — el "puente" entre componentes React/Vue y la lógica de presentación.

Renderer

El sistema de Renderer decide qué wrapper usar para cada tipo de componente:

Qué Son los Renderers:

Tipo de RendererFunciónUsado ParaEjemplo
fieldRenderiza campos de formularioInputText, Select, etc.Vincula al adapter de formulario, pasa props
buttonRenderiza botonesSubmitButtonComportamiento de botón
containerRenderiza contenedores de formularioFormGroup, SectionOrganiza layout
contentRenderiza contenido estáticoTítulos, labelsVisualización simple
menu-itemRenderiza ítems de menúMenuLink, MenuButtonNavegación (cuando se usa MenuFactory)
menu-containerRenderiza contenedores de menúMenuContainerJerarquía de menú
addonRenderiza addonsUI de complementoContenido suplementario

Cómo Funcionan:

Componente → Renderer → DOM

text
InputText Component → FieldRenderer → <input> + binding de formulario + props

El Renderer Añade:

  • Binding con adapter de formulario (ej. value, onChange del contexto de formulario Schepta)
  • Inyección de contexto (valores del formulario, contexto externo)
  • Transformación de props específica por tipo

Resultado: ¡Componentes enfocados en la UI, Renderers en la lógica de presentación!

Tipos de Renderer

Field Renderer - Campos de Formulario:

ResponsabilidadImplementaciónBeneficio
Integración con formularioAdapter de formulario (ej. useScheptaFormAdapter en React)value y onChange ligados al estado del formulario
PropsRecibe name, component, componentPropsRenderizado consistente de campos
Renderers customizadosOverride vía renderers.fieldUsar con React Hook Form, Formik, etc.

Container Renderer - Layout y Organización:

ResponsabilidadImplementaciónBeneficio
Orden de hijosOrdenación por x-ui.orderLayout automático
Filtrado de propsQuitar props de contenedorProps limpias
Gestión de seccionesAgrupar ítems relacionadosOrganización visual

Content y Button Renderers:

  • content: Contenido estático (títulos, texto). Procesamiento mínimo.
  • button: Componentes de botón (ej. SubmitButton). Tipo button en la spec del componente.

Cómo Funciona el Sistema

Pipeline de Resolución:

Schema JSON

Detectar Tipo (tipo de la spec: field, container, button, content, ...)

Elegir Renderer (Default → renderers de ScheptaProvider → renderers de la Factory)

Preparar Props (Merge + contexto)

Aplicar Middleware (ej. expresiones de template)

Renderizar (Renderer envuelve el componente)

Elemento React/Vue Final

Jerarquía de Resolución:

Cómo el sistema elige qué renderer usar:

PrioridadFuenteCuándo UsarEjemplo
1ª - DefaultBuilt-in de la factoryComportamiento por defectoDefaultFieldRenderer para tipo field
2ª - GlobalScheptaProviderPor defecto de la aplicación<ScheptaProvider renderers={{ field: AppFieldRenderer }} />
3ª - LocalProps de la factoryOverride por factory<FormFactory renderers={{ field: CustomField }} />

No existe una API separada "registerRenderer"; los renderers vienen de los defaults de la factory, luego de los renderers del Provider, luego de la prop renderers de la factory.

Por Qué Existen los Renderers

Separación de responsabilidades:

  • Componentes definen la UI (input, botón, contenedor).
  • Renderers los envuelven con binding de formulario, layout u otro comportamiento. El field renderer por defecto usa el adapter de formulario de Schepta para que los campos funcionen sin una biblioteca de formularios específica; puedes reemplazarlo por un renderer custom que use React Hook Form o Formik.

Conceptos Relacionados

Los renderers son el "motor" que conecta otros conceptos: