Home Features Philosophy Docs Blog Errors Security Examples FAQ
DJE-053 Warning Template

Event produced no DOM changes — state outside VDOM root

Error message

Event produced no DOM changes — state may be outside dj-root

An event handler modified state that is rendered outside the <div dj-root> boundary (e.g., in base.html while the VDOM root is in a child template). The VDOM diff found zero differences because it only sees content inside the root. Previously this caused the full HTML fallback to mangle the page; now it is handled gracefully as a no-op.

liveview silent-failure template vdom

Affected versions: >=0.2.0

Solutions

Before (problematic)
@event_handler
def open_panel(self, **kwargs):
    self.show_panel = True  # Rendered in base.html, outside VDOM root
    # VDOM diff sees 0 changes — panel never opens!
After (fixed)
@event_handler
def open_panel(self, **kwargs):
    self.push_event("toggle_panel", {"show": True})
    self._skip_render = True

# In base.html:
# window.addEventListener("djust:push_event", (e) => {
#     if (e.detail.event === "toggle_panel") {
#         document.getElementById("panel").hidden = !e.detail.payload.show;
#     }
# });

Before (problematic)
<!-- base.html (outside VDOM root) -->
{% if show_panel %}
<div id="panel">...</div>
{% endif %}

<!-- child.html (inside VDOM root) -->
<div dj-root>...</div>
After (fixed)
<!-- child.html (everything inside VDOM root) -->
<div dj-root>
    {% if show_panel %}
    <div id="panel">...</div>
    {% endif %}
    <!-- rest of content -->
</div>