R

ReflexKR

Reflex 官方文档

动手掌握 Reflex 基础

·

课程概览

1

一点就变:State 与事件

2

时隐时现:条件渲染

3

绘制列表:rx.foreach

4

为什么 if 不行?编译时与运行时

5

打扮界面:组件、props 与样式

6

应用、页面,以及水果篮

动手掌握 Reflex 基础
第1课

时间 0:00–0:08

一点就变:State 与事件

先别急着看讲解,动手点一点。点击下面的按钮,数字每次加 1。学完这一课,你就能讲清楚这十几行代码是怎么运作的。

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

动手试试

0

点击 Increment 试试,数字每次加 1。

这段代码分为三部分。

部分代码作用
Stateclass CounterState(rx.State)存放会变化的数据(count)的容器
事件处理器def increment(self)修改数据的函数
事件触发器on_click=CounterState.increment"点击时调用这个函数"的绑定

点击按钮后,increment 在服务器上执行;count 一变,Reflex 就会自动重新渲染用到这个值的那部分界面。整个过程中,没有一行代码是直接去改界面的。

1-1. State:存放可变数据的地方(2 分钟)

应用里总有一些会随时间变化的数据,比如计数器的数字、是否已登录、购物车列表等。在 Reflex 中,这类数据放在 State 类里。

  • 创建一个继承 rx.State 的类,在里面写上变量。这些变量称为 Var(state var)。
  • Var 必须标注类型(count: int),也可以设置默认值(= 0)。

要在界面中使用 Var,需要像 MyState.count 这样通过类名来引用。它既可以作为子组件放进去,也可以作为 props 的值传入。

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

运行效果

Count:

0

color Var 用作文字颜色 prop,count Var 用作子组件。

同一个 Var 可以在多个组件中使用。值一旦变化,所有用到这个 Var 的地方都会一起更新。

小贴士 — 能修改 State 的只有事件处理器。不能在界面代码里像 MyState.count = 5 这样直接赋值。

1-2. 事件处理器与 @rx.event(2 分钟)

State 中定义的、用来修改数据的方法称为事件处理器。像 on_click 这样组件自带的特殊 props 称为事件触发器。把触发器和处理器连接起来,界面就能响应用户的操作。

  1. 用户点击按钮(事件触发器被触发)。
  2. 绑定的事件处理器在服务器上执行,修改 State。
  3. Reflex 把变化后的 State 发送到浏览器,界面随之重新渲染。

强烈建议在处理器上方加上 @rx.event。有了这个装饰器,编辑器和类型检查器就能帮你确认"这个处理器该传几个参数、分别是什么类型",提前发现错误。

1-3. 接收参数的事件处理器(2 分钟)

处理器也能像普通函数一样接收参数。下面用同一个处理器,做出"加 1"和"加 5"两个按钮。

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

动手试试

0

两个按钮用不同的值调用同一个处理器。
  • 这个示例用 lambda 包了一层,写成 lambda: CounterState2.increment(1),明确表达"点击时传入 1 来调用"的意思。
  • 直接写成 on_click=CounterState2.increment(1) 效果也完全一样。这行代码并不会立即执行处理器,而只是生成一条"点击时以 amount=1 执行"的事件信息。处理器的代码要等到点击按钮时才在服务器上执行。

1-4. 触发器会传值的情况:on_blur(2 分钟)

on_click 不会给处理器传任何值,但有些触发器会传值。on_blur 会在输入框失去焦点时(点击别处或按下 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

动手试试

在输入框里输入文字,再点击外面,上方的标题就会变化。

小贴士 — 处理器的参数个数必须和触发器传入的值的个数一致。on_blur 传入一个值,所以 update_text 也只接收 new_text 一个参数。个数不一致就会报错。

课后练习

  1. 给 CounterState 添加一个 decrement 处理器,再做一个让数字每次减 1 的按钮。
  2. 给 counter_variable 添加一个 "Reset" 按钮,把 count 重置为 0。能不能用接收参数的处理器来实现?
  3. 把 on_blur 换成 on_change 试试。这样每输入一个字,标题都会跟着变。

本课检查清单

  • 能说出 State、Var、事件处理器、事件触发器分别是什么。
  • 能在界面中用 类名.变量名 引用 Var。
  • 明白为什么给 on_click 传入带参数的处理器时,处理器并不会立即执行。

← 上一课

课程概览

下一课 →

第2课 · 时隐时现:条件渲染

订阅新课时和新课程通知

本课程新增课时或推出后续课程时,我们会发邮件通知你。

收集项目:电子邮箱 · 用途:本课程的新课时和上线通知 · 保存期限:直到你要求删除。不会用于其他用途,也不会提供给他人。回复任意通知邮件,我们会立即删除。

问答

关于本课有任何疑问都可以在这里留言。所有语言版本页面的提问会汇集在一起。

以纯文本显示,不支持链接和格式。

R

ReflexKR

动手学 Python 和 Reflex。所有示例均已在 Reflex 0.10.0 上实际运行验证。

ReflexKR 免费,没有横幅广告。如果对你有帮助,欢迎请我们喝杯咖啡。 ☕ 请我们喝杯咖啡

联盟链接与赞助说明
한국어English日本語简体中文EspañolDeutsch

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

Built with Reflex