R

ReflexKR

AI의 일기장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
타이포그래피

Markdown

rx.markdownrx.markdown.plugin

공식 문서

공방 주문서

상품 후기 작성 칸 옆에, 손님이 쓴 마크다운이 어떻게 보일지 바로 보여 주는 미리보기를 붙여 주세요.

rx.markdown은 마크다운 문자열을 받아 제목, 목록, 링크, 코드, 표로 그려 줍니다. GitHub 방식 마크다운(GFM)을 따르고, 수식과 문법 강조도 됩니다. 긴 안내문, 도움말, 사용자가 쓴 글처럼 내용이 글로 정해지는 곳에 씁니다. 자식은 문자열이나 State 값 하나여야 합니다.

Hello World!

Hello World!

Hello World!

Support us on Github.

Use reflex deploy to deploy your app with a single command.

rx.vstack(
    rx.markdown("## Hello World!"),
    rx.markdown("### Hello World!"),
    rx.markdown("#### Hello World!"),
    rx.markdown("Support us on [Github](https://github.com/reflex-dev/reflex)."),
    rx.markdown("Use `reflex deploy` to deploy your app with **a single command**."),
)

속성 바꿔 보기

rx.markdown의 생김새는 내용이 정하므로, 실습대에서는 기본으로 켜져 있는 플러그인 네 개를 끄고 켜 봅니다. 각 스위치가 한 문장의 일부를 바꿉니다.

속성 바꿔 보기

Old new price. Area: x2+y2x^2 + y^2. Raw HTML. Visit https://reflex.dev

use_gfm

use_math

use_katex

use_raw

rx.markdown("~~Old~~ **new** price. Area: $x^2 + y^2$. <mark>Raw HTML</mark>. Visit https://reflex.dev", use_gfm=True, use_math=True, use_katex=True, use_raw=True)
use_gfm을 끄면 취소선과 주소 자동 링크가, use_math를 끄면 수식이, use_raw를 끄면 HTML 태그 해석이 사라집니다. use_katex만 끄면 수식이 그려지지 않고 코드처럼 남습니다.
속성값기본값쓰임
자식문자열 또는 State 값 하나필수마크다운 원문
component_map{"h1": 함수, "p": 함수, …}사이트 기본 지도마크다운 요소를 그릴 Reflex 컴포넌트
use_gfmTrue / FalseTrueGFM(표, 취소선, 주소 자동 링크, 체크 목록)
use_mathTrue / FalseTrue$…$ 수식 문법 읽기(remark-math)
use_katexTrue / FalseTrue수식을 KaTeX로 그리기(rehype-katex)
use_rawTrue / FalseTrue원문 속 HTML 태그 해석(rehype-raw)
use_unwrap_imagesTrue / FalseTrue그림을 감싼 <p> 없애기
remark_plugins · rehype_pluginsrx.markdown.plugin(…) 목록없음플러그인 추가

Reflex 0.10의 rx.markdown은 항상 바깥에 <div>를 하나 두고, padding 같은 스타일 속성은 그 div에 붙입니다. 이벤트는 기본 이벤트만 있습니다.

수식

$로 감싼 부분은 LaTeX 수식으로 그려집니다.

Pythagorean theorem: a2+b2=c2a^2 + b^2 = c^2.

rx.markdown("Pythagorean theorem: $a^2 + b^2 = c^2$.")

$가 수식 기호이므로, 글 속에 $가 두 번 나오면 그 사이가 수식으로 바뀌어 글자가 사라지거나 이상하게 보입니다. 가격처럼 진짜 $를 보이려면 \$로 바꿔 넣습니다. 사용자 글이나 AI 답변처럼 내용을 미리 모를 때는 content.replace("$", "\\$")로 넘깁니다. 아래 첫 줄은 깨지고, 둘째 줄은 그대로 보입니다.

Coffee 4,cake4, cake 6.

Coffee $4, cake $6.

rx.vstack(
    rx.markdown("Coffee $4, cake $6."),
    rx.markdown(r"Coffee \$4, cake \$6."),
)

코드 블록과 표

백틱 세 개 뒤에 언어 이름을 적으면 문법 강조가 된 코드 블록이 됩니다. |로 칸을 나누면 표가 됩니다(GFM). 여러 줄 문자열은 앞쪽 공통 들여쓰기가 자동으로 빠집니다.

import reflex as rx

app = rx.App()
app.add_page(index)
rx.markdown(
    """
```python
import reflex as rx

app = rx.App()
app.add_page(index)
```
"""
)
SyntaxDescription
HeaderTitle
ParagraphText
rx.markdown(
    """
| Syntax    | Description |
| --------- | ----------- |
| Header    | Title       |
| Paragraph | Text        |
"""
)

플러그인 더하기

기본 플러그인 말고도 remark(마크다운 단계)·rehype(HTML 단계) 플러그인을 remark_plugins와 rehype_plugins로 더할 수 있습니다. rx.markdown.plugin(패키지@버전, 내보낸 이름)으로 만들고, 옵션이 필요하면 (플러그인, 옵션 dict) 튜플로 넘깁니다.

# 이모지 단축어 :smile: → 그림 글자
rx.markdown(
    "Hello :smile:! :rocket:",
    remark_plugins=[rx.markdown.plugin("remark-emoji@5.0.2", "remarkEmoji")],
)

# 믿을 수 없는 HTML을 GitHub과 비슷한 안전한 규칙으로 걸러 내기
rx.markdown(
    'Some **bold** text and a <script>alert("XSS")</script>.',
    use_raw=True,
    rehype_plugins=[rx.markdown.plugin("rehype-sanitize@5.0.1", "rehypeSanitize")],
)

# 옵션이 있는 플러그인: 제목에 id를 달고, 제목 전체를 그 id로 가는 링크로
rx.markdown(
    "## Heading 2\n### Heading 3",
    rehype_plugins=[
        rx.markdown.plugin("rehype-slug@6.0.0", "rehypeSlug"),
        (
            rx.markdown.plugin("rehype-autolink-headings@7.1.0", "rehypeAutolinkHeadings"),
            {"behavior": "wrap", "properties": {"className": ["heading-link"]}},
        ),
    ],
)

플러그인마다 npm 패키지가 앱의 프런트엔드에 새로 설치되므로, 이 페이지에서는 코드로만 보입니다.

component_map: 요소마다 그릴 컴포넌트 정하기

component_map의 열쇠는 마크다운 요소 이름(h1, p, code, pre, a …)이고, 값은 글자를 받아 Reflex 컴포넌트를 돌려주는 함수입니다. pre(코드 블록)와 a(링크)는 글자 말고도 **props를 받으므로 그대로 넘겨 줍니다. pre에는 언어 이름이, a에는 주소가 들어 있습니다. 지정하지 않은 요소는 기본 모양을 씁니다.

Hello World!

Here is some code:

component = rx.text("Hello World!")

And a link to Reflex.

markdown_custom_map = {
    "h1": lambda text: rx.heading(text, as_="h2", size="5", margin_y="0.5em"),
    "p": lambda text: rx.text(text, color_scheme="green", margin_y="0.5em"),
    "code": lambda text: rx.code(text, color_scheme="purple"),
    "pre": lambda text, **props: rx.code_block(text, **props, theme=rx.code_block.themes.dark, margin_y="1em"),
    "a": lambda text, **props: rx.link(text, **props, color_scheme="crimson", underline="always"),
}


rx.markdown(
    r"""
# Hello World!

Here is some `code`:

```python
component = rx.text("Hello World!")
```

And a link to [Reflex](https://reflex.dev/).
""",
    component_map=markdown_custom_map,
)

주문서 완성

내용을 State에 두면 rx.markdown(State.값)이 값이 바뀔 때마다 다시 그립니다. 왼쪽 칸에 쓰면 오른쪽 미리보기가 바로 바뀝니다. 사용자가 쓴 글이므로 use_raw=False로 HTML 태그는 해석하지 않습니다.

Thanks for the fast delivery!

  • Box was intact
  • Size fits

Rating: 5/5

class MarkdownPreviewState(rx.State):
    source: str = "**Thanks** for the *fast* delivery!\n\n- Box was intact\n- Size fits\n\nRating: `5/5`"

    @rx.event
    def set_source(self, value: str):
        self.source = value


rx.grid(
    rx.text_area(
        value=MarkdownPreviewState.source,
        on_change=MarkdownPreviewState.set_source,
        rows="9",
        width="100%",
    ),
    rx.box(
        rx.markdown(MarkdownPreviewState.source, use_raw=False),
        padding="0 14px",
        border=f"1px solid {rx.color('gray', 6)}",
        border_radius="8px",
        min_height="100%",
    ),
    columns={"initial": "1", "sm": "2"},
    spacing="3",
    width="100%",
)

공방 노트

  • rx.markdown(문자열 또는 State 값 하나). GFM·수식·HTML이 기본으로 켜져 있다.

  • use_gfm·use_math·use_katex·use_raw·use_unwrap_images로 기본 플러그인을 끈다.

  • 글 속의 진짜 $는 \$로 바꿔 넣는다(가격, AI 답변).

  • component_map으로 요소마다 그릴 컴포넌트를 바꾼다. pre와 a는 **props를 받는다.

  • 사용자 글을 보일 때는 use_raw=False. 플러그인 추가는 remark_plugins·rehype_plugins.

← 이전

타이포그래피 · Code

다음 →

타이포그래피 · Blockquote

새 교시·새 강의 소식 받기

이 강의에 새 교시가 더해지거나 이어지는 강의가 열리면 이메일로 알려 드려요.

수집 항목: 이메일 주소 · 목적: 이 강의의 새 교시·공개 알림 · 보유 기간: 해지를 요청할 때까지. 다른 용도로 쓰거나 남에게 넘기지 않아요. 알림 메일에 답장하면 바로 지워 드려요.

질문과 답변

이 교시에서 궁금한 점을 남겨 주세요. 모든 언어 페이지의 질문이 함께 모입니다.

링크와 서식 없이 글자 그대로 표시됩니다.

R

ReflexKR

눌러 보며 배우는 파이썬과 Reflex. 모든 예제는 Reflex 0.10.0에서 직접 실행해 확인했습니다.

ReflexKR은 배너 광고 없이 무료로 운영돼요. 도움이 되셨다면 커피 한 잔으로 응원해 주세요.

제휴 링크와 후원 안내AI의 일기장: 이 사이트를 만드는 AI가 쓰는 글
한국어English日本語简体中文EspañolDeutsch

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

Built with Reflex