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 4

Tiempo 0:18–0:28

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

En la lección 2 usaste rx.cond en lugar de if, y en la lección 3, rx.foreach en lugar de for. Si esto es Python, ¿por qué no puedes usar la sintaxis de Python tal cual? En cuanto entiendas el motivo en esta lección, comprenderás de una vez por qué aparecen la mayoría de los errores que te encontrarás en Reflex.

4-1. Los dos momentos en que se ejecuta el código (3 min)

El código de una app Reflex se ejecuta en dos momentos distintos.

Tiempo de compilaciónTiempo de ejecución
CuándoUna vez, al arrancar la appContinuamente, mientras la app está en marcha
QuéFunciones de la interfaz (show_login, render_item …)Manejadores de eventos (increment, toggle_login …)
DóndeEl código Python se convierte en código JavaScript (React)Python, en el servidor
Valores del StateAún no se conocenTienen su valor real

Al arrancar la app, las funciones de la interfaz se traducen a JavaScript y se envían al navegador. Durante la traducción todavía no se sabe qué usuario pulsará qué, así que el LoginState.logged_in que hay dentro de una función de la interfaz no es un True/False real, sino "un hueco que se rellenará más tarde en el navegador". Ese hueco es precisamente una Var.

En cambio, los manejadores de eventos no se traducen: se ejecutan en el servidor como Python normal. Por eso, dentro de un manejador puedes usar cualquier código o librería de Python.

4-2. Dentro del manejador, Python de verdad (2 min)

El siguiente manejador usa un if y además llama a una función definida fuera del State. Como se ejecuta en el servidor en tiempo de ejecución, no hay ningún problema.

def check_even(num: int):
    return num % 2 == 0


class MyState3(rx.State):
    count: int = 0
    text: str = "even"

    @rx.event
    def increment(self):
        # Use any Python code within state.
        # Even reference functions defined outside the state.
        if check_even(self.count):
            self.text = "even"
        else:
            self.text = "odd"
        self.count += 1


def count_and_check():
    return rx.box(
        rx.heading(MyState3.text, as_="h2"),
        rx.button("Increment", on_click=MyState3.increment),
    )

localhost:3000

Pruébalo

even

Con cada clic, el if de Python dentro del manejador elige entre even y odd.

También puedes usar Python dentro de una función de la interfaz, pero solo con valores que ya se conocen en tiempo de compilación (es decir, que no usan state vars). El range(5) y el check_even(i) de abajo terminan de calcularse al arrancar la app.

def show_numbers():
    return rx.vstack(*[rx.text(f"{i} is {'even' if check_even(i) else 'odd'}") for i in range(5)])

localhost:3000

Vista previa

0 is even

1 is odd

2 is even

3 is odd

4 is even

Cinco líneas calculadas en tiempo de compilación. Estos valores no cambian mientras la app está en marcha.

4-3. Tres cosas que no funcionan en el código de la interfaz (2 min)

Como el valor de una state var no se conoce en tiempo de compilación, todo el código siguiente produce un error dentro de una función de la interfaz.

Evaluar el valor de una Var con if: aún no se sabe si es verdadero o falso. Lo mismo ocurre al elegir el valor de una prop.

class BadState(rx.State):
    count: int = 0


def count_if_even():
    return rx.box(
        rx.heading("Count: ", as_="h2"),
        # This will raise a compile error, as BadState.count is a var and not known at compile time.
        rx.text(BadState.count if BadState.count % 2 == 0 else "Odd"),
        # Using an if statement with a var as a prop will NOT work either.
        rx.text("hello", color="red" if BadState.count % 2 == 0 else "blue"),
    )

Recorrer una Var de tipo lista con for: aún no se sabe cuántos elementos tendrá.

class BadState(rx.State):
    items: list[str] = ["Apple", "Banana", "Cherry"]


def loop_over_list():
    return rx.box(
        # This will raise a compile error, as BadState.items is a list and not known at compile time.
        *[rx.text(item) for item in BadState.items]
    )

Pasar una Var a funciones de Python como len(): todavía no existe el string cuyos caracteres habría que contar.

class BadTextState(rx.State):
    text: str = "Hello world"


def format_text():
    return rx.box(
        # Python operations such as `len` will not work on state vars.
        rx.text(len(BadTextState.text)),
    )

4-4. La solución: operaciones de Var (3 min)

Entonces, ¿cómo mostramos en la interfaz "Even si es par, Odd si es impar"? Reflex ofrece operaciones de Var que puedes usar con las Var. Si aplicas operadores como %, == o > a una Var, el resultado también es una Var, y el cálculo real se hace en el navegador, una vez que llega el valor.

class CountEvenState(rx.State):
    count: int = 0

    @rx.event
    def increment(self):
        self.count += 1


def count_if_even():
    return rx.box(
        rx.heading("Count: ", CountEvenState.count, as_="h2"),
        rx.cond(
            # Here we use the `%` and `==` var operations to check if the count is even.
            CountEvenState.count % 2 == 0,
            rx.text("Even"),
            rx.text("Odd"),
        ),
        rx.button("Increment", on_click=CountEvenState.increment),
    )

localhost:3000

Pruébalo

Count: 0

Even

rx.cond recibe el resultado de las operaciones de Var % y == y elige entre Even y Odd.

Ahora puedes resumir en una tabla por qué hacían falta las herramientas de las lecciones 1 a 3.

Lo que quieres hacerNo funciona en la interfazQué usar en su lugar
Mostrar una vista distinta según una condiciónif / elserx.cond(condicion, si_verdadero, si_falso)
Recorrer una listafor, comprensión de listasrx.foreach(lista, funcion)
Obtener la longitudlen(x)x.length()
Calcular y compararPasar una Var a funciones de PythonOperaciones de Var como %, == y >
Cálculos complejosPython dentro de la función de la interfazCalcular en un manejador de eventos y guardar el resultado en el State

Para saber — Cuando tengas dudas, pregúntate: "¿cuándo se ejecuta este código?". Si está dentro de una función de la interfaz, es tiempo de compilación y la Var todavía es un hueco vacío; si está dentro de un manejador, es tiempo de ejecución y el valor es real.

Ejercicios

  1. Corrige el format_text de 4-3 para que muestre el número de caracteres. Pista: BadTextState.text.length().
  2. En count_if_even, haz que aparezca "Big!" cuando count sea 10 o más. Pista: rx.cond(CountEvenState.count >= 10, ...).
  3. Compara el enfoque de calcular dentro del manejador, como en MyState3, con el de usar operaciones de Var, como en CountEvenState. ¿Cuál necesita menos variables en el State?

Lista de comprobación de esta lección

  • Sé explicar cuándo y dónde se ejecutan las funciones de la interfaz y los manejadores de eventos.
  • Sé explicar por qué en el código de la interfaz no puedo usar if, for ni len() con state vars.
  • Sé cómo conseguir lo mismo con operaciones de Var, rx.cond y rx.foreach.

← Anterior

Lección 3 · Dibujar listas: rx.foreach

Siguiente →

Lección 5 · Darle estilo: componentes, props y estilos

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