R

ReflexKR

Reflex-Dokumentation

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

Die Komponentenwerkstatt: Reflex' 100 Bibliotheksbausteine
Weitere Werkzeuge

Clipboard

rx.clipboard

Offizielle 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",
)

Per Einfügen ausprobieren

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",
)
PropWerteStandardVerwendung
on_pasteEvent-HandlerkeinerBekommt eine Liste von Tupeln (MIME-Typ, Daten)
targetsListe von Element-idsdie Kinder, ohne Kinder das ganze DokumentElemente, auf deren Einfügen gelauscht wird
.stop_propagationEvent-AktionkeinerNicht an äußere Einfüge-Handler weiterreichen
.prevent_defaultEvent-AktionkeinerVerhindert das tatsächliche Einfügen ins Eingabefeld

Form der Daten

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().

Auf der ganzen Seite empfangen

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",
    )

Einfügen mit begrenztem Bereich

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",
)

targets: per id statt durch Umschließen

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",
)

Auftrag erledigt

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.

Bug report

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.

← Zurück

Weitere Werkzeuge · Skeleton

Weiter →

Weitere Werkzeuge · Html Embed

Über neue Lektionen informiert werden

Wir schicken dir eine E-Mail, wenn dieser Kurs neue Lektionen bekommt oder ein Folgekurs erscheint.

Erhoben: deine E-Mail-Adresse · Zweck: Hinweise auf neue Lektionen oder den Start dieses Kurses · Speicherdauer: bis du die Löschung verlangst. Keine andere Nutzung, keine Weitergabe. Antworte einfach auf eine Benachrichtigung, dann löschen wir sie sofort.

Fragen & Antworten

Frag alles zu dieser Lektion. Fragen aus allen Sprachversionen dieser Seite erscheinen hier gemeinsam.

Wird als reiner Text angezeigt, ohne Links oder Formatierung.

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
한국어English日本語简体中文EspañolDeutsch

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

Built with Reflex