Die Komponentenwerkstatt: Reflex' 100 Bibliotheksbausteine
·
Kursüberblick
Layout
·
Box
·
Flex
·
Stack
·
Grid
·
Container
·
Section
·
Center
·
Spacer
·
Separator
·
Card
·
Inset
·
Aspect Ratio
·
Fragment
Typografie
·
Text
·
Heading
·
Link
·
Code
·
Markdown
·
Blockquote
·
Quote
·
Strong
·
Em
·
Kbd
Formulare
·
Button
·
Input
·
Text Area
·
Checkbox
·
Switch
·
Radio Group
·
Select
·
Slider
·
Form
·
Upload
Datenanzeige
·
Badge
·
Avatar
·
Icon
·
Callout
·
List
·
Data List
·
Code Block
·
Progress
·
Spinner
·
Scroll Area
·
Moment
Auf- und Zuklappen
·
Tabs
·
Accordion
·
Segmented Control
Overlays
·
Tooltip
·
Popover
·
Hover Card
·
Dialog
·
Alert Dialog
·
Drawer
·
Dropdown Menu
·
Context Menu
·
Toast
Dynamisches Rendern
·
Cond
·
Match
·
Foreach
·
Auto Scroll
Medien
·
Image
·
Audio
·
Video
Tabellen und Datengrids
·
Table
·
Data Table
·
Data Editor
Diagramme
·
Area Chart
·
Bar Chart
·
Line Chart
·
Composed Chart
·
Pie Chart
·
Radar Chart
·
Radial Bar Chart
·
Scatter Chart
·
Funnel Chart
·
Treemap
·
Sankey Chart
·
Error Bar
Diagrammbausteine
·
Axis
·
Cartesian Grid
·
Chart Tooltip
·
Legend
·
Label
·
Reference
·
Brush
Andere Diagrammbibliotheken
·
Plotly
·
Pyplot
HTML-Elemente
·
HTML
·
HTML Text
·
HTML Layout
·
HTML Forms
·
HTML Media
·
HTML Tables
·
SVG
Weitere Werkzeuge
·
Theme
·
Skeleton
·
Clipboard
·
Html Embed
·
Script
·
Memo
rx.clipboardOffizielle Doku
Werkstattauftrag
Bitte baue ins Fehlermeldeformular ein Feld, in das Nutzer einfach einen Screenshot einfügen, der dann sofort als Bild angehängt ist.
rx.clipboard fängt Einfüge-Events (paste) ab und reicht den eingefügten Inhalt nach Typ getrennt an den State weiter. Neben Text nimmt es auch Binärdaten wie Bilder an.
Es ist eine unsichtbare Komponente, die selbst nichts zeichnet und auf Einfügevorgänge in den umschlossenen Kindern lauscht. Es gibt sie seit Reflex 0.5.6.
class ClipboardBasicState(rx.State):
items: list[str] = []
@rx.event
def on_paste(self, data: list[tuple[str, str]]):
self.items = [f"{mime_type}: {item[:60]}" for mime_type, item in data]
rx.vstack(
rx.clipboard(
rx.input(placeholder="Copy some text, then paste here"),
on_paste=ClipboardBasicState.on_paste,
),
rx.foreach(ClipboardBasicState.items, lambda line: rx.code(line, size="1")),
width="100%",
max_width="420px",
)rx.clipboard hat keine sichtbaren Props, daher gibt es statt eines Experimentiertischs ein Beispiel, das aufs Einfügen reagiert.
Fügst du Text ein, kommt text/plain; bei Text, der von einer Webseite kopiert wurde, zusätzlich text/html; bei einem Bild ein Typ wie image/png.
Paste events: 0
class ClipboardTypesState(rx.State):
count: int = 0
types: list[str] = []
@rx.event
def on_paste(self, data: list[tuple[str, str]]):
self.count += 1
self.types = [mime_type for mime_type, _ in data]
rx.card(
rx.clipboard(
rx.text_area(placeholder="Paste text, an image, or a copied web page", rows="3"),
on_paste=ClipboardTypesState.on_paste,
),
rx.text("Paste events: ", ClipboardTypesState.count, size="2", margin_top="8px"),
rx.flex(rx.foreach(ClipboardTypesState.types, lambda t: rx.badge(t)), spacing="2", wrap="wrap", margin_top="6px"),
max_width="420px",
)| Prop | Werte | Standard | Verwendung |
|---|---|---|---|
on_paste | Event-Handler | keiner | Bekommt eine Liste von Tupeln (MIME-Typ, Daten) |
targets | Liste von Element-ids | die Kinder, ohne Kinder das ganze Dokument | Elemente, auf deren Einfügen gelauscht wird |
.stop_propagation | Event-Aktion | keiner | Nicht an äußere Einfüge-Handler weiterreichen |
.prevent_default | Event-Aktion | keiner | Verhindert das tatsächliche Einfügen ins Eingabefeld |
Die data, die on_paste bekommt, ist eine Liste von Tupeln (mime_type, data). Text kommt unverändert als String,
Binärdaten wie Bilder kommen als base64-kodierte Data-URI (data:image/png;base64,...). Dieser String passt direkt in src von rx.image,
und brauchst du auf dem Server die Bytes, entpackst du ihn in Python mit urllib.request.urlopen(data_uri).read().
Ein einzelnes rx.clipboard() ohne Kinder hängt sich an das paste-Event des Dokuments und reagiert, wo auch immer auf der Seite eingefügt wird.
Auf dieser Seite würde es so auch das Einfügen in alle anderen Beispiele abfangen, daher steht das Beispiel der offiziellen Doku nur als Code da.
class ClipboardPasteState(rx.State):
@rx.event
def on_paste(self, data: list[tuple[str, str]]):
for mime_type, item in data:
yield rx.toast(f"Pasted {mime_type} data: {item}")
def clipboard_example():
return rx.fragment(
rx.clipboard(on_paste=ClipboardPasteState.on_paste), # no children: listens for paste on the whole document
"Paste Content Here",
)Soll nur ein bestimmtes Element Einfügevorgänge empfangen, umschließt du es mit rx.clipboard. Gibt es außen einen seitenweiten Handler, verhinderst du mit .stop_propagation, dass das Event nach oben weiterwandert.
Mit .prevent_default landet der Text nicht wirklich im Eingabefeld. Füg im zweiten Feld Text ein: Es bleibt leer.
No image yet. Copy an image (or take a screenshot) and paste above.
class ClipboardImageState(rx.State):
last_image_uri: str = ""
@rx.event
def on_paste(self, data: list[tuple[str, str]]):
for mime_type, item in data:
if mime_type.startswith("image/"):
if len(item) > 2_000_000:
return rx.toast("This image is too large for the demo")
self.last_image_uri = item
break
else:
return rx.toast("Did not find an image in the pasted data")
rx.vstack(
rx.clipboard(
rx.input(placeholder="Paste Image (stop propagation)"),
on_paste=ClipboardImageState.on_paste.stop_propagation,
),
rx.clipboard(
rx.input(placeholder="Paste Image (prevent default)"),
on_paste=ClipboardImageState.on_paste.prevent_default,
),
rx.cond(
ClipboardImageState.last_image_uri != "",
rx.image(src=ClipboardImageState.last_image_uri, alt="Image pasted from clipboard", max_width="240px", border_radius="6px"),
rx.text("No image yet. Copy an image (or take a screenshot) and paste above.", size="2", color_scheme="gray"),
),
width="100%",
max_width="420px",
)Gibst du targets die id eines Elements, lauscht es nur auf dieses Element, ohne es zu umschließen. Umschließt du Kinder, gibt Reflex ihnen ids und füllt targets automatisch.
Pasted characters: 0
class ClipboardTargetState(rx.State):
pasted_chars: int = 0
@rx.event
def on_paste(self, data: list[tuple[str, str]]):
self.pasted_chars += sum(len(item) for mime_type, item in data if mime_type == "text/plain")
rx.vstack(
rx.clipboard(on_paste=ClipboardTargetState.on_paste, targets=["clipboard_target_note"]),
rx.text_area(id="clipboard_target_note", placeholder="Only this box is watched", rows="2"),
rx.input(placeholder="This box is not watched"),
rx.text("Pasted characters: ", ClipboardTargetState.pasted_chars, size="2"),
width="100%",
max_width="420px",
)Klick in die gestrichelte Box, um sie zu fokussieren, und füg einen Screenshot ein: Das Bild ist angehängt. Die Box ist kein Eingabefeld, daher bekommt sie mit tab_index=0 den Fokus,
und die Event-Aktionen sind wie .prevent_default.stop_propagation verkettet. Das Bild landet als Data-URI im State, zu große Bilder werden deshalb aussortiert.
Click here, then paste a screenshot (Ctrl + V)
class ClipboardTicketState(rx.State):
shot: str = ""
note: str = ""
@rx.event
def on_paste(self, data: list[tuple[str, str]]):
for mime_type, item in data:
if mime_type.startswith("image/") and len(item) <= 2_000_000:
self.shot = item
return
return rx.toast("Paste a screenshot (an image) here")
@rx.event
def change_note(self, value: str):
self.note = value
@rx.event
def clear_shot(self):
self.shot = ""
rx.card(
rx.heading("Bug report", size="3"),
rx.text_area(
value=ClipboardTicketState.note,
on_change=ClipboardTicketState.change_note,
placeholder="What went wrong?",
rows="2",
margin_y="8px",
),
rx.clipboard(
rx.box(
rx.cond(
ClipboardTicketState.shot != "",
rx.image(src=ClipboardTicketState.shot, alt="Pasted screenshot", max_height="160px"),
rx.text("Click here, then paste a screenshot (Ctrl + V)", size="2", color_scheme="gray"),
),
tab_index=0,
padding="16px",
border=f"2px dashed {rx.color('gray', 7)}",
border_radius="8px",
text_align="center",
),
on_paste=ClipboardTicketState.on_paste.prevent_default.stop_propagation,
),
rx.button("Remove screenshot", on_click=ClipboardTicketState.clear_shot, variant="soft", color_scheme="gray", size="1", margin_top="8px"),
max_width="420px",
)Werkstattnotizen
rx.clipboard(kind, on_paste=...) lauscht auf Einfügen in den Kindern. Ohne Kinder auf das ganze Dokument.
on_paste bekommt [(mime_type, data), ...]. Binärdaten sind base64-Data-URIs.
Eine Data-URI passt direkt in src von rx.image.
.stop_propagation hält vom äußeren Handler fern, .prevent_default verhindert das tatsächliche Einfügen.
Mit targets=[id, ...] nur auf bestimmte Elemente lauschen, ohne zu umschließen.
Über neue Lektionen informiert werden
Wir schicken dir eine E-Mail, wenn dieser Kurs neue Lektionen bekommt oder ein Folgekurs erscheint.
R
ReflexKR
Python und Reflex zum Anfassen. Alle Beispiele wurden mit Reflex 0.10.0 ausgeführt und geprüft.
ReflexKR ist kostenlos und ohne Werbebanner. Wenn es dir geholfen hat, kannst du es mit einem Kaffee unterstützen. ☕ Spendier uns einen Kaffee
Hinweis zu Affiliate-Links© 2026 ReflexKR · Since 2026 · CC BY-NC 4.0
Fragen & Antworten
Frag alles zu dieser Lektion. Fragen aus allen Sprachversionen dieser Seite erscheinen hier gemeinsam.