コンポーネント工房: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
rx.foreach公式ドキュメント
工房の注文書
ToDo リストを作ってください。新しいタスクを追加でき、終わったタスクは「Done」を押してリストから消せるようにしてください。
rx.foreach(リスト, 関数)は State のリスト・タプル・dict を回り、項目ごとに関数が作ったコンポーネントを並べます。リストが変われば画面もすぐに描き直されます。Python のforはページを作るときに一度だけ回るので、State のリストには使えません。
State 変数にはrx.foreachを、変わらない定数には Python のリスト・dict 内包表記を使います。
#E5484D
#12A594
#3E63DD
#AD5700
#F76B15
#8E4EC6
class ForeachColorState(rx.State):
colors: list[str] = ["#E5484D", "#12A594", "#3E63DD", "#AD5700", "#F76B15", "#8E4EC6"]
def foreach_color_swatch(label: rx.Var[str | int], color: rx.Var[str]):
return rx.box(
rx.text(label, color="white", weight="medium"),
bg=color,
padding_y="0.5em",
padding_x="0.75em",
min_width="5.5em",
text_align="center",
border_radius="0.375rem",
)
def foreach_colored_box(color: rx.Var[str]):
return foreach_color_swatch(color, color)
rx.grid(
rx.foreach(ForeachColorState.colors, foreach_colored_box),
columns="2",
spacing="2",
)関数が受け取るcolorは Python の文字列ではなくrx.Var[str]です。そのため、そのまま子要素やプロパティの値(bg=color)に入れられますが、Python のifや文字列メソッドは使えません(条件分岐はrx.cond)。
rx.foreachには見た目のプロパティはありません。代わりにリストを変えてみてください。バッジをクリックするとその項目が消え、Add で新しい項目が加わります。イベントに項目の値を渡すにはon_click=State.remove(f)のように書きます。
2 items
FOREACH_FRUIT_POOL = ["apple", "banana", "cherry", "grape", "kiwi", "mango", "pear", "plum"]
class ForeachLiveState(rx.State):
fruits: list[str] = ["apple", "banana"]
@rx.event
def add(self):
for f in FOREACH_FRUIT_POOL:
if f not in self.fruits:
self.fruits.append(f)
return
@rx.event
def remove(self, fruit: str):
if fruit in self.fruits:
self.fruits.remove(fruit)
@rx.event
def reset_fruits(self):
self.fruits = ["apple", "banana"]
rx.vstack(
rx.hstack(
rx.foreach(
ForeachLiveState.fruits,
lambda f: rx.badge(f, rx.icon("x", size=12), on_click=ForeachLiveState.remove(f), cursor="pointer", size="2"),
),
wrap="wrap",
),
rx.hstack(
rx.button("Add", on_click=ForeachLiveState.add, size="1"),
rx.button("Reset", on_click=ForeachLiveState.reset_fruits, size="1", variant="soft", color_scheme="gray"),
rx.text(ForeachLiveState.fruits.length(), " items", size="1", color_scheme="gray"),
align="center",
),
)| 引数 | 値 | 用途 |
|---|---|---|
1つ目(iterable) | リスト・タプル・dict の Var | 回るリスト。ふつうは State 変数か計算変数 |
2つ目(render_fn) | 関数(item)または(item, index) | 項目ひとつからコンポーネントを作る。2つ目の引数は 0 から数える番号 |
関数が引数を2つ受け取ると、2つ目に番号(rx.Var[int]、0 から)が来ます。色の箱は最初の例のforeach_color_swatchをそのまま使います(下の dict の例も同じです)。
0
1
2
3
class ForeachIndexState(rx.State):
colors: list[str] = ["#E5484D", "#12A594", "#3E63DD", "#AD5700"]
def foreach_colored_box_index(color: rx.Var[str], index: rx.Var[int]):
return foreach_color_swatch(index, color)
rx.grid(
rx.foreach(ForeachIndexState.colors, lambda color, index: foreach_colored_box_index(color, index)),
columns="2",
spacing="2",
)rx.foreachの中でさらにrx.foreachを使うと、2次元のリストを描けます。このとき State 変数の型はlist[list[str]]のように最後まで書く必要があります。Reflex は内側の項目の型がわかって初めて下位のリストを回れ、間違ったコードもブラウザのエラーになる前に見つけてくれます。
class ForeachNestedState(rx.State):
numbers: list[list[str]] = [["1", "2", "3"], ["4", "5", "6"], ["7", "8", "9"]]
def foreach_display_row(row: rx.Var[list[str]]):
return rx.hstack(
rx.foreach(
row,
lambda item: rx.box(item, border=f"1px solid {rx.color('gray', 8)}", padding="0.5em", min_width="2.2em", text_align="center"),
),
)
rx.vstack(rx.foreach(ForeachNestedState.numbers, foreach_display_row))dict を渡すと、関数は(キー, 値)のペアをひとつ受け取ります。color[0]がキー、color[1]が値です。キーは元の型が何であれ(ここではint)、関数の中では文字列に変わって届きます。
1
2
3
class ForeachSimpleDictState(rx.State):
color_chart: dict[int, str] = {1: "#3E63DD", 2: "#E5484D", 3: "#12A594"}
def foreach_display_color(color: rx.Var[tuple[str, str]]):
# color is a key-value pair such as ("1", "#3E63DD").
return foreach_color_swatch(color[0], color[1])
rx.grid(
rx.foreach(ForeachSimpleDictState.color_chart, foreach_display_color),
columns="3",
spacing="2",
)値がリストの dict なら、値をさらにrx.foreachで回ります。下では、キーの色ひとつの下に、組になる色を並べます。
#8E4EC6
#E5484D
#3E63DD
#F76B15
#AD5700
#E5484D
#12A594
#3E63DD
#AD5700
class ForeachComplexDictState(rx.State):
color_chart: dict[str, list[str]] = {
"#8E4EC6": ["#E5484D", "#3E63DD"],
"#F76B15": ["#AD5700", "#E5484D"],
"#12A594": ["#3E63DD", "#AD5700"],
}
def foreach_display_colors(color: rx.Var[tuple[str, list[str]]]):
return rx.vstack(
foreach_color_swatch(color[0], color[0]),
rx.hstack(rx.foreach(color[1], lambda x: foreach_color_swatch(x, x))),
align="center",
spacing="2",
)
rx.grid(
rx.foreach(ForeachComplexDictState.color_chart, foreach_display_colors),
columns="3",
spacing="4",
)リストが変わらない定数ならrx.foreachは不要です。ページを作るときに Python が一度回してコンポーネントを展開しておけばよく、項目も本物の Python の値なので、文字列メソッドやifが使えます。
rx.hstack(
*[rx.badge(size, variant="soft") for size in ["S", "M", "L", "XL"]],
)タスクは{"id", "text"}の dict のリストです(公式ドキュメントのように dataclass のリストでも構いません)。項目ごとにkey=item["id"]を渡すと、ひとつ消してもほかの行はそのまま保たれます。Done はその項目の id をハンドラーに渡し、ハンドラーはその id を除いた新しいリストを作ります。入力はフォームで受け取るので、Enter でも追加できます。
Write Code
Sleep
Have Fun
class ForeachTodoState(rx.State):
items: list[dict[str, str]] = [
{"id": "1", "text": "Write Code"},
{"id": "2", "text": "Sleep"},
{"id": "3", "text": "Have Fun"},
]
next_id: int = 4
@rx.event
def add_item(self, form_data: dict):
text = form_data.get("new_item", "").strip()[:40]
if text and len(self.items) < 8:
self.items = self.items + [{"id": str(self.next_id), "text": text}]
self.next_id += 1
@rx.event
def finish_item(self, item_id: str):
self.items = [item for item in self.items if item["id"] != item_id]
rx.vstack(
rx.heading("Todos", size="4"),
rx.form(
rx.hstack(
rx.input(name="new_item", placeholder="Add a todo...", flex="1"),
rx.button("Add", type="submit"),
width="100%",
),
on_submit=ForeachTodoState.add_item,
reset_on_submit=True,
width="100%",
),
rx.divider(),
rx.list.ordered(
rx.foreach(
ForeachTodoState.items,
lambda item: rx.list.item(
rx.hstack(
rx.button("Done", on_click=ForeachTodoState.finish_item(item["id"]), size="1", variant="soft"),
rx.text(item["text"]),
align="center",
),
key=item["id"],
),
),
),
width="100%",
max_width="360px",
padding="1em",
border_radius="0.5em",
background=rx.color("gray", 3),
)工房ノート
rx.foreach(State.リスト, 関数)。定数のリストには Python の内包表記。
関数が受け取る項目は Var。Python の if の代わりに rx.cond、値は item["key"] で。
(item, index) で番号も受け取れる。dict は (キー, 値) のペアで、キーは文字列になる。
入れ子のリストは型を list[list[str]] のように最後まで書く。
消したり追加したりするリストには key=一意の値 を渡す。
新しい授業・講座のお知らせを受け取る
この講座に授業が追加されたり、続きの講座が公開されたりしたらメールでお知らせします。
R
ReflexKR
触って学ぶPythonとReflex。すべての例はReflex 0.10.0で実際に動かして確認しています。
ReflexKRはバナー広告なし・無料で運営しています。役に立ったら、コーヒー一杯で応援してください。 ☕ コーヒーで応援する
アフィリエイトと支援について© 2026 ReflexKR · Since 2026 · CC BY-NC 4.0
質問と回答
この回について気になることを書き込んでください。すべての言語のページの質問がここに集まります。