reflex-dev/reflex · error · ValueError

Markdown component must have exactly one child containing…

Error message

Markdown component must have exactly one child containing the markdown source.

What it means

rx.markdown() requires exactly one child — the markdown source — as either a Python string or a Var. Zero children, multiple children, or a non-string child (like a component) produce ValueError because the component compiles the source into react-markdown at build time.

Solutions

  1. Pass exactly one string: rx.markdown('# Hello')
  2. For dynamic content pass a single Var: rx.markdown(State.md_text)
  3. Join multiple blocks into one string: rx.markdown('\n\n'.join(blocks))

Example fix

# before
rx.markdown('# Title', rx.text('body'))
# after
rx.markdown('# Title\n\nbody')
Defensive patterns

Strategy: validation

Validate before calling

assert len(children) == 1 and isinstance(children[0], (str, Var))
rx.markdown(*children)

Prevention

When it happens

Trigger: rx.markdown() with no args, rx.markdown('# Hi', rx.text('extra')), or rx.markdown(rx.text('# Hi')).

Common situations: Forgetting the source string; trying to nest components inside markdown; passing a list of blocks instead of one joined string.

Related errors


AI-assisted analysis of reflex-dev/reflex@45b8ed5ab7 (2026-08-28). Data as JSON: /api/errors/4f9edbfd5ed1d294. Report an issue: GitHub.

Appendix: source

Thrown at packages/reflex-components-markdown/src/reflex_components_markdown/markdown.py:247

        cls,
        *children,
        **props,
    ) -> Component:
        """Create a markdown component.

        Args:
            *children: The children of the component.
            **props: The properties of the component.

        Returns:
            The markdown component.

        Raises:
            ValueError: If the children are not valid.
        """
        if len(children) != 1 or not isinstance(children[0], (str, Var)):
            msg = "Markdown component must have exactly one child containing the markdown source."
            raise ValueError(msg)

        # Update the base component map with the custom component map.
        component_map = {**get_base_component_map(), **props.pop("component_map", {})}

        # Get the markdown source.
        src = children[0]

        # Dedent the source.
        if isinstance(src, str):
            src = textwrap.dedent(src)

        # Create the component.
        return super().create(
            src,
            component_map=component_map,
            component_map_hash=cls._component_map_hash(component_map),
            **props,
        )

View on GitHub (pinned to 45b8ed5ab7)