Antes de cualquier explicación, haz clic. Cada vez que pulses el botón de abajo, el número sube en 1. Al terminar esta lección podrás explicar cómo funcionan estas poco más de diez líneas de código.
import reflex as rx
class CounterState(rx.State):
count: int = 0
@rx.event
def increment(self):
self.count += 1
def counter_increment():
return rx.hstack(
rx.heading(CounterState.count, as_="h2"),
rx.button("Increment", on_click=CounterState.increment),
)localhost:3000
PruébaloEl código tiene tres partes.
| Parte | Código | Qué hace |
|---|---|---|
| State | class CounterState(rx.State) | La caja que guarda los datos que cambian (count) |
| Manejador de eventos | def increment(self) | La función que cambia los datos |
| Disparador de eventos | on_click=CounterState.increment | La conexión que dice "al pulsar, llama a esta función" |
Al pulsar el botón, increment se ejecuta en el servidor y, cuando count cambia, Reflex vuelve a dibujar por su cuenta solo las partes de la pantalla que usan ese valor. No hay ni una línea de código que modifique la pantalla directamente.
Toda app tiene datos que cambian con el tiempo: el número de un contador, si el usuario ha iniciado sesión, los productos del carrito. En Reflex, estos datos se guardan en una clase State.
rx.State y declara variables dentro. Estas variables se llaman Var (state var).count: int) y puede tener un valor por defecto (= 0).Para usar una Var en la interfaz, haz referencia a ella a través del nombre de la clase, como en MyState.count. Puedes pasarla como hijo o como valor de una prop.
class MyState(rx.State):
count: int = 0
color: str = "red"
def counter():
return rx.hstack(
# The heading `color` prop is set to the `color` var in MyState.
rx.heading("Count: ", as_="h2", color=MyState.color),
# The `count` var in `MyState` is passed as a child to the heading component.
rx.heading(MyState.count, as_="h2"),
)localhost:3000
Vista previaPuedes usar la misma Var en varios componentes. Cuando su valor cambia, todos los lugares que la usan se actualizan a la vez.
Para saber — Solo los manejadores de eventos pueden cambiar el State. En el código de la interfaz no puedes asignar un valor directamente, como en MyState.count = 5.
Los métodos definidos dentro del State que cambian los datos se llaman manejadores de eventos. Las props especiales de los componentes, como on_click, se llaman disparadores de eventos. Al conectar un disparador con un manejador, la pantalla responde a lo que hace el usuario.
Te recomendamos poner siempre @rx.event encima de cada manejador. Con este decorador, tu editor y el verificador de tipos comprueban "cuántos argumentos, y de qué tipo, hay que pasarle a este manejador", y así detectas errores antes de tiempo.
Igual que cualquier función, un manejador puede recibir argumentos. Vamos a crear botones que suman 1 y 5 usando un único manejador.
class CounterState2(rx.State):
count: int = 0
@rx.event
def increment(self, amount: int):
self.count += amount
def counter_variable():
return rx.hstack(
rx.heading(CounterState2.count, as_="h2"),
rx.button("Increment by 1", on_click=lambda: CounterState2.increment(1)),
rx.button("Increment by 5", on_click=lambda: CounterState2.increment(5)),
)localhost:3000
Pruébalolambda, como en lambda: CounterState2.increment(1), para dejar claro que significa "al pulsar, llama pasando 1".on_click=CounterState2.increment(1), funciona exactamente igual. Ese código no ejecuta el manejador en ese momento: solo crea la información del evento, que dice "al pulsar, ejecútalo con amount=1". El código del manejador se ejecuta en el servidor cuando se pulsa el botón.on_click no le pasa ningún valor al manejador, pero hay disparadores que sí lo hacen. on_blur le pasa al manejador el texto escrito cuando el campo de texto pierde el foco (al hacer clic en otro sitio o pulsar Tab).
class TextState(rx.State):
text: str = ""
@rx.event
def update_text(self, new_text: str):
self.text = new_text
def text_input():
return rx.vstack(
rx.heading(TextState.text, as_="h2"),
rx.input(default_value=TextState.text, on_blur=TextState.update_text),
)localhost:3000
PruébaloPara saber — El número de argumentos del manejador debe coincidir con el número de valores que pasa el disparador. on_blur pasa un valor, así que update_text recibe uno solo, new_text. Si no coinciden, obtendrás un error.
decrement a CounterState y crea un botón que reste 1 al número.counter_variable que devuelva count a 0. ¿Podrías hacerlo con un manejador que reciba argumentos?on_change en lugar de on_blur. El título cambiará con cada letra que escribas.NombreClase.nombre_variable.on_click pasándole un argumento.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.