Tiempo 3:45–4:00
La app que has creado hoy funciona con un único ciclo: estado (State) → pantalla (Var) → evento (manejador) → cambio de estado. Por mucho que crezca una app de Reflex, lo único que hace es añadir más vueltas a este ciclo.
| Concepto | En el código | La frase que debes recordar |
|---|---|---|
| Componente | rx.box(hijo, prop=valor) | Los argumentos posicionales son hijos; los de palabra clave, propiedades |
| Página | app.add_page(index, on_load=...) | Una página = una función |
| State | class State(rx.State) | Anotación de tipo obligatoria; memoria del servidor por sesión |
| Var | State.users.length() | Dentro de una función de pantalla es una expresión, no un valor |
| Bucles y condiciones | rx.foreach, rx.cond | En lugar de for e if con Vars |
| Evento | @rx.event def add_user(self, ...) | La única forma de cambiar el estado; Python de verdad |
| Formulario | rx.form(on_submit=...) + name= | name es la clave de form_data |
| Componente controlado | open= + on_open_change= | El setter lo defines tú (0.10) |
| computed var | @rx.var def ...() -> tipo | Un valor calculado a partir de otro estado |
| Gráfico | rx.recharts.bar_chart(data=...) | Los datos son list[dict] |
| Síntoma | Causa | Solución |
|---|---|---|
TypeError: object of type '...Var' has no len() | len() sobre una Var en una función de pantalla | .length() |
VarTypeError: Cannot convert Var ... to bool | if / and / or sobre una Var | rx.cond(...) |
VarTypeError: Cannot iterate over Var | for sobre una Var | rx.foreach(...) |
AttributeError: ... has no attribute 'set_xxx' | Dar por hecho que hay setters automáticos (materiales antiguos) | Define el setter tú mismo con @rx.event |
| Se añaden datos aunque pulses el botón de cancelar | Dentro de un formulario, el type por defecto de un botón es submit | type="button" |
TypeError: __init__() got an unexpected keyword argument | El name de un campo no coincide con el nombre del campo del dataclass | Haz que los nombres sean idénticos |
| El diálogo no se abre | Hay open= pero falta on_open_change | Úsalos siempre juntos |
| El gráfico está vacío | No hay ningún momento en que se rellenen los datos del gráfico | Registra on_load o usa una computed var |
3 hábitos de depuración
uv run reflex compile --dry. Sin arrancar el servidor, encuentra rápidamente errores de sintaxis y de Vars en el código de pantalla.print() dentro de los manejadores. Los manejadores son Python que se ejecuta en el servidor, así que print(form_data) aparece en la terminal del servidor. Un print dentro de una función de pantalla solo se muestra una vez, al arrancar la app.Están ordenados por dificultad. Cada reto profundiza en uno de los conceptos que has aprendido hoy.
rx.icon("trash-2")) al final de cada fila y, al pulsarlo, borra ese cliente. Pista: pasa un argumento así, on_click=lambda: State.delete_user(user.email).value= + on_change= (componente controlado) y muestra en la tabla la lista filtrada con una computed var. Prueba on_change=State.set_search.debounce(300) para que solo busque cuando se deje de escribir.rx.toast.error y no cierres el diálogo.Customer con SQLModel, léela en on_load y escribe en ella en add_user. Los clientes deben seguir ahí después de recargar la página o reiniciar el servidor. Se instala con uv add "reflex[db]", y en Reflex 0.10 se recomienda usar SQLModel directamente en lugar de rx.Model.@rx.page(route="/customers/[id]") y añade una página de detalle del cliente.models.py, state.py, components/ y pages/ para que siga siendo fácil de mantener a medida que crece.reflex run --env prod y despliega en Reflex Cloud o en tu propio servidor (Docker).rx.Model o rx.App(theme=...), así que comprueba la versión antes de seguirlas.Recibe avisos de nuevas lecciones
Te avisaremos por correo cuando este curso tenga lecciones nuevas o se abra un curso de continuación.
R
ReflexKR
Aprende Python y Reflex haciendo. Todos los ejemplos se ejecutaron y verificaron en Reflex 0.10.0.
ReflexKR es gratis y sin banners publicitarios. Si te ayudó, puedes apoyarlo con un café. ☕ Invítanos un café
Aviso de afiliados© 2026 ReflexKR · Since 2026 · CC BY-NC 4.0
Preguntas y respuestas
Pregunta lo que quieras sobre esta lección. Aquí se reúnen las preguntas de todas las versiones de idioma de esta página.