如何让Dash应用的评论区展示所有历史提交的评论?
解决Dash评论区无法保存历史评论的问题
你的问题核心在于Dash回调默认是无状态的,每次提交只会返回最新评论,没有留存历史记录。要实现历史评论累加展示,需要借助dcc.Store组件存储评论列表,每次提交时把新评论追加进去,再渲染所有历史评论。
修改后的完整代码如下:
import dash from dash import html, dcc, Input, Output, State, callback app = dash.Dash(__name__) layout = html.Div([ html.H3(children='Write Comments'), dcc.Textarea( id='textarea', value='', style={'width': '100%', 'height': 200}, ), html.Button('Submit', id='button', n_clicks=0), # 添加dcc.Store存储历史评论,storage_type可选memory/session/local dcc.Store(id='comments-store', data=[]), html.Div(id='comment-output', style={'whiteSpace': 'pre-line', 'marginTop': '20px'}) ]) @callback( # 同时更新存储的评论数据和输出区域 [Output('comments-store', 'data'), Output('comment-output', 'children')], Input('button', 'n_clicks'), # 获取输入框内容和已存储的评论列表 State('textarea', 'value'), State('comments-store', 'data'), prevent_initial_call=True # 防止页面加载时触发回调 ) def update_comments(n_clicks, new_comment, comments_list): # 过滤空评论 if new_comment.strip(): comments_list.append(new_comment) # 把所有评论转换成带格式的html元素,每条评论加序号和分隔线 rendered_comments = [] for idx, comment in enumerate(comments_list, 1): rendered_comments.append(html.Div([ html.Strong(f'Comment {idx}:'), html.P(comment), html.Hr() ])) # 返回更新后的评论列表和渲染内容 return comments_list, rendered_comments if __name__ == '__main__': app.run_server(debug=True)
关键修改说明:
- 新增
dcc.Store:用来持久化保存评论列表,storage_type设为memory时页面刷新会清空记录,设为local则会保存在浏览器本地,下次打开仍能看到历史评论。 - 回调多输出:同时更新存储的评论数据和输出区域,确保每次提交后历史记录被留存。
- 评论格式化渲染:将每条评论包装成带序号、分隔线的HTML元素,提升可读性,样式可根据需求自定义调整。
- 禁止初始触发:用
prevent_initial_call=True避免页面刚加载时就执行回调。
修改后,每次提交新评论都会追加到历史列表中,输出区域会展示所有已提交的评论内容。
内容的提问来源于stack exchange,提问作者new_R
相关产品推荐
相关产品推荐

