R

ReflexKR

Reflex 官方文档

动手掌握 Reflex 基础

·

课程概览

1

一点就变:State 与事件

2

时隐时现:条件渲染

3

绘制列表:rx.foreach

4

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

5

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

6

应用、页面,以及水果篮

动手掌握 Reflex 基础
第6课

时间 0:34–0:40

应用、页面,以及水果篮

这是最后一课。我们先看看如何把前面写好的界面函数挂到真正的网址上,然后把第1~5课学到的内容全部用上,完成一个小应用。

6-1. 应用与页面(2 分钟)

Reflex 应用通过 rx.App 创建,再用 add_page 把界面函数绑定到网址(route)上。

def index():
    return rx.text("Root Page")


app = rx.App()
app.add_page(index, route="/")
  • app = rx.App() 必须写在主文件的最外层。Reflex 会按 app 这个名字来查找应用。
  • route="/" 是网站的首页。可以像 app.add_page(about, route="/about") 这样继续添加页面。
  • 省略 route 时,函数名就是网址。index 对应 /,about 对应 /about。

6-2. 综合练习:水果篮(4 分钟)

这是一个用按钮放入和取出水果的篮子。代码不长,却涵盖了这门课的所有概念。

FRUITS = ["Apple", "Banana", "Cherry", "Grape", "Mango", "Peach"]


class BasketState(rx.State):
    basket: list[str] = []

    @rx.event
    def add_fruit(self):
        # Event handlers run real Python: pick the next fruit in the list.
        self.basket.append(FRUITS[len(self.basket) % len(FRUITS)])

    @rx.event
    def remove_last(self):
        if self.basket:
            self.basket.pop()


def fruit_basket():
    return rx.vstack(
        rx.hstack(
            rx.heading("My basket", as_="h2", size="5"),
            # Var operations: .length() and % work on vars in components.
            rx.badge(BasketState.basket.length()),
            rx.cond(
                BasketState.basket.length() % 2 == 0,
                rx.badge("even", color_scheme="green"),
                rx.badge("odd", color_scheme="orange"),
            ),
            align="center",
        ),
        rx.cond(
            BasketState.basket.length() > 0,
            rx.list.unordered(rx.foreach(BasketState.basket, rx.list.item)),
            rx.text("The basket is empty.", color_scheme="gray"),
        ),
        rx.hstack(
            rx.button("Add fruit", on_click=BasketState.add_fruit),
            rx.button("Remove last", on_click=BasketState.remove_last, variant="soft"),
        ),
        align="start",
    )


app = rx.App()
app.add_page(fruit_basket, route="/")

localhost:3000

动手试试

My basket

0even

The basket is empty.

点击 Add fruit 和 Remove last 试试。数量、奇偶徽章和列表会一起变化。

我们来逐一看看,代码的每个部分分别是在哪一课学到的。

代码概念课次
basket: list[str] = []存放可变数据的 State var第1课
on_click=BasketState.add_fruit事件触发器与处理器第1课
rx.cond(... > 0, 列表, "empty")条件渲染第2课
rx.foreach(BasketState.basket, rx.list.item)列表渲染。也可以直接传入组件函数第3课
处理器中的 len(self.basket)、if运行时的真正 Python第4课
界面中的 .length()、% 2 == 0编译时使用的 Var 运算第4课
variant="soft"、color_scheme="gray"用 props 美化第5课
app.add_page(fruit_basket, route="/")注册页面第6课

请留意:同样是求长度,在处理器里可以用 len,到了界面里就要换成 .length()。只要能回答第4课的那个问题——"这段代码是什么时候执行的?",你就已经掌握了 Reflex 的基本功。

下一步

基础已经打好,接下来就该动手做一个真正的应用了。

  • 用 Reflex 入门 Python 全栈 Web 开发:本站时长 4 小时的课程。从零开始做一个带表格、表单、对话框和图表的客户管理应用。
  • Chat app 教程(英文):做一个实时接收并显示 AI 回复的聊天应用。
  • Var 与 Var 运算(英文):本课程中浅尝辄止的 Var 运算的完整列表。
  • 事件与页面(英文):更多触发器和路由的用法。
  • How Reflex works(英文):讲解第4课中的编译时和运行时在内部是如何运作的。

课后练习

  1. 修改 add_fruit,让同一种水果不会被放进篮子两次。因为是在处理器里,可以用 if fruit not in self.basket。
  2. 添加一个 "Clear" 按钮,一次性清空篮子。
  3. 当篮子里有 5 个及以上水果时,显示一个 "Full!" 徽章。这是界面代码,所以要用 Var 运算和 rx.cond。

本课检查清单

  • 能用 rx.App 和 add_page 注册页面。
  • 能解释水果篮代码中每一行对应的概念。
  • 明白同样的计算放在处理器里和放在界面里时,为什么写法不同。

← 上一课

第5课 · 打扮界面:组件、props 与样式

订阅新课时和新课程通知

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

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

问答

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

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

R

ReflexKR

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

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

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

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

Built with Reflex