Reflex页面组件怎么使用?

访客 全栈框架 2

本文目录导读:

  1. 核心概念:State 和 Component
  2. 基础组件使用
  3. 常用内置组件分类
  4. 处理用户输入(Form 组件示例)
  5. 状态组件和条件渲染
  6. 列表和循环渲染
  7. 属性设置技巧
  8. 自定义组件(组件化)

Reflex 是一个基于 Python 的全栈 Web 框架,允许你仅用纯 Python 构建动态的 Web 界面,它的核心思想是使用组件(Components)来构建 UI。

以下是关于 Reflex 页面组件的使用指南,涵盖从基础到进阶的内容。

核心概念:State 和 Component

在 Reflex 中:

  • State:定义应用的变量和逻辑(相当于后端的“大脑”)。
  • Component:定义 UI 的布局和交互元素(相当于前端的“皮肤”)。
  • Event Handler:State 中的方法,用于响应用户操作(如点击按钮)。

基础组件使用

Reflex 提供了大量内置组件,如 rx.textrx.buttonrx.input 等。

示例:一个简单的计数器页面

import reflex as rx
# 1. 定义 State
class State(rx.State):
    count: int = 0  # 状态变量
    def increment(self):
        self.count += 1  # 事件处理器:增加计数
    def decrement(self):
        self.count -= 1  # 事件处理器:减少计数
# 2. 定义页面组件(一个函数)
def index() -> rx.Component:
    return rx.container(
        rx.heading("计数器", size="3"),  # 使用 heading 组件
        rx.hstack(                       # 使用水平堆叠组件
            rx.button(
                "减 1",
                on_click=State.decrement, # 绑定事件
                color_scheme="red"
            ),
            rx.text(State.count, size="5"), # 显示状态变量,自动响应变化
            rx.button(
                "加 1",
                on_click=State.increment,
                color_scheme="green"
            ),
            spacing="3"
        ),
        padding_y="2em",
    )
# 3. 创建应用并添加页面
app = rx.App()
app.add_page(index, route="/") # 将 index 组件添加到根路径
# 4. 运行(终端执行: reflex run)

关键点:

  • State.count:在 UI 中直接引用状态变量,Reflex 会自动保持 UI 同步。
  • on_click:事件绑定,参数是 State 中的方法(注意不要加括号)。

常用内置组件分类

类别 组件示例 用途
布局 rx.box, rx.container, rx.hstack, rx.vstack, rx.grid, rx.center 组织页面结构,控制元素位置。
文本 rx.text, rx.heading, rx.markdown, rx.code 显示文字内容。
表单 rx.input, rx.button, rx.select, rx.checkbox, rx.slider, rx.text_area 接收用户输入。
媒体 rx.image, rx.video, rx.icon 显示图片、视频、图标。
数据 rx.table, rx.list, rx.plotly (需安装) 展示表格、列表、图表。
反馈 rx.alert, rx.progress, rx.badge, rx.toast 显示加载中、提示、状态标记。

处理用户输入(Form 组件示例)

时,需要使用 事件绑定状态变量 来捕获。

import reflex as rx
class FormState(rx.State):
    name: str = ""
    submitted_name: str = ""
    def handle_submit(self, form_data: dict):
        # form_data 是一个字典,key 是 input 的 name 属性
        self.submitted_name = form_data.get("name")
    def set_name(self, value):
        # 或者使用 on_change 实时绑定
        self.name = value
def form_example() -> rx.Component:
    return rx.container(
        rx.vstack(
            rx.form(
                rx.input(
                    name="name",  # 必须设置 name 用于 form_data 识别
                    placeholder="输入你的名字",
                    on_change=FormState.set_name, # 实时更新状态
                ),
                rx.button("提交", type_="submit"), # 必须 type_="submit"
                on_submit=FormState.handle_submit, # 表单提交处理器
                reset_on_submit=True,
            ),
            rx.text(f"你输入的名字是:{FormState.name}"), # 实时显示
            rx.text(f"最后提交的是:{FormState.submitted_name}"), # 提交后显示
        ),
        padding="2em",
    )
# 添加到 app
# app.add_page(form_example)

状态组件和条件渲染

使用 rx.cond 根据状态条件决定显示哪个组件。

import reflex as rx
class ToggleState(rx.State):
    show: bool = True
    def toggle(self):
        self.show = not self.show
def conditional_example() -> rx.Component:
    return rx.vstack(
        rx.button("切换显示", on_click=ToggleState.toggle),
        # show 为 True,显示 "可见",否则显示 "隐藏"
        rx.cond(
            ToggleState.show,
            rx.text("可见", color="green"),
            rx.text("隐藏", color="red"),
        ),
    )

列表和循环渲染

使用 rx.foreach 渲染列表数据。

import reflex as rx
class ListState(rx.State):
    items: list[str] = ["苹果", "香蕉", "樱桃", "日期"]
def list_example() -> rx.Component:
    # rx.foreach 接受一个状态列表和一个渲染函数
    def render_item(item: str) -> rx.Component:
        return rx.list_item(rx.text(item)) # 为每个 item 创建一个列表项
    return rx.vstack(
        rx.heading("水果列表"),
        rx.list(
            rx.foreach(ListState.items, render_item)
        ),
    )

属性设置技巧

  • 动态属性:属性值可以是状态变量。<rx.text color=State.text_color>
  • 自定义样式:使用 style 字典或直接传入 CSS 属性。
    rx.button("Styled", background_color="red", border_radius="lg")
  • 响应式设计:Reflex 使用 rx.breakpoints 或 Tailwind CSS (v0.6.0+) 实现。

自定义组件(组件化)

将 UI 逻辑封装成函数,便于复用。

def user_card(name: str, email: str) -> rx.Component:
    return rx.card(
        rx.vstack(
            rx.avatar(name=name),
            rx.text(name, weight="bold"),
            rx.text(email),
        ),
        width="200px",
    )
def profile_page() -> rx.Component:
    return rx.hstack(
        user_card("Alice", "alice@example.com"),
        user_card("Bob", "bob@example.com"),
        spacing="4",
    )

使用 Reflex 页面组件的步骤:

  1. 定义 State:用 rx.State 管理变量和行为。
  2. 组合组件:像搭积木一样使用 rx.___ 构建 UI,组件是 Python 函数调用,children 参数作为子元素。
  3. 绑定事件:将 on_clickon_change 等事件关联到 State 的方法。
  4. 响应数据:直接在 UI 中引用 State.变量名
  5. 渲染列表:使用 rx.foreach 遍历状态中的列表。

推荐实践: 先从 rx.containerrx.vstackrx.hstack 三个布局组件开始,配合 rx.textrx.buttonrx.input 搭建基础交互页面,很快就能上手。

标签: Reflex 组件化

抱歉,评论功能暂时关闭!