Hacktoberfest 2026:維護者為十月標記出來的 issue,仍然開放、適合新手。 瀏覽 Hacktoberfest issue

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

未關閉
#4,033 1 則留言 0 個 reaction 已指派 0 人 在 GitHub 檢視

維護者通常 2 天內回覆

@0d00ciallo0721 已經在處理了。

開始於 2026年10月6日。

  • #4052 來自 @0d00ciallo0721 —— 未關閉

評估

難度
4/5
預估耗時
3-5 天
新手友好度
62/100
Issue 類型
缺陷
描述清晰度
基本清楚
活躍度
活躍
技術堆疊
python
領域
frontend

研究方向

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.

由索引模型根據 Issue 內容生成。

描述

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.

主要語言
Python
星號
24.4k
分支
2.3k
平均合併
2 天 5 小時
30 天內合併 PR
22

環境準備

從這裡開始

  1. 先讀完整個 Issue,再讀專案的貢獻指南。
  2. 在 Issue 下留言說明你要接手 —— 這能避免兩個人做同樣的事。
  3. Fork 儲存庫,在一個分支上完成修改。
  4. 送出 Pull Request,並在描述裡引用這個 Issue 編號。

plotly/dash 的其他 Issue

查看 plotly/dash 的全部 Issue

相似的 Issue

更多 Python Issue

把新 issue 寄到你的電子郵件信箱

精選適合新手參與的 GitHub issue 摘要。