R

ReflexKR

Documentación de Reflex

Fundamentos de Reflex, con las manos

·

Resumen del curso

1

Haz clic y cambia: State y eventos

2

Ahora lo ves: renderizado condicional

3

Dibujar listas: rx.foreach

4

¿Por qué no funciona if? Compilación vs. ejecución

5

Darle estilo: componentes, props y estilos

6

Apps, páginas y una cesta de frutas

Fundamentos de Reflex, con las manos
Lección 1

Tiempo 0:00–0:08

Haz clic y cambia: State y eventos

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ébalo

0

Pulsa Increment. El número sube de 1 en 1.

El código tiene tres partes.

ParteCódigoQué hace
Stateclass CounterState(rx.State)La caja que guarda los datos que cambian (count)
Manejador de eventosdef increment(self)La función que cambia los datos
Disparador de eventoson_click=CounterState.incrementLa 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.

1-1. State: donde viven los datos que cambian (2 min)

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.

  • Crea una clase que herede de rx.State y declara variables dentro. Estas variables se llaman Var (state var).
  • Toda Var debe llevar su tipo (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 previa

Count:

0

La Var color se usa como prop de color del texto y la Var count, como hijo.

Puedes 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.

1-2. Manejadores de eventos y @rx.event (2 min)

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.

  1. El usuario pulsa el botón (se activa el disparador de eventos).
  2. El manejador conectado se ejecuta en el servidor y cambia el State.
  3. Reflex envía el State actualizado al navegador y la pantalla se vuelve a dibujar.

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.

1-3. Manejadores de eventos con argumentos (2 min)

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ébalo

0

Los dos botones llaman al mismo manejador con valores distintos.
  • Este ejemplo envuelve la llamada en un lambda, como en lambda: CounterState2.increment(1), para dejar claro que significa "al pulsar, llama pasando 1".
  • Si escribes directamente 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.

1-4. Cuando el disparador pasa un valor: on_blur (2 min)

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ébalo

Escribe algo en el campo y haz clic fuera: el título de arriba cambia.

Para 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.

Ejercicios

  1. Añade un manejador decrement a CounterState y crea un botón que reste 1 al número.
  2. Añade un botón "Reset" a counter_variable que devuelva count a 0. ¿Podrías hacerlo con un manejador que reciba argumentos?
  3. Prueba a usar on_change en lugar de on_blur. El título cambiará con cada letra que escribas.

Lista de comprobación de esta lección

  • Sé explicar qué son el State, una Var, un manejador de eventos y un disparador de eventos.
  • Sé hacer referencia a una Var en la interfaz con NombreClase.nombre_variable.
  • Entiendo por qué el manejador no se ejecuta de inmediato aunque lo conecte a on_click pasándole un argumento.

← Anterior

Resumen del curso

Siguiente →

Lección 2 · Ahora lo ves: renderizado condicional

Recibe avisos de nuevas lecciones

Te avisaremos por correo cuando este curso tenga lecciones nuevas o se abra un curso de continuación.

Datos: tu correo electrónico · Finalidad: avisos de nuevas lecciones o de la publicación de este curso · Conservación: hasta que pidas que lo borremos. No lo usamos para nada más ni lo compartimos. Responde a cualquier aviso y lo borraremos enseguida.

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.

Se muestra como texto plano, sin enlaces ni formato.

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
한국어English日本語简体中文EspañolDeutsch

© 2026 ReflexKR · Since 2026 · CC BY-NC 4.0

Built with Reflex