R

ReflexKR

Reflex 官方文档

组件工坊:Reflex 组件库 100 例

·

课程概览

布局

·

Box

·

Flex

·

Stack

·

Grid

·

Container

·

Section

·

Center

·

Spacer

·

Separator

·

Card

·

Inset

·

Aspect Ratio

·

Fragment

排版

·

Text

·

Heading

·

Link

·

Code

·

Markdown

·

Blockquote

·

Quote

·

Strong

·

Em

·

Kbd

表单

·

Button

·

Input

·

Text Area

·

Checkbox

·

Switch

·

Radio Group

·

Select

·

Slider

·

Form

·

Upload

数据展示

·

Badge

·

Avatar

·

Icon

·

Callout

·

List

·

Data List

·

Code Block

·

Progress

·

Spinner

·

Scroll Area

·

Moment

展开与切换

·

Tabs

·

Accordion

·

Segmented Control

浮层

·

Tooltip

·

Popover

·

Hover Card

·

Dialog

·

Alert Dialog

·

Drawer

·

Dropdown Menu

·

Context Menu

·

Toast

动态渲染

·

Cond

·

Match

·

Foreach

·

Auto Scroll

媒体

·

Image

·

Audio

·

Video

表格与数据网格

·

Table

·

Data Table

·

Data Editor

图表

·

Area Chart

·

Bar Chart

·

Line Chart

·

Composed Chart

·

Pie Chart

·

Radar Chart

·

Radial Bar Chart

·

Scatter Chart

·

Funnel Chart

·

Treemap

·

Sankey Chart

·

Error Bar

图表部件

·

Axis

·

Cartesian Grid

·

Chart Tooltip

·

Legend

·

Label

·

Reference

·

Brush

其他图表库

·

Plotly

·

Pyplot

HTML 元素

·

HTML

·

HTML Text

·

HTML Layout

·

HTML Forms

·

HTML Media

·

HTML Tables

·

SVG

其他工具

·

Theme

·

Skeleton

·

Clipboard

·

Html Embed

·

Script

·

Memo

组件工坊:Reflex 组件库 100 例
表单

Radio Group

rx.radio_grouprx.radio_group.rootrx.radio_group.item

官方文档

工坊订单

请在结算页加一个从三种配送方式中选一种的选项,并立即显示所选方式的运费。

rx.radio_group 是让用户从多个选项中只选一个的一组控件。选项不超过五六个、需要一眼看全时使用。选项很多、需要节省空间时用 Select。传入列表,每个选项都会生成一个圆点和标签。

rx.radio_group(["1", "2", "3"], default_value="1")

试着改属性

试着改属性

direction

spacing

size

variant

color

high_contrast

disabled

rx.radio_group(["Small", "Medium", "Large"], default_value="Medium", direction="row", spacing="2", size="2", variant="classic", color_scheme="indigo", high_contrast=False, disabled=False)
direction 是选项的排列方向,spacing 是选项之间的间距。这两个只有高层 rx.radio_group 才有。
属性取值默认值用途
第一个参数(items)字符串列表 / Var必填选项列表,值与标签相同
value字符串 / Var无受控的选中值(配合 on_change)
default_value字符串""只在开始时选一次的值
direction"row" "column" "row-reverse" "column-reverse""row"排列方向(仅高层)
spacing"0" ~ "9""2"选项间距(仅高层)
size"1" ~ "3""2"大小
variant"classic" "surface" "soft""classic"外观
color_scheme, high_contrastRadix 颜色名 / True主题值颜色与对比度
disabled, required, name禁用、必须选择才能提交、表单提交名
on_change事件选中项变化时触发,传入该值(字符串)

用 on_change 取选中值

每选一个选项,on_change 都会传入该选项的值。rx.radio 是 rx.radio_group 的别名,像官方文档那样写成 rx.radio([...]) 也一样。

No Selection
class RadioGroupBasicState(rx.State):
    item: str = "No Selection"

    @rx.event
    def set_item(self, item: str):
        self.item = item


rx.vstack(
    rx.badge(RadioGroupBasicState.item, color_scheme="green"),
    rx.radio(["1", "2", "3"], on_change=RadioGroupBasicState.set_item, direction="row"),
)

受控单选组:value + on_change

把 State 的值交给 value,选中项就始终跟随这个值。按钮改了 State,选中项也会跟着移动。不给 value、只给 default_value 就是非受控:只定初始选择,之后由浏览器保管。

Selected: M

class RadioGroupControlState(rx.State):
    size: str = "M"

    @rx.event
    def set_size(self, value: str):
        self.size = value


rx.vstack(
    rx.radio_group(
        ["S", "M", "L", "XL"],
        value=RadioGroupControlState.size,
        on_change=RadioGroupControlState.set_size,
    ),
    rx.hstack(
        rx.button("Pick XL", on_click=RadioGroupControlState.set_size("XL"), size="1", variant="soft"),
        rx.text("Selected: ", rx.code(RadioGroupControlState.size), size="2"),
        align="center",
    ),
)

子组件:root 与 item

想让标签与值不同、只禁用某一个选项,或者自己安排布局时,就用底层 API。rx.radio_group.root 负责整组和选中值(value、default_value、on_change、name),rx.radio_group.item 是单个圆点。item 只接受 value、disabled、required。标签用 rx.text(..., as_="label") 包起来加上。

rx.radio_group.root(
    rx.flex(
        rx.text(rx.flex(rx.radio_group.item(value="card"), "Credit card", spacing="2"), as_="label", size="2"),
        rx.text(rx.flex(rx.radio_group.item(value="bank"), "Bank transfer", spacing="2"), as_="label", size="2"),
        rx.text(
            rx.flex(rx.radio_group.item(value="cash", disabled=True), "Cash (unavailable)", spacing="2"),
            as_="label",
            size="2",
            color_scheme="gray",
        ),
        direction="column",
        spacing="2",
    ),
    default_value="card",
    color_scheme="teal",
)

通过表单提交

name 是整组的名字,会以 名字: 选中值 的形式进入表单数据。什么都没选时,这个键不会出现。required=True 时必须选一个才能提交。

Results:

{}
class RadioGroupFormState(rx.State):
    form_data: dict = {}

    @rx.event
    def handle_submit(self, form_data: dict):
        self.form_data = form_data


rx.card(
    rx.vstack(
        rx.form.root(
            rx.vstack(
                rx.radio_group(
                    ["Option 1", "Option 2", "Option 3"],
                    name="radio_choice",
                    required=True,
                    direction="row",
                ),
                rx.button("Submit", type="submit"),
                spacing="4",
            ),
            on_submit=RadioGroupFormState.handle_submit,
            reset_on_submit=True,
        ),
        rx.divider(),
        rx.hstack(rx.text("Results:", weight="bold"), rx.badge(RadioGroupFormState.form_data.to_string())),
        spacing="4",
    ),
)

完成订单

运费表放在一个常量 dict 里,计算变量 fee 查出所选方式的运费。选项列表也由同一个 dict 的键生成,所以表里加一行,选项也会跟着多一个。

Shipping

Fee: 0 KRW

RADIO_SHIPPING_FEES = {"Standard": 0, "Express": 3000, "Same day": 7000}


class RadioGroupShippingState(rx.State):
    speed: str = "Standard"

    @rx.event
    def set_speed(self, value: str):
        self.speed = value

    @rx.var
    def fee(self) -> int:
        return RADIO_SHIPPING_FEES.get(self.speed, 0)


rx.card(
    rx.vstack(
        rx.text("Shipping", weight="bold"),
        rx.radio_group(
            list(RADIO_SHIPPING_FEES),
            value=RadioGroupShippingState.speed,
            on_change=RadioGroupShippingState.set_speed,
            direction="column",
        ),
        rx.divider(),
        rx.text("Fee: ", RadioGroupShippingState.fee, " KRW", size="2"),
    ),
    width="240px",
)

工坊笔记

  • rx.radio_group([选项...]) 只能选一个。选项少时用它代替 Select。

  • on_change 传入选中值。受控用 value + on_change,只定初始值用 default_value。

  • direction · spacing 只有高层才有。精细布局和标签用 root + item。

  • 在表单中是 name: 选中值。required 时必须选择才能提交。

← 上一课

表单 · Switch

下一课 →

表单 · Select

订阅新课时和新课程通知

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

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

问答

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

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

R

ReflexKR

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

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

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

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

Built with Reflex