mcpField
R
reflex-dev

reflex-dev

github.com/silvainfm开发3106 次安装14 周前更新
代码仓库

关于 reflex-dev

reflex-dev 是一项使用 Reflex 和 Python 构建全栈 Web 应用的开发技能,无需编写 JavaScript。内容涵盖状态、组件、事件处理、路由、样式和开发流程。

主要功能

  1. 01使用 Python 构建应用
  2. 02管理服务端状态
  3. 03组合 UI 组件
  4. 04处理用户事件
  5. 05配置路由与响应式布局
  6. 06运行和导出应用

适用场景

  1. 01创建交互式 Web 应用页面
  2. 02构建表单和数据表
  3. 03处理文件上传与实时状态更新

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/silvainfm/claude-skills --skill reflex-dev

安装后在 Claude Code 中输入/reflex-dev确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

examples/
counter_app.py
data_table_crud.py
file_upload.py
form_validation.py
README.md
references/
patterns.md

详细介绍

Reflex 开发

概述

Reflex 是一个全栈 Python 框架,可在不编写 JavaScript 的情况下构建 Web 应用。应用会编译为 React 前端和 FastAPI 后端,状态管理和事件处理器完全使用 Python 运行。

架构:

  • 前端:编译为 React(JavaScript),用于 UI 渲染
  • 后端:运行 Python 事件处理器的 FastAPI 服务
  • 通信:使用 WebSocket 实时更新状态
  • 状态:服务端 Python 状态与前端同步

核心概念

状态管理

状态是一个 Python 类,用于存放所有可变数据和事件处理器。所有状态变量都必须可序列化为 JSON。

import reflex as rx

class AppState(rx.State):
    # State variables (any JSON-serializable type)
    count: int = 0
    items: list[str] = []
    user_name: str = ""

    # Event handlers - the ONLY way to modify state
    def increment(self):
        self.count += 1

    def add_item(self, item: str):
        self.items.append(item)

    # Computed vars (derived state)
    @rx.var
    def item_count(self) -> int:
        return len(self.items)

主要规则:

  • 状态变量必须可序列化为 JSON(int、str、list、dict、bool、float)
  • 只有事件处理器可以修改状态
  • 使用 @rx.var 装饰器定义计算值/派生值
  • 状态按用户会话隔离(不同用户之间相互独立)
组件

组件是构建 UI 的基本单元。Reflex 提供 60 多个内置组件。

import reflex as rx

def header() -> rx.Component:
    return rx.heading("My App", size="lg")

def counter_component(state: AppState) -> rx.Component:
    return rx.vstack(
        rx.text(f"Count: {state.count}"),
        rx.button("Increment", on_click=state.increment),
        spacing="4"
    )

常用组件:

  • 布局:rx.vstack、rx.hstack、rx.box、rx.container
  • 文本:rx.heading、rx.text、rx.code
  • 输入:rx.input、rx.text_area、rx.select、rx.checkbox
  • 交互:rx.button、rx.link、rx.icon_button
  • 数据:rx.table、rx.data_table、rx.list
  • 图表:rx.recharts.line_chart、rx.recharts.bar_chart 等
事件处理器

事件处理器响应用户交互,是修改状态的唯一方式。

class FormState(rx.State):
    form_data: dict[str, str] = {}

    # Simple event handler
    def handle_submit(self):
        print(f"Submitted: {self.form_data}")

    # Event handler with argument
    def update_field(self, field: str, value: str):
        self.form_data[field] = value

    # Async event handler (for API calls, DB queries)
    async def fetch_data(self):
        # Can use any Python library
        import httpx
        async with httpx.AsyncClient() as client:
            response = await client.get("https://api.example.com/data")
            self.data = response.json()

事件触发器(将组件与处理器关联):

  • on_click:按钮点击
  • on_change:输入字段变化
  • on_submit:表单提交
  • on_mount:组件首次渲染
  • on_blur、on_focus:输入焦点事件

项目结构

标准 Reflex 应用结构:

my_app/
├── my_app/
│   ├── __init__.py         # Empty
│   └── my_app.py           # Main app file (State + pages)
├── assets/                 # Static files (images, fonts, etc.)
├── .web/                   # Auto-generated frontend (don't edit)
├── rxconfig.py             # Reflex configuration
└── requirements.txt        # Python dependencies
主应用文件模式
import reflex as rx

# 1. Define State
class State(rx.State):
    count: int = 0

    def increment(self):
        self.count += 1

# 2. Define Pages
def index() -> rx.Component:
    return rx.container(
        rx.heading("Welcome"),
        rx.button("Click", on_click=State.increment),
        rx.text(f"Count: {State.count}")
    )

def about() -> rx.Component:
    return rx.container(
        rx.heading("About"),
        rx.link("Home", href="/")
    )

# 3. Create App and Add Routes
app = rx.App()
app.add_page(index, route="/")
app.add_page(about, route="/about")

常见模式

表单处理
class FormState(rx.State):
    name: str = ""
    email: str = ""

    def handle_submit(self, form_data: dict):
        self.name = form_data.get("name", "")
        self.email = form_data.get("email", "")

def form_page():
    return rx.form(
        rx.vstack(
            rx.input(name="name", placeholder="Name"),
            rx.input(name="email", placeholder="Email"),
            rx.button("Submit", type="submit"),
        ),
        on_submit=FormState.handle_submit,
    )
数据表格
class DataState(rx.State):
    data: list[dict] = [
        {"id": 1, "name": "Alice", "age": 25},
        {"id": 2, "name": "Bob", "age": 30},
    ]

def data_table_page():
    return rx.data_table(
        data=DataState.data,
        columns=["id", "name", "age"],
        sort=True,
        search=True,
        pagination=True,
    )
文件上传
class UploadState(rx.State):
    async def handle_upload(self, files: list[rx.UploadFile]):
        for file in files:
            upload_data = await file.read()
            # Process file data
            outfile = f"./uploads/{file.filename}"
            with open(outfile, "wb") as f:
                f.write(upload_data)

def upload_page():
    return rx.vstack(
        rx.upload(
            rx.button("Select Files"),
            id="upload1",
        ),
        rx.button(
            "Upload",
            on_click=UploadState.handle_upload(rx.upload_files(upload_id="upload1"))
        ),
    )
数据库集成(使用 DuckDB)
import duckdb
import polars as pl

class DBState(rx.State):
    records: list[dict] = []

    async def load_data(self):
        # Use existing database connection
        conn = duckdb.connect("data/mydb.duckdb")
        df = conn.execute("SELECT * FROM mytable").pl()
        self.records = df.to_dicts()
        conn.close()

    async def insert_record(self, data: dict):
        conn = duckdb.connect("data/mydb.duckdb")
        conn.execute(
            "INSERT INTO mytable (name, value) VALUES (?, ?)",
            [data["name"], data["value"]]
        )
        conn.close()
        await self.load_data()  # Refresh

样式与布局

内联样式
rx.box(
    rx.text("Styled text"),
    bg="#1a5f9e",
    color="white",
    padding="4",
    border_radius="md",
)
响应式布局
rx.container(
    rx.responsive_grid(
        rx.box("Item 1", bg="blue"),
        rx.box("Item 2", bg="green"),
        rx.box("Item 3", bg="red"),
        columns=[1, 2, 3],  # 1 col mobile, 2 tablet, 3 desktop
        spacing="4",
    ),
    max_width="1200px",
)
常见样式属性
  • 布局:width、height、padding、margin、display
  • 颜色:bg(背景)、color(文本)
  • 排版:font_size、font_weight、text_align
  • 边框:border、border_radius、border_color
  • 间距:spacing(用于堆叠布局)、gap

路由

多个页面
app = rx.App()

# Route with parameters
@rx.page(route="/user/[id]")
def user_page() -> rx.Component:
    return rx.text(f"User ID: {State.router.page.params.get('id')}")

# Simple routes
app.add_page(index, route="/")
app.add_page(about, route="/about")
导航
# Links
rx.link("Go to About", href="/about")

# Programmatic navigation
def go_home(self):
    return rx.redirect("/")

开发工作流

初始化新应用
pip install reflex
reflex init
运行开发服务器
reflex run

应用运行在 http://localhost:3000,并支持自动重新加载。

常用命令
reflex run          # Start dev server
reflex export       # Build production bundle
reflex db init      # Initialize database (if using Reflex DB)
reflex db migrate   # Run migrations

最佳实践

  1. 状态组织:将大型状态拆分为子状态

    class AuthState(rx.State):
        user: str = ""
    
    class DataState(rx.State):
        items: list = []
    
  2. 组件复用:创建可复用的组件函数

    def card(title: str, content: str) -> rx.Component:
        return rx.box(
            rx.heading(title, size="md"),
            rx.text(content),
            padding="4",
            border="1px solid #ddd",
        )
    
  3. 事件处理器性能:对 I/O 操作使用 async

    async def fetch_data(self):
        # Async I/O won't block other users
        self.data = await some_api_call()
    
  4. 类型提示:始终为状态变量和事件处理器添加类型提示

    count: int = 0
    items: list[str] = []
    
    def update_count(self, value: int) -> None:
        self.count = value
    

参考资料

文档
示例应用

完整可运行的示例请参阅 examples/ 目录:

  • 简单计数器应用
  • 支持 CRUD 操作的数据表格
  • 带验证的表单
  • 文件上传与处理
常见模式参考

详细示例请参阅 references/patterns.md:

  • 身份验证流程
  • 实时更新
  • 复杂表单验证
  • 多步骤工作流
  • 使用图表进行数据可视化

评论

支持 Markdown