Representing HTML 🚧#

Note

Under construction 🚧

We’ve already discussed how to construct HTML with ReactPy in a previous section, but we skimmed over the question of the data structure we use to represent it. Let’s reconsider the examples from before - on the top is some HTML and on the bottom is the corresponding code to create it in ReactPy:

<div>
    <h1>My Todo List</h1>
    <ul>
        <li>Build a cool new app</li>
        <li>Share it with the world!</li>
    </ul>
</div>
from reactpy import html

layout = html.div(
    html.h1("My Todo List"),
    html.ul(
        html.li("Build a cool new app"),
        html.li("Share it with the world!"),
    )
)

Since we’ve captured our HTML into out the layout variable, we can inspect what it contains. And, as it turns out, it holds a dictionary. Printing it produces the following output:

assert layout == {
    'tagName': 'div',
    'children': [
        {
            'tagName': 'h1',
            'children': ['My Todo List']
        },
        {
            'tagName': 'ul',
            'children': [
                {'tagName': 'li', 'children': ['Build a cool new app']},
                {'tagName': 'li', 'children': ['Share it with the world!']}
            ]
        }
    ]
}

This may look complicated, but let’s take a moment to consider what’s going on here. We have a series of nested dictionaries that, in some way, represents the HTML structure given above. If we look at their contents we should see a common form. Each has a tagName key which contains, as the name would suggest, the tag name of an HTML element. Then within the children key is a list that either contains strings or other dictionaries that represent HTML elements.

What we’re seeing here is called a “virtual document object model” or VDOM. This is just a fancy way of saying we have a representation of the document object model or DOM that is not the actual DOM.