本文示例代碼已上傳至我的
Github
倉庫https://github.com/CNFeffery/dash-master
大家好我是費老師,就在昨晚,Dash
框架發佈了其2.14.0新版本,新增的功能中,有一項非常令人興奮,那就是其針對回調函數這一Dash
中的核心概念,新增了動態回調函數註冊的支持🥳,下面我將對此做詳細介紹:
在過去的Dash
回調編寫中,有一條準則,即應用中所有的回調函數必須在應用啓動之前被定義:
舉一個簡單的例子,下面這個示例應用中定義了通過按鈕點擊,進行文字內容更新的回調函數邏輯,當用戶在瀏覽器中訪問該應用時,會在初始化時自動通過/_dash-dependencies
接口獲取到當前應用中所有已明確定義的回調函數編排信息:
而從Dash
2.14.0版本開始,爲callback()
新增了參數_allow_dynamic_callbacks
,針對設置了該參數爲True
的回調函數,我們可以在該回調函數內部定義回調函數,這些回調函數將會被動態的註冊並生效。
舉個示意性的例子,在下面的例子中,我們在按鈕被點擊後,向指定容器更新由一個輸入框和文本組成的子元素,並且利用隨機生成的uuid
爲它們構造id和回調函數,在爲父級callback()
設置_allow_dynamic_callbacks=True
之後,即可實現這樣的動態回調註冊,從下面截圖中抓包的網絡請求過程可以看到,隨回調觸發而動態註冊的回調,以異步的形式自動通過/_dash-dependencies
接口更新到用戶瀏覽器的回調編排規則中:
import uuid
import dash
from dash import html
import feffery_antd_components as fac
from dash.dependencies import Input, Output
app = dash.Dash(__name__, suppress_callback_exceptions=True)
app.layout = html.Div(
[
fac.AntdSpace(
[
fac.AntdButton(
'點我',
id='button-demo',
type='primary'
),
html.Div(
id='button-demo-output'
)
],
direction='vertical'
)
],
style={
'padding': 50
}
)
@app.callback(
Output('button-demo-output', 'children'),
Input('button-demo', 'nClicks'),
prevent_initial_call=True,
_allow_dynamic_callbacks=True
)
def demo_callback(nClicks):
new_uuid = str(uuid.uuid4())
@app.callback(
Output(f'demo-input-output-{new_uuid}', 'children'),
Input(f'demo-input-{new_uuid}', 'value')
)
def dynamic_demo_callback(value):
return f'已輸入內容:{value}'
return fac.AntdSpace(
[
fac.AntdInput(
id=f'demo-input-{new_uuid}',
placeholder='請輸入'
),
fac.AntdText(
id=f'demo-input-output-{new_uuid}'
)
]
)
if __name__ == '__main__':
app.run(debug=True)
且只要動態回調函數的構建過程在相應父級回調函數內部執行即可,譬如下面的寫法與上面效果等價,這意味着我們可以以更自由更高效的方式構建功能持續增長的大型平臺應用:
要注意的是,該特性目前處於實驗階段,大家在測試過程中有遇到問題歡迎到https://github.com/plotly/dash/issues
反饋。
以上就是本文的全部內容,對Dash
應用開發感興趣的朋友,歡迎添加微信號CNFeffery
,備註“dash學習”加入我的技術交流羣,一起成長一起進步。