Hacktoberfest 2026: as issues que os mantenedores marcaram para outubro, abertas e boas para iniciantes. Ver issues do Hacktoberfest

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

Aberta
#4,033 1 comentário 0 reações 0 responsáveis Ver no GitHub

Mantenedores costumam responder em até 2 dias

@0d00ciallo0721 já está trabalhando nisso.

Desde 6/10/2026.

  • #4052 de @0d00ciallo0721 — aberto

Avaliação

Dificuldade
4/5
Tempo estimado
3-5 dias
Facilidade para iniciantes
62/100
Tipo de issue
Bug
Clareza
Razoavelmente clara
Status de atividade
Ativa
Stack de tecnologia
python
Domínio
frontend

Direção de pesquisa

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.

Escrita pelo modelo de indexação a partir do texto da issue.

Descrição

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.

Linguagem predominante
Python
Estrelas
24.4k
Forks
2.3k
Merge médio
2d 14h
PRs com merge (30d)
23

Preparar o ambiente

Primeiros passos

  1. Leia a issue inteira e depois o guia de contribuição do projeto.
  2. Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
  3. Faça um fork do repositório e trabalhe em uma branch.
  4. Abra um pull request que referencie o número da issue.

Mais de plotly/dash

Todas as issues de plotly/dash

Issues semelhantes

Mais issues de Python

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.