R

ReflexKR

Reflex 官方文档

用 Reflex 入门 Python 全栈 Web 开发

·

课程概览

1

Reflex 简介与开发环境

2

用组件绘制界面

3

State 与 Var:让数据驱动界面

4

事件与表单:添加客户

5

数据处理与图表

6

总结、调试与下一步

·

附录

用 Reflex 入门 Python 全栈 Web 开发
第2课

时间 0:35–1:15

用组件绘制界面

这一课不涉及状态,只做一个静态界面。完成后,你会看到一张圆角卡片,里面是带有“Customers”标题和说明文字的页头。

2-1. 项目结构(5 分钟)

tutorial_261019/                 # 项目根目录(在这里执行 reflex 命令)
├── rxconfig.py                  # 应用名称和插件配置
├── pyproject.toml / uv.lock     # Python 依赖(由 uv 管理)
├── assets/                      # 图片等静态文件 → 以 "/favicon.ico" 的形式引用
├── reflex.lock/                 # 界面端依赖包的锁文件(需要提交)
├── .web/                        # 编译生成的 React 代码(自动生成,请勿修改)
└── tutorial_261019/             # 与 app_name 同名的 Python 包
    ├── __init__.py
    └── tutorial_261019.py       # 我们要编辑的文件(app = rx.App())

rxconfig.py 的内容如下。app_name 必须和内层文件夹同名,Reflex 才能找到应用。

import reflex as rx

config = rx.Config(
    app_name="tutorial_261019",
    plugins=[
        rx.plugins.SitemapPlugin(),
        rx.plugins.TailwindV4Plugin(),
        rx.plugins.RadixThemesPlugin(),   # 提供按钮、表格等的默认设计
    ],
)

2-2. 最小的 Reflex 应用(5 分钟)

清空 tutorial_261019/tutorial_261019.py 的全部内容,从下面的代码开始。

import reflex as rx


def index() -> rx.Component:
    return rx.heading("Customers")


app = rx.App()
app.add_page(index, title="Customer Data App")
  • index() 是一个返回界面片段(组件)的函数。一个页面就对应一个函数。
  • app = rx.App() 必须写在模块的最顶层。Reflex 会通过这个变量名找到应用。
  • 因为函数名是 index,add_page(index) 会把它注册到根路径 /。title 是浏览器标签页的标题。
  • 服务器运行期间保存文件,会自动重新编译(热重载)。

在浏览器中确认 — 保存后,左上角只剩下一个“Customers”标题。因为没有边距,它贴在页面边角上,这是正常的。

localhost:3000

运行效果

Customers

2-2 步:只显示 Customers 标题的界面

2-3. 组件语法的两条规则(10 分钟)

Reflex 的界面代码,基本上就靠这两条规则:

  1. 位置参数 = 子元素:按顺序放在括号里的组件,就是嵌套在里面的内容。
  2. 关键字参数 = 属性(props)和样式:像 size="6"、margin="0" 这样,以 名称=值 的形式传入。
rx.box(                                   # <div>
    rx.heading("Customers", size="6"),   # 子元素 1
    rx.badge("2"),                        # 子元素 2
    display="flex",                       # 样式
    gap="12px",
)
  • CSS 属性用 snake_case 写法:align-items → align_items,margin-top → margin_top。
  • 与 Python 关键字冲突的名称,在后面加 _:as → as_,type → type_。
  • rx.color("slate", 11) 是 Radix 调色板。数字越大颜色越深,在深色模式下也会自动适配。通常 1~2 用于背景,4~6 用于边框,11~12 用于文字。

讲师笔记 — 解释成“把 HTML 标签换成了函数调用”,学员会很快理解。rx.box = <div>,rx.text = <p>,rx.heading = <h1>~<h6>。可以打开浏览器开发者工具(F12),展示实际生成的标签。

2-4. 制作页头(10 分钟)

页头分为左侧(标题 + 徽章 + 说明)和右侧(按钮)。按钮留到第4课再加,现在只做左侧。

def index() -> rx.Component:
    return rx.box(
        rx.box(
            rx.box(
                rx.heading("Customers", size="6", as_="h3", margin="0"),
                rx.badge("2", variant="soft", color_scheme="gray", radius="full"),
                display="flex",
                align_items="center",
                gap="12px",
            ),
            rx.text(
                "Your customer directory and audience breakdown.",
                size="2",
                color=rx.color("slate", 11),
                margin_top="6px",
            ),
        ),
        display="flex",
        align_items="center",
        justify_content="space-between",
        flex_wrap="wrap",
        gap="16px",
        padding="24px",
    )
  • 徽章里的 "2" 是临时值。到第3课会换成 State.users.length(),显示真实的客户数。
  • justify_content="space-between" 会把子元素推向两端,这就是按钮会贴在最右边的原因。
  • flex_wrap="wrap" 让按钮在屏幕较窄时换到下一行(适配移动端)。

在浏览器中确认 — 标题旁边有一个灰色的圆形徽章(2),下面是灰色的说明文字。此时还没有卡片边框。

localhost:3000

运行效果

Customers

2

Your customer directory and audience breakdown.

2-4 步:带有标题、徽章和说明的页头

2-5. 用卡片包起来(5 分钟)

再用一层 rx.box 把页头包起来,做成卡片的样子。这个外层盒子就是整个应用的框架,后面的表格和图表都会依次放进来。

def index() -> rx.Component:
    return rx.box(
        header,            # 2-4 中做好的页头 box
        # 表格(第3课)、图表(第5课)会加在这里
        width="100%",
        min_width="0",
        max_width="64em",            # 卡片最大宽度
        margin_x="auto",             # 水平居中
        margin_y="24px",
        border=f"1px solid {rx.color('slate', 5)}",
        border_radius="16px",
        background=rx.color("slate", 1),
        overflow="hidden",           # 防止内容溢出圆角之外
        box_shadow="0 4px 24px rgba(0, 0, 0, 0.03)",
        style={
            "& *": {"box_sizing": "border-box"},
            "& p, & h3": {"text_align": "left"},
        },
    )
  • style={...} 用于写那些难以用关键字参数表达的 CSS 选择器。"& *" 的意思是“这个盒子里的所有元素”。
  • 在 f-string 中可以使用 rx.color(...)。注意单引号和双引号要错开使用。

在浏览器中确认 — 页头被放进圆角卡片中,卡片位于页面中央。把浏览器窗口拉窄,卡片宽度也会随之缩小。

localhost:3000

运行效果

Customers

2

Your customer directory and audience breakdown.

2-5 步:用卡片包起来的页头

动手练习

  1. 把说明文字改成中文并保存,观察热重载的效果。
  2. 把 border_radius 分别改成 "4px" 和 "32px",比较一下差异。
  3. 在页头中加入 rx.color_mode.button(),确认切换到深色模式时颜色也能自然地变化。

检查点

  • 能说明位置参数和关键字参数的作用有何不同。
  • 能把 CSS 属性改写成 snake_case。
  • 卡片页头显示在页面中央。

← 上一课

第1课 · Reflex 简介与开发环境

下一课 →

第3课 · State 与 Var:让数据驱动界面

订阅新课时和新课程通知

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

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

问答

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

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

R

ReflexKR

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

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

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

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

Built with Reflex