Hacktoberfest 2026 : les issues que les mainteneurs ont marquées pour octobre, ouvertes et accessibles aux débutants. Parcourir les issues Hacktoberfest

[BUG] Setting children to None leaves removed components registered: their callbacks keep firing and the subtree can never be mounted again

Ouverte
#4,033 1 commentaire 0 réactions 0 personnes assignées Voir sur GitHub

Les mainteneurs répondent en général sous 2 jours

@0d00ciallo0721 y travaille déjà.

Depuis le 6/10/2026.

  • #4052 par @0d00ciallo0721 — ouverte

Évaluation

Difficulté
4/5
Temps estimé
3-5 jours
Accessibilité débutants
62/100
Type d'issue
Bug
Clarté
Plutôt claire
Activité
Active
Stack technique
python
Domaine
frontend

Piste de recherche

Start with the callback and component-removal path exercised by the toggle and update_view callbacks in the reproduction. Compare the lifecycle when children returns None with the working [] case, then verify that removed components stop generating requests and that mounting the view again restores it without a page reload.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Description

bug P3 size: 3

Summary: if a callback removes a subtree by returning children=None, the removed components stay registered: callbacks targeting them keep firing, and the subtree can never be rendered again. Returning [] works correctly.

Describe your context

dash                 4.4.1  (same on 4.5.0rc0, 4.0.0, 3.3.0, 2.18.2)
plotly               6.6.0
  • Python 3.10, Windows 11, Microsoft Edge 154 (Chromium)
  • Same with debug=True and debug=False, no error in the console or the dev tools

Describe the bug

from dash import Dash, Input, Output, ctx, dcc, html

app = Dash(__name__, suppress_callback_exceptions=True)

app.layout = html.Div([
    dcc.Interval(id="tick", interval=1000),
    html.Button("Mount", id="mount"),
    html.Button("Unmount", id="unmount"),
    html.Div(id="container"),
])


@app.callback(
    Output("container", "children"),
    Input("mount", "n_clicks"),
    Input("unmount", "n_clicks"),
    prevent_initial_call=True,
)
def toggle(_mount, _unmount):
    if ctx.triggered_id == "mount":
        return html.Div(id="view", children=html.Div(id="view-tick"))
    return None  # returning [] instead works as expected


@app.callback(Output("view-tick", "children"), Input("tick", "n_intervals"))
def update_view(n):
    print(f"update_view called, n_intervals={n}", flush=True)
    return f"tick {n}"


if __name__ == "__main__":
    app.run(debug=False)
  1. Click Mount: tick N is displayed, update_view runs every second. Correct.
  2. Click Unmount: the text disappears, but the browser keeps sending update_view requests every second (visible in the server log).
  3. Click Mount again: the toggle request returns the subtree (HTTP 200), but #view never appears in the DOM, until the page is reloaded.

With return [] in toggle, step 2 sends no request and step 3 displays the view again.

Expected behavior

None and [] should both remove the subtree: no more callbacks for the removed components, and the subtree can be mounted again.

Langage dominant
Python
Étoiles
24.4k
Forks
2.3k
Merge moyen
2 j 5 h
PR mergées (30 j)
22

Préparer son environnement

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Autres issues de plotly/dash

Toutes les issues de plotly/dash

Issues similaires

Plus d'issues Python

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.