核心概念
Dash 回调函数是响应组件状态变化的动态函数,通过装饰器绑定输入输出组件。其本质类似快递通知服务:当包裹状态变化(输入组件更新),系统会自动触发通知(执行回调函数),最终将最新状态传递给指定接收方(输出组件)。
基础语法
最简回调绑定
@dash.callback(
Output('output-div', 'children'),
Input('input-button', 'n_clicks')
)
def update_text(n_clicks): # 根据按钮点击次数更新文本
return f'按钮被点击了{n_clicks}次' # 返回更新内容
多输入输出组合
@dash.callback(
[Output('result-output', 'children'), Output('log-output', 'children')],
[Input('name-input', 'value'), Input('age-input', 'value')]
)
def process_form(name, age): # 同时处理多个输入
# 验证年龄输入
if age and int(age) > 100:
return f'姓名:{name}', '年龄异常' # 返回多个输出
return f'姓名:{name}', f'年龄:{age}' # 正常输出
进阶特性
| 特性 | 描述 | 代码示例 |
|---|---|---|
| 状态保持 | 通过State对象读取组件状态而不触发回调 |
@dash.callback(..., State('counter-store', 'data')) |
| 装饰器参数 | 控制回调触发条件 | @dash.callback(..., prevent_initial_call=True) |
| 依赖关系 | 多输入组合触发逻辑 | @dash.callback(..., [Input('a', 'value'), Input('b', 'value')]) |
实战应用
动态数据过滤器
@dash.callback(
Output('table-output', 'children'),
[Input('filter-input', 'value'), Input('sort-dropdown', 'value')],
[State('original-data', 'data')]
)
def filter_data(filter_text, sort_by, full_data): # 多条件过滤数据
df = pd.DataFrame(full_data) # 将原始数据转为DataFrame
filtered_df = df[df['name'].str.contains(filter_text)] # 过滤操作
sorted_df = filtered_df.sort_values(by=sort_by) # 排序操作
return dash_table.DataTable(sorted_df.to_dict('records')) # 返回表格
实时图表更新
@dash.callback(
Output('line-plot', 'figure'),
Input('update-interval', 'n_intervals'),
State('stock-symbol', 'value')
)
def update_chart(n, symbol): # 每秒更新一次股票数据
new_data = fetch_realtime_data(symbol) # 获取实时数据
fig = px.line(new_data, x='timestamp', y='price') # 生成折线图
return fig # 返回更新后的图表
注意事项
- 类型不匹配:输入输出组件类型必须严格对应(如
Input对应value属性) - 回调嵌套:避免超过3层嵌套回调,改用
dash.callback_context控制流程 - 性能瓶颈:大数据处理时应使用
@dash.callback的memoize参数优化性能 - 错误处理:添加
raise PreventUpdate()防止无效回调,避免内存泄漏
总结
掌握 Dash 回调函数的核心机制,能构建动态交互式 Web 应用,建议通过状态保持和装饰器参数突破基础限制,最终实现复杂场景的优雅处理。