Opening hours
Mon to Fri, 9 am to 6 pm.
El taller de componentes: los 100 componentes de Reflex
·
Resumen del curso
Diseño
·
Box
·
Flex
·
Stack
·
Grid
·
Container
·
Section
·
Center
·
Spacer
·
Separator
·
Card
·
Inset
·
Aspect Ratio
·
Fragment
Tipografía
·
Text
·
Heading
·
Link
·
Code
·
Markdown
·
Blockquote
·
Quote
·
Strong
·
Em
·
Kbd
Formularios
·
Button
·
Input
·
Text Area
·
Checkbox
·
Switch
·
Radio Group
·
Select
·
Slider
·
Form
·
Upload
Visualización de datos
·
Badge
·
Avatar
·
Icon
·
Callout
·
List
·
Data List
·
Code Block
·
Progress
·
Spinner
·
Scroll Area
·
Moment
Mostrar y ocultar
·
Tabs
·
Accordion
·
Segmented Control
Superposiciones
·
Tooltip
·
Popover
·
Hover Card
·
Dialog
·
Alert Dialog
·
Drawer
·
Dropdown Menu
·
Context Menu
·
Toast
Renderizado dinámico
·
Cond
·
Match
·
Foreach
·
Auto Scroll
Multimedia
·
Image
·
Audio
·
Video
Tablas y cuadrículas de datos
·
Table
·
Data Table
·
Data Editor
Gráficos
·
Area Chart
·
Bar Chart
·
Line Chart
·
Composed Chart
·
Pie Chart
·
Radar Chart
·
Radial Bar Chart
·
Scatter Chart
·
Funnel Chart
·
Treemap
·
Sankey Chart
·
Error Bar
Piezas de gráficos
·
Axis
·
Cartesian Grid
·
Chart Tooltip
·
Legend
·
Label
·
Reference
·
Brush
Otras bibliotecas de gráficos
·
Plotly
·
Pyplot
Elementos HTML
·
HTML
·
HTML Text
·
HTML Layout
·
HTML Forms
·
HTML Media
·
HTML Tables
·
SVG
Otras herramientas
·
Theme
·
Skeleton
·
Clipboard
·
Html Embed
·
Script
·
Memo
rx.el.addressrx.el.articlerx.el.asiderx.el.blockquoterx.el.bodyrx.el.ddrx.el.del_rx.el.detailsrx.el.dialogrx.el.dlrx.el.dtrx.el.figcaptionrx.el.footerrx.el.h1 ~ h6rx.el.headrx.el.headerrx.el.hrrx.el.htmlrx.el.lirx.el.linkrx.el.mainrx.el.navrx.el.noscriptrx.el.olrx.el.portalrx.el.prerx.el.scriptrx.el.sectionrx.el.templaterx.el.titlerx.el.ulDocumentación oficial
Pedido del taller
Estructura una entrada de noticias de la tienda con HTML semántico: cabecera, cuerpo, un consejo al margen, preguntas desplegables y un pie con los datos de contacto.
Son los elementos HTML que se encargan de la estructura y la disposición del documento. Incluyen los que dan nombre a zonas, como header·main·footer, los títulos h1~h6, las listas ul·ol·dl y el desplegable details.
Con div se puede conseguir el mismo aspecto, pero si usas elementos con significado, los lectores de pantalla y los buscadores entienden la estructura de la página.
Mon to Fri, 9 am to 6 pm.
rx.el.article(
rx.el.header(rx.el.h2("Opening hours", font_weight="bold")),
rx.el.p("Mon to Fri, 9 am to 6 pm."),
rx.el.footer("Updated today", font_size="12px", color="gray"),
padding="12px",
border="1px solid gray",
border_radius="8px",
)La mayoría de los elementos de estructura solo tienen atributos comunes. Prueba con ol (reversed) y details (open), que sí tienen atributos propios.
En este sitio, el preflight de Tailwind borra las viñetas de las listas, así que se recuperan con el CSS list_style_type.
Prueba las propiedades
Shown when the details element is open.
reversed
marker
summary
open
rx.el.div(
rx.el.ol(
rx.el.li("Mix"),
rx.el.li("Bake"),
rx.el.li("Serve"),
reversed=False,
list_style_type="decimal",
padding_left="2em",
),
rx.el.details(
rx.el.summary("More info", cursor="pointer"),
rx.el.p("Shown when the details element is open."),
open=False,
),
)| Propiedad | Valores | Por defecto | Uso |
|---|---|---|---|
start (ol) | Entero | 1 | Primer número |
reversed (ol) | True / False | False | Numeración inversa |
type (ol) | "1" "a" "A" "i" "I" | "1" | Tipo de numeración. Con preflight, la sustituye el CSS list_style_type |
open (details, dialog) | True / False | False | Desplegado · abierto |
cite (blockquote, del_) | URL | Ninguno | Fuente de la cita o de la modificación |
date_time (del_) | Cadena de fecha | Ninguno | Momento en que se borró |
rel href … (link) | Cadena | Ninguno | Enlace a recursos externos (para la cabecera del documento) |
async_ defer src … (script) | bool · cadena | Ninguno | Etiqueta de script (ver la página Script) |
header es la cabecera, nav el menú de navegación, main el contenido principal, article un texto con sentido propio aunque se separe del resto, aside el contenido al margen, section un bloque temático, footer el pie y address los datos de contacto.
Todos son cajas sin estilo, así que la disposición se decide con CSS como display="grid"·"flex".
The main story goes here.
A themed section of the page.
rx.el.div(
rx.el.header(
rx.el.strong("Workshop"),
rx.el.nav(rx.el.span("Home"), rx.el.span("Parts"), rx.el.span("About"), display="flex", gap="12px"),
display="flex",
justify_content="space-between",
padding="8px",
background=rx.color("indigo", 3),
),
rx.el.main(
rx.el.article(rx.el.h3("Post title", font_weight="bold"), rx.el.p("The main story goes here.")),
rx.el.aside("Related links", padding="8px", background=rx.color("gray", 3)),
display="grid",
grid_template_columns="2fr 1fr",
gap="12px",
padding="8px",
),
rx.el.section(rx.el.p("A themed section of the page."), padding="8px", border_top="1px dashed gray"),
rx.el.footer(rx.el.address("hello@example.com"), padding="8px", font_size="13px", color="gray"),
border="1px solid gray",
border_radius="8px",
overflow="hidden",
)Por el preflight, h1 y h3 aparecen del mismo tamaño que el texto normal. El título es significado; el tamaño se fija aparte con font_size.
hr es una línea de cambio de tema, blockquote una cita larga (con la fuente en cite) y pre un texto que respeta tal cual los espacios y saltos de línea.
El elemento del choca con una palabra reservada de Python, así que en Reflex se escribe rx.el.del_ (en la lista de la documentación oficial figura como rx.el.Del). Su pareja, rx.el.ins, es texto añadido.
Make it work, make it right, make it fast.
def hello():
print('hi')Price: $20 $15
rx.el.div(
rx.el.h1("h1 with no style"),
rx.el.h3("h3 with no style"),
rx.el.h2("h2 with style", font_size="24px", font_weight="bold"),
rx.el.hr(margin_y="8px"),
rx.el.blockquote(
"Make it work, make it right, make it fast.",
cite="https://wiki.c2.com/?MakeItWorkMakeItRightMakeItFast",
border_left="4px solid gray",
padding_left="12px",
font_style="italic",
),
rx.el.pre("def hello():\n print('hi')", padding="8px", background=rx.color("gray", 3)),
rx.el.p("Price: ", rx.el.del_("$20", date_time="2026-10-01"), " ", rx.el.ins("$15")),
)ul es una lista sin orden y ol una lista numerada; los elementos son li. dl es una lista de descripciones que coloca pares de término (dt) y descripción (dd).
rx.el.div(
rx.el.ul(rx.el.li("Apples"), rx.el.li("Pears"), list_style_type="disc", padding_left="1.5em"),
rx.el.ol(rx.el.li("Third"), rx.el.li("Fourth"), start=3, list_style_type="decimal", padding_left="1.5em"),
rx.el.dl(
rx.el.dt("Box", font_weight="bold"),
rx.el.dd("A container with no meaning.", margin_left="1.5em"),
rx.el.dt("Flex", font_weight="bold"),
rx.el.dd("A row or column of children.", margin_left="1.5em"),
),
display="flex",
gap="24px",
flex_wrap="wrap",
)El primer summary dentro de details hace de título, y al pulsarlo el navegador despliega y pliega por sí solo. No hace falta State.
dialog se abre con el atributo open. Abierto así, es una ventana no modal que no bloquea lo de detrás; para un diálogo modal que cubra la pantalla, es más fácil usar rx.dialog.
A box the browser opens and closes by itself.
class HtmlLayoutDialogState(rx.State):
is_open: bool = False
@rx.event
def toggle(self):
self.is_open = not self.is_open
rx.el.div(
rx.el.details(
rx.el.summary("What is details?", cursor="pointer"),
rx.el.p("A box the browser opens and closes by itself."),
),
rx.el.button(
"Toggle dialog",
on_click=HtmlLayoutDialogState.toggle,
padding="4px 12px",
border="1px solid gray",
border_radius="6px",
margin_top="12px",
),
rx.el.dialog(
rx.el.p("A non-modal dialog, opened by the open prop."),
open=HtmlLayoutDialogState.is_open,
padding="12px",
border="1px solid gray",
border_radius="8px",
top="40px",
),
position="relative",
min_height="150px",
)figcaption añade, dentro de figure, una leyenda a contenido como imágenes, tablas o código.
rx.el.figure(
rx.el.img(src="https://picsum.photos/id/1080/320/160", alt="Strawberries", border_radius="6px"),
rx.el.figcaption("Fig. 1 - Fresh strawberries", font_size="13px", color="gray", margin_top="4px"),
width="320px",
)El contenido de template no se dibuja en pantalla: queda solo como plantilla para clonar. noscript solo se ve en navegadores con JavaScript desactivado. Una app de Reflex funciona con JavaScript, así que aquí no se ve.
Only this line is visible.
rx.el.div(
rx.el.p("Only this line is visible."),
# rx.el.template(...) also keeps its content off the page, but React cannot
# hydrate children inside <template>, so it is left out of this live example.
rx.el.noscript("Please turn on JavaScript."),
)html, head, body, title, link, script y portal son elementos del documento completo o de su cabecera. Reflex ya construye ese marco, así que casi nunca se usan dentro de una página, y aquí también se muestran solo como código.
React 19 sube a la cabecera del documento los title·link puestos en el cuerpo, así que si se dibujaran en la página cambiarían el título de la pestaña de este sitio.
# Document-level and head elements: Reflex already renders these, so pages rarely use them
rx.el.html(...) # manifest attribute (removed in HTML5)
rx.el.head(...)
rx.el.body(...)
rx.el.title("Page title") # set page titles with @rx.page(title=...)
rx.el.link(rel="stylesheet", href="/styles.css") # add stylesheets with rx.App(stylesheets=[...])
rx.el.script(src="/my-script.js") # use rx.script for scripts (see the Script page)
rx.el.portal(...) # experimental element that never became a standardEl texto completo va en article, el título y la fecha en header, el cuerpo en section, el consejo en aside, las preguntas en details y el contacto en un address dentro de footer.
Three new dishes join the menu this week.
Yes, the soup and rolls are vegan.
rx.el.article(
rx.el.header(
rx.el.h1("Spring menu is here", font_size="22px", font_weight="bold"),
rx.el.p(rx.el.time("Mar 3, 2026", date_time="2026-03-03"), font_size="13px", color="gray"),
),
rx.el.section(
rx.el.p("Three new dishes join the menu this week."),
rx.el.ul(rx.el.li("Spring rolls"), rx.el.li("Pea soup"), rx.el.li("Lemon tart"), list_style_type="disc", padding_left="1.5em"),
margin_y="8px",
),
rx.el.aside("Tip: book a table early.", padding="8px", background=rx.color("amber", 3), border_radius="6px"),
rx.el.details(
rx.el.summary("Do you have vegan options?", cursor="pointer", font_weight="600"),
rx.el.p("Yes, the soup and rolls are vegan."),
margin_y="8px",
),
rx.el.hr(),
rx.el.footer(rx.el.address("12 Market St · hello@example.com"), font_size="13px", color="gray", margin_top="8px"),
padding="16px",
border="1px solid gray",
border_radius="10px",
max_width="420px",
)Notas del taller
header·nav·main·article·section·aside·footer dan nombre a zonas. La disposición, con CSS.
h1~h6 son solo significado. Con preflight, el tamaño se fija con font_size.
ul·ol·li, dl·dt·dd. Las viñetas, con list_style_type; ol tiene start·reversed.
details + summary despliegan sin State. El open de dialog es no modal; para modal, rx.dialog.
del es rx.el.del_. html·head·body·title·link los gestiona Reflex, así que no se usan en la página.
Recibe avisos de nuevas lecciones
Te avisaremos por correo cuando este curso tenga lecciones nuevas o se abra un curso de continuación.
R
ReflexKR
Aprende Python y Reflex haciendo. Todos los ejemplos se ejecutaron y verificaron en Reflex 0.10.0.
ReflexKR es gratis y sin banners publicitarios. Si te ayudó, puedes apoyarlo con un café. ☕ Invítanos un café
Aviso de afiliados© 2026 ReflexKR · Since 2026 · CC BY-NC 4.0
Preguntas y respuestas
Pregunta lo que quieras sobre esta lección. Aquí se reúnen las preguntas de todas las versiones de idioma de esta página.