Zeit 0:18–0:28
In Lektion 2 hast du rx.cond statt if verwendet, in Lektion 3 rx.foreach statt for. Es ist doch Python, warum also nicht einfach die normale Python-Syntax? Wenn du den Grund in dieser Lektion verstanden hast, wird dir auf einen Schlag klar, woher die meisten Fehler kommen, die dir in Reflex begegnen.
Der Code einer Reflex-App läuft zu zwei verschiedenen Zeitpunkten.
| Kompilierzeit | Laufzeit | |
|---|---|---|
| Wann | Einmal beim Start der App | Die ganze Zeit, solange die App läuft |
| Was | UI-Funktionen (show_login, render_item …) | Event-Handler (increment, toggle_login …) |
| Wo | Python-Code wird in JavaScript-(React-)Code umgewandelt | Python auf dem Server |
| State-Werte | Noch unbekannt | Echte Werte vorhanden |
UI-Funktionen werden beim Start der App in JavaScript übersetzt und an den Browser geschickt. Beim Übersetzen weiß noch niemand, welcher Nutzer was anklicken wird. Deshalb ist LoginState.logged_in in einer UI-Funktion kein echtes True/False, sondern ein „Platzhalter, der später im Browser gefüllt wird“. Genau dieser Platzhalter ist eine Var.
Event-Handler dagegen werden nicht übersetzt, sondern laufen als ganz normales Python auf dem Server. Darum kannst du in einem Handler beliebigen Python-Code und beliebige Bibliotheken verwenden.
Der Handler unten verwendet ein if und ruft sogar eine Funktion auf, die außerhalb des State definiert ist. Da er zur Laufzeit auf dem Server läuft, ist das kein Problem.
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
AusprobierenAuch in UI-Funktionen kannst du Python verwenden, allerdings nur für Dinge, deren Wert schon zur Kompilierzeit feststeht (also ohne State-Vars). range(5) und check_even(i) unten sind bereits beim Start der App fertig berechnet.
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
Live-Vorschau0 is even
1 is odd
2 is even
3 is odd
4 is even
Da der Wert einer State-Var zur Kompilierzeit unbekannt ist, führt jeder der folgenden Codes in einer UI-Funktion zu einem Fehler.
Den Wert einer Var mit if prüfen: Ob er wahr oder falsch ist, steht noch nicht fest. Das gilt auch, wenn du damit einen Prop-Wert auswählst.
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"),
)Mit for über eine Listen-Var iterieren: Wie viele Einträge es gibt, steht noch nicht fest.
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]
)Eine Var an Python-Funktionen wie len() übergeben: Es gibt noch gar keinen String, dessen Zeichen man zählen könnte.
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)),
)Wie zeigst du in der Oberfläche also „Even bei gerader Zahl, Odd bei ungerader“ an? Reflex stellt dafür Var-Operationen bereit, die du auf Vars anwenden kannst. Verwendest du Operatoren wie %, == oder > mit einer Var, ist auch das Ergebnis eine Var. Die eigentliche Berechnung passiert erst im Browser, sobald der Wert da ist.
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
AusprobierenEven
Jetzt lässt sich in einer Tabelle zusammenfassen, warum du die Werkzeuge aus Lektion 1 bis 3 gebraucht hast.
| Was du willst | Geht im UI-Code nicht | Stattdessen |
|---|---|---|
| Je nach Bedingung andere Inhalte | if / else | rx.cond(bedingung, wenn_wahr, wenn_falsch) |
| Über eine Liste iterieren | for, List-Comprehension | rx.foreach(liste, funktion) |
| Länge ermitteln | len(x) | x.length() |
| Rechnen und vergleichen | Var an Python-Funktionen übergeben | Var-Operationen wie %, ==, > |
| Komplexe Berechnungen | Python in der UI-Funktion | Im Event-Handler berechnen und im State speichern |
Gut zu wissen — Wenn du unsicher bist, frag dich: „Wann läuft dieser Code?“ Steht er in einer UI-Funktion, ist Kompilierzeit, und die Var ist noch ein leerer Platzhalter. Steht er in einem Handler, ist Laufzeit, und du hast den echten Wert.
format_text aus 4-3 so, dass die Anzahl der Zeichen angezeigt wird. Tipp: BadTextState.text.length().count_if_even „Big!“ anzeigen, sobald count 10 oder mehr erreicht. Tipp: rx.cond(CountEvenState.count >= 10, ...).MyState3), mit dem Ansatz über Var-Operationen (wie bei CountEvenState). Welcher braucht weniger State-Variablen?if, for oder len() auf State-Vars anwenden kann.rx.cond und rx.foreach erreiche.← Zurück
Lektion 3 · Listen zeichnen: rx.foreach
Weiter →
Lektion 5 · Schön machen: Komponenten, Props und Styles
Über neue Lektionen informiert werden
Wir schicken dir eine E-Mail, wenn dieser Kurs neue Lektionen bekommt oder ein Folgekurs erscheint.
R
ReflexKR
Python und Reflex zum Anfassen. Alle Beispiele wurden mit Reflex 0.10.0 ausgeführt und geprüft.
ReflexKR ist kostenlos und ohne Werbebanner. Wenn es dir geholfen hat, kannst du es mit einem Kaffee unterstützen. ☕ Spendier uns einen Kaffee
Hinweis zu Affiliate-Links© 2026 ReflexKR · Since 2026 · CC BY-NC 4.0
Fragen & Antworten
Frag alles zu dieser Lektion. Fragen aus allen Sprachversionen dieser Seite erscheinen hier gemeinsam.